你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【nucleo板开发日志】ST标准外设库是如何把数据写入寄存器

[复制链接]
平淡~简单 发布时间:2014-9-26 12:11
nucleo开发板接到手好久了,就简单体验了一下mbed开发环境,的确很好玩。但是也没有仔细的研究,以前对STM32的标准外设库做了一点研究,这次贴上来,给新手做一些参考。就当是我的开发日志了,忙过这一段好好的,研究一下mbed的开发。(顺便提一下,忙着考研复习,所以可能得三个月不能玩STM32了)。废话不多说,上干货。
) C+ P! r; \8 H$ Q7 h% a9 _主要讲解一下,他的标准外设库是如何进行操作,把我们设置的一些参数,写入对应的寄存器地址当中。( ^7 g. A- Q/ I  i
这里以void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)函数为例:这个函数的第一个参数是STM32的端口值,第二个参数是端口的引脚。也就是把对应的端口引脚的位置1
; |0 r$ l0 U. E0 H; f% `7 W# i第一个参数是一个结构体类型,用keil的定位查找功能可以找到宏定义#define GPIOF   ((GPIO_TypeDef *)  GPIOF_BASE),这句代码把GPIOF_BASE强制转换成了一个结构体,而这个结构体GPIO_TypeDef里面的参数,就是端口的寄存器。如下图所示 1.png ) Z* c0 }" g3 z
通过查找技术参考手册,这些变量的命名和寄存器的名字是一样的,方便使用。其中不可操作的位,被定义成保留的位。" ?: e. D( C/ Q5 K
在STM32F30x.h里面可以找到下面的一些宏定义,
  S' {# A% q8 \+ x- \/ Z#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)
* d) G$ W7 w" E& z' W* B# i! I. u! W#define GPIOB               ((GPIO_TypeDef *) GPIOB_BASE)3 L$ X& p$ n3 I" F3 ]
#define GPIOC               ((GPIO_TypeDef *) GPIOC_BASE)
/ Q6 |" ~/ n- s! J  Q7 o& q#define GPIOD               ((GPIO_TypeDef *) GPIOD_BASE)
3 F2 P# D* h6 @9 G6 @, b; X#define GPIOE               ((GPIO_TypeDef *) GPIOE_BASE)" v) |  G; ^5 Y
#define GPIOF               ((GPIO_TypeDef *) GPIOF_BASE)3 {; }% W5 J, b# U4 q
在这里它强制把GPIOx_BASE转换成了GPIO_TypeDef结构体的形式。 然后查找GPIOx_BASE可以看到。
% \4 @" Z$ q' h/*!< AHB2 peripherals */
  z. I- i% J* B) L8 z( m- q#define GPIOA_BASE            (AHB2PERIPH_BASE + 0x0000)
8 n# R* d2 b3 h7 |#define GPIOB_BASE            (AHB2PERIPH_BASE + 0x0400)
, \6 D* D7 u3 q7 Y#define GPIOC_BASE            (AHB2PERIPH_BASE + 0x0800)3 \1 D, d: g% Y; ~! I
#define GPIOD_BASE            (AHB2PERIPH_BASE + 0x0C00)
9 n2 `" H( E0 U5 s, e4 m#define GPIOE_BASE            (AHB2PERIPH_BASE + 0x1000)5 S8 V7 g1 L& L  r  a4 U
#define GPIOF_BASE            (AHB2PERIPH_BASE + 0x1400)
% Y! n2 z6 Q( X' ]% Y$ t# D根据不同的型号的,他们的定义稍有不同,不过都类似,这里GPIO是挂在AHB2总线上的。
, r& u! A/ m4 E% u' }. l+ o* `0 V继续查找AHB2PERIPH_BASE可知- N, Z" \* ^) n0 _. C2 B
 #define AHB2PERIPH_BASE       (PERIPH_BASE + 0x08000000)
$ Z/ [8 t- \" m: C, |) ^) X' z, l#define PERIPH_BASE           ((uint32_t)0x40000000)7 m$ e. [1 ]! ]3 ]) k
通过计算可以得到, p. K* k" I. ?1 v% q4 B
GPIOA_BASE=0x40000000 + 0x08000000 + 0x0000=0x48000000/ {& U0 O+ M% u* K2 m' j
通过查找数据手册,如下图所示$ O  X5 Q; B, E3 c
2.png
) E/ p8 e, E9 P' v可以知道就是GPIOA的寄存器基地址,其它也都和这个一样。在最上面把这个基地址强制转换成了GPIO的结构体类型的地址,这样就可以通过操作结构体里面的成员,把数据写入对应的寄存器。
, D1 k& X& W' b! @! ?. f7 L" w% z再说一个小的知识点,对堆栈的设置,在启动函数里面如下图所示:
% `1 P0 c. W0 n! @+ ]+ K0 | 3.png
( R: i% h  `7 X  z8 f+ @在这地方限制了堆stack的大小为0x400,栈的大小Heap的为0x200,如果你要在子函数中开辟较大的空间或者需要较大的数组时,相应的需要扩大这两个值。
8 O% L9 }: R0 P# ~+ u- h% M+ \3 K好了,就写这么多吧,希望对于新手能够有帮助。
) r$ q& ]- l6 ]: j) a以后有机会要多参加ST社区的活动。再次支持一下ST社区,刚才看到M7出来了,很期待,希望ST有更好的芯片出来。
4 a! R9 z, r' Z& `5 L; P 
收藏 评论1 发布时间:2014-9-26 12:11

举报

1个回答
沐紫 回答时间:2014-9-26 13:10:08

RE:【nucleo板开发日志】ST标准外设库是如何把数据写入寄存器

灰常谢谢楼主的支持~

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版