采用模块化方式操作寄存器
控制引脚的电平状态有三种方法——即控制BSRR、BRR、ODR寄存器
寄存器的区别:
1、数据处理的区别
使用ODR需要考虑不影响其他管脚的电平状态,因此在书写代码的时候需要加上或运算,例如:
GPIOB->ODR |= 0X01 ; // 代码是一行, 但背后的运行是很多步:读取->或运算->写入
GPIOB->ODR &= ~(0X01<<11) ; // 同样是:读取->或运算->写入
而使用BSRR寄存器时,则直接使用:
GPIOB->BSRR = 0X01 ; // 某个位直接置1,OK, 搞掂了。其它没置1的位不产生变化
GPIOB->BSRR = 0X01<<11; // 同上
2、BSRR操作,不用关闭中断
什么意思呢?就是你用BSRR和BRR去改变管脚状态的时候,没有被中断打断的风险。也就不需要关闭中断。
以端口位设置/清除寄存器(GPIOx_BSRR)(x=A..E)为例
BSRR寄存器只能以字(16位)的形式操作,即一次操作16位数据。因此将BSRR寄存器分为高16位和低16位,只能以16位形式操作。高16位用于置0,低16位用于置1。BR置1则IO低电平,BS置1则IO口高电平,置0的话IO不反应。
1字(word)=2字节(byte),1字节(byte)=8位(bit),1字(word)=16位(bit)
BR:R为reset;BS:s为set
端口位清除寄存器(GTPIOx_BRR)(x =A…E)
BRR寄存器同样只能用字(16位)的形式操作,高16位为保留地址,因此能设置的只有BR——设置GPIO的低电平,考虑到用BSRR设置高16位比较麻烦,因此我们可以使用BSRR寄存器低16位设置IO的高电平,用BRR寄存器设置IO口的低电平。
端口输出数据寄存器(GPIOx_ODR)(x = A…E)
ODR寄存器同样也只能以字的形式操作数据,且它的低16位都是可读可写的。
BSRR、BRR、 ODR 之间的关系:
- 配置 BSRR , BRR 是为了对端口输出进行配置,而 ODR 寄存器也是用于输出数据的寄存器,一个 ODR 寄存器控制了一组(16位)的 GPIO 输出。因此,对 ODR 进行修改也可以到达对 IO 口输出进行配置。
- 由于对 ODR 寄存器的读写操作必须以 16 位的形式进行。因此,如果使用 ODR 改写数据以控制输出时,须采用“读-改-写”的形式进行。
- BRR、BSRR都可以做到假如只想改变位0的值,则不论其他位为何值,用一个等号就可以完成。
- 而ODR改变时则是全部改变。
- 比如16位本来为1010101010101010,经过GPIOx->BSRR=0x01后变为1010101010101011,而经过GPIOx->ODR=0x01后变为0000000000000001。