STM32的寄存器操作
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STM32的寄存器操作和C51的操作有很大的不同。
要操作STM32可以通过库函数操作,也可直接操作寄存器。
下面分析一下寄存器的操作,以控制PE4脚输出高低电平为例:
首先找到GPIOE的寄存器基地址,如下图:(STM32F4xx中文参考手册.pdf)
找到GPIOE的基地址为:0x4002 1000
我们要操作PE4脚,首先找到BSRR位操作寄存器,如下图
BSRR寄存器偏移地址为:0x18
由于我我们要操作PE4,即操作BSRR寄存器的第4位。
下面编写代码:
首先定义一个指向uint32_t型的指针,之后将该指针指向BSRR寄存器地址:
0x4002 1018 = 0x4002 1000 + 0x0000 00018
此时要操作BSRR寄存器,直接向*p赋值就可以了,如下图:
该代码即可实现PE4脚的高低电平输出。
假如不加延时,如下图:
系统也可正常运行,但在这两行处打断点调试,会发现无法进入,分析原因是两行代码中间无延时,实际运行时几乎可以忽略该代码的操作,所以编译器在编译时自动优化了,此时我们只需要在声明变量的时候为其指明__IO类型变量(volatile)即可,如下图:
上面的例子从最基本的寄存器分析操作STM32的,下面来分析下官方库函数是如何操作寄存器的。
首先定义GPIO寄存器组,通过结构体将寄存器组封包,如下图:
由于以上寄存器地址是连续的,所以可以分在一个结构体中
然后定义GPIOE寄存器组
这里的GPIOE_BASE为GPIOE寄存器的基地址:0x4002 1000
定义了GPIO_TypeDef类型指针GPIOE,并指向了GPIOE寄存器的基地址。此时我们要操作PE4脚状态只需要操作GPIOE->BSRR就可以了,
其它寄存器的操作参考上面的分析即可实现。