BSRR寄存器是端口位设置/清除寄存器. 此寄存器和ODR寄存器有类似的功能, 都可以来用设置GPIO端口输出.此寄存器分为高16位和低16位, 向高16位的某位写1清除对应ODR寄存器位(输出0), 写0无影响. 向低16位某位写1置位对应ODR寄存器位(输出1), 写0无影响.
可见两个寄存器均可以控制IO输出, 从上文可知写BSRR实际上是可以影响ODR寄存器的值的, 那么使用这两个寄存器控制输出有什么区别呢?
在ST的手册中有这样的说明(RM0090 266页):
Each I/O port bit is freely programmable, however the I/O port registers have to accessed as 32-bit words, half-words or bytes. The purpose of the GPIOx_BSRR register is to allow atomic read/modify accesses to any of the GPIO registers. In this way, There is no risk of an IRQ occurring between the read and the modify access.
每个I/O端口位都可以自由编程, 然而I/O端口寄存器心須以32位字, 半字或者字节来访问, GPIOx_BSRR对任何端口寄存器的读/写访问均具有原子性. 以这种方式, 在读/写访问是发生中断并不会发生危险.
注:在STM32F1系列的手册中, I/O寄存器是只允许以32位字的方式访问, 半字和字节访问是不允许的.但在F4系列的手册中如上文,却并没有写不允许以半字或者字节的方式访问.
所以对IO的输出操作还是经过BSRR寄存器操作比较好.
在ST提供的固件库中提供了两个函数用来操作某一个IO: