5.5.1.3. 外设寄存器¶
在XX外设的地址范围内,分布着的就是该外设的寄存器。以GPIO外设为例,GPIO是通用输入输出端口的简称,简单来说就是STM32可控制的引脚,基本功能是控制引脚输出高电平或者低电平。最简单的应用就是把GPIO的引脚连接到LED灯的阴极,LED灯的阳极接电源,然后通过STM32控制该引脚的电平,从而实现控制LED灯的亮灭。
GPIO有很多个寄存器,每一个都有特定的功能。每个寄存器为32bit,占四个字节,在该外设的基地址上按照顺序排列,寄存器的位置都以相对该外设基地址的偏移地址来描述。这里我们以GPIOB端口为例,来说明GPIO都有哪些寄存器,具体见表格
5‑7。
表格 5‑7 GPIOB端口的 寄存器地址列表
寄存器名称
寄存器地址
相对GPIOB基址的偏移
GPIOB_CRL
0x4001 0C00
0x00
GPIOB_CRH
0x4001 0C04
0x04
GPIOB_IDR
0x4001 0C08
0x08
GPIOB_ODR
0x4001 0C0C
0x0C
GPIOH_BSRR
0x4001 0C10
0x10
GPIOH_BRR
0x4001 0C14
0x14
GPIOH_LCKR
0x4001 0C18
0x18
有关外设的寄存器说明可参考《STM32F10xx参考手册》中具体章节的寄存器描述部分,在编程的时候我们需要反复的查阅外设的寄存器说明。
这里我们以“GPIO端口置位/复位寄存器”为例,教大家如何理解寄存器的说明,具体见图
5‑6。
图 5‑6 GPIO端口置位/复位寄存器说明
①名称
寄存器说明中首先列出了该寄存器中的名称,“(GPIOx_BSRR)(x=A…E)”这段的意思是该寄存器名为“GPIOx_BSRR”其中的“x”可以为A-E,也就是说这个寄存器说明适用于GPIOA、GPIOB至GPIOE,这些GPIO端口都有这样的一个寄存器。
②偏移地址
偏移地址是指本寄存器相对于这个外设的基地址的偏移。本寄存器的偏移地址是0x10,从参考手册中我们可以查到GPIOA外设的基地址为0x4001
0800 ,我们就可以算出GPIOA的这个GPIOA_BSRR寄存器的地址为:0x4001
0800+0x10 ;同理,由于GPIOB的外设基地址为0x4001
0C00,可算出GPIOB_BSRR寄存器的地址为:0x4001 0C00+0x10
。其他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:不会对相应的ODRy位执行任何操作;1:对相应ODRy位进行复位”。
这里的“复位”是将该位设置为0的意思,而“置位”表示将该位设置为1;说明中的ODRy是另一个寄存器的寄存器位,我们只需要知道ODRy位为1的时候,对应的引脚y输出高电平,
为0的时候对应的引脚输出低电平即可(感兴趣的读者可以查询该寄存器GPIOx_ODR的说明了解)。
所以,如果对BR0写入“1”的话,那么GPIOx的第0个引脚就会输出“低电平”,但是对BR0写入“0”的话,却不会影响ODR0位,所以引脚电平不会改变。
要想该引脚输出“高电平”,就需要对“BS0”位写入“1”,寄存器位BSy与BRy是相反的操作。