2024年7月18日 发布于博客园, 本文涉及到STM32F4XX和STM32F1XX系列
目录
- 外设寄存器查找
- ① 名称
- ② 偏移地址
- ③ 寄存器位表
- ④ 位功能说明
- 寄存器基本操作
- C语言的置位和清零
- 设置GPIO流程
- 给寄存器赋值
- 带参数宏
- STM32F1xx
- 芯片识别
- 存储器映射
- 寄存器映射
- 让GPIOB端口的16个引脚输出高电平,要怎么实现?
- STM32寄存器映射
- C语言对寄存器的封装
- 新建寄存器(REG)模板
外设寄存器查找
见
在XX 外设的地址范围内,分布着的就是该外设的寄存器。以GPIO 外设为例,GPIO 是通用输入输出端口的简称,简单来说就是STM32 可控制的引脚,基本功能是控制引脚输出高电平或者低电平。最简单的应用就是把GPIO 的引脚连接到LED 灯的阴极,LED 灯的阳极接电源,然后通过STM32 控制该引脚的电平,从而实现控制LED 灯的亮灭。
GPIO 有很多个寄存器,每一个都有特定的功能。每个寄存器为32bit,占四个字节,在该外设的基地址上按照顺序排列,寄存器的位置都以相对该外设基地址的偏移地址来描述。
① 名称
寄存器说明中首先列出了该寄存器中的名称,“(GPIOx_BSRR)(x=A⋯I)”这段的意思是该寄存器名为“GPIOx_BSRR”其中的“x”可以为A-I,也就是说这个寄存器说明适用于GPIOA、GPIOB 至GPIOI,这些GPIO 端口都有这样的一个寄存器。
② 偏移地址
偏移地址是指本寄存器相对于这个外设的基地址的偏移。本寄存器的偏移地址是0x18,从参考手册中我们可以查到GPIOA 外设的基地址为0x4002 0000 ,我们就可以算出GPIOA 的这个GPIOA_BSRR 寄存器的地址为:0x4002 0000+0x18;同理,由于GPIOB 的外设基地址
为0x4002 0400,可算出GPIOB_BSRR 寄存器的地址为:0x4002 0400+0x18 。其他GPIO 端口以此类推即可。
③ 寄存器位表
紧接着的是本寄存器的位表,表中列出它的0-31 位的名称及权限。表上方的数字为位编号,中间为位名称,最下方为读写权限,其中w 表示只写,r 表示只读,rw 表示可读写。本寄存器中的位权限都是w,所以只能写,如果读本寄存器,是无法保证读取到它真正内容的。而有的寄存器位只读,一般是用于表示STM32 外设的某种工作状态的,由STM32 硬件自动更改,程序通过读取那些寄存器位来判断外设的工作状态。
④ 位功能说明
位功能是寄存器说明中最重要的部分,它详细介绍了寄存器每一个位的功能。例如本寄存器中有两种寄存器位,分别为BRy 及BSy,其中的y 数值可以是0-15,这里的0-15 表示端口的引脚号,如BR0、BS0 用于控制GPIOx 的第0 个引脚,若x 表示GPIOA,那就是控制GPIOA 的第0 引脚,而BR1、BS1 就是控制GPIOA 第1 个引脚。
其中BRy 引脚的说明是“0:不会对相应的ODRx 位执行任何操作;1:对相应ODRx 位进行复位”。
这里的“复位”是将该位设置为0 的意思,而“置位”表示将该位设置为1;说明中的ODRx 是另一个寄存器的寄存器位,我们只需要知道ODRx 位为1 的时候,对应的引脚x 输出高电平,为0 的时候对应的引脚输出低电平即可(感兴趣的读者可以查询该寄存器GPIOx_ODR 的说明了解)。所以,如果对BR0 写入“1”的话,那么GPIOx 的第0 个引脚就会输出“低电平”,但是对BR0 写入“0”的话,却不会影响ODR0 位,所以引脚电平不会改变。要想该引脚输出“高电平”,就需要对“BS0”位写入“1”,寄存器位BSy 与BRy 是相反的操作。
具体查对应的手册和系统库函数的封装, 注意, 要看数据手册, 查找对应的资源才能知道具体的位置. 重点是掌握方法.
寄存器基本操作
C语言的置位和清零
若直接赋值0或1, 会将所有位都变为0或1
例如:*(unsigned int*)(0x40010C0C)=1; 或 *(unsigned int*)(0x40010C0C)=0;
任何数&1,值不变 任何数&0,均为0
故而只对目标位操作具体方法
[code]/*对某寄存器某些位清零*/ // 配置IO口为输出 GPIOB_CRL &= ~( (0x0f) |