
nucleo开发板接到手好久了,就简单体验了一下mbed开发环境,的确很好玩。但是也没有仔细的研究,以前对STM32的标准外设库做了一点研究,这次贴上来,给新手做一些参考。就当是我的开发日志了,忙过这一段好好的,研究一下mbed的开发。(顺便提一下,忙着考研复习,所以可能得三个月不能玩STM32了)。废话不多说,上干货。 主要讲解一下,他的标准外设库是如何进行操作,把我们设置的一些参数,写入对应的寄存器地址当中。 这里以void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)函数为例:这个函数的第一个参数是STM32的端口值,第二个参数是端口的引脚。也就是把对应的端口引脚的位置1。" C3 ~) p/ r, N" V! O" u 第一个参数是一个结构体类型,用keil的定位查找功能可以找到宏定义#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE),这句代码把GPIOF_BASE强制转换成了一个结构体,而这个结构体GPIO_TypeDef里面的参数,就是端口的寄存器。如下图所示: ![]() 通过查找技术参考手册,这些变量的命名和寄存器的名字是一样的,方便使用。其中不可操作的位,被定义成保留的位。4 ~, {, ^: a% A) U9 Q 在STM32F30x.h里面可以找到下面的一些宏定义, #define GPIOA ((GPIO_TypeDef *) GPIOA_BASE): C4 v0 w2 T/ V, W #define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) #define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)& l. S$ O6 y3 H! ` #define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)/ n9 x/ Y3 d6 ~& {& n #define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) #define GPIOF ((GPIO_TypeDef *) GPIOF_BASE)3 b0 }' |4 o& a# X% |8 l0 F$ X& { 在这里它强制把GPIOx_BASE转换成了GPIO_TypeDef结构体的形式。 然后查找GPIOx_BASE可以看到。 /*!< AHB2 peripherals */4 w# U2 Q- @3 k' a: {! `% P- E #define GPIOA_BASE (AHB2PERIPH_BASE + 0x0000): ?4 G2 `; t3 G7 ~8 ^# R, M #define GPIOB_BASE (AHB2PERIPH_BASE + 0x0400)& _1 E5 z" v5 V* F; P8 h- n- W #define GPIOC_BASE (AHB2PERIPH_BASE + 0x0800) #define GPIOD_BASE (AHB2PERIPH_BASE + 0x0C00) #define GPIOE_BASE (AHB2PERIPH_BASE + 0x1000) #define GPIOF_BASE (AHB2PERIPH_BASE + 0x1400) 根据不同的型号的,他们的定义稍有不同,不过都类似,这里GPIO是挂在AHB2总线上的。* x2 ~4 @! K& w# ] 继续查找AHB2PERIPH_BASE可知" [* M, B. Z# S" s- U- V #define AHB2PERIPH_BASE (PERIPH_BASE + 0x08000000) #define PERIPH_BASE ((uint32_t)0x40000000): L9 o- h; X' p9 O7 y 通过计算可以得到 GPIOA_BASE=0x40000000 + 0x08000000 + 0x0000=0x48000000 通过查找数据手册,如下图所示8 V: ]. Q+ J* z+ A3 H, S) s: F ![]() 可以知道就是GPIOA的寄存器基地址,其它也都和这个一样。在最上面把这个基地址强制转换成了GPIO的结构体类型的地址,这样就可以通过操作结构体里面的成员,把数据写入对应的寄存器。! m2 j. N7 h- c+ E2 ~% Z. Z7 v+ h 再说一个小的知识点,对堆栈的设置,在启动函数里面如下图所示: ![]() 在这地方限制了堆stack的大小为0x400,栈的大小Heap的为0x200,如果你要在子函数中开辟较大的空间或者需要较大的数组时,相应的需要扩大这两个值。 好了,就写这么多吧,希望对于新手能够有帮助。 以后有机会要多参加ST社区的活动。再次支持一下ST社区,刚才看到M7出来了,很期待,希望ST有更好的芯片出来。2 L) G3 t6 h0 |/ p2 _) r |
RE:【nucleo板开发日志】ST标准外设库是如何把数据写入寄存器