(stm32f4) GPIOx_BSRR 对比 GPIOx_ODR

(stm32f4) GPIOx_BSRR vs GPIOx_ODR

我正在学习stm32f4。

为什么GPIO端口位set/reset寄存器(GPIOx_BSRR)还存在,而GPIO端口输出数据寄存器(GPIOx_ODR)还在?

主要原因是对 GPIO 进行原子访问。

ODR寄存器的情况下,如果你只想改变一位那么你需要使用非原子的读 - 修改 - 写方法,如果你想控制一些GPIO,它很慢而且不安全来自不同的线程或来自中断处理程序,然后可能会发生竞争条件。

BSRR 寄存器的使用是原子的,这有一些优势,您可以使用单次写入设置或清除某些输出,而无需在写入前读取和修改。它更快并且是线程安全的。

使用 BSRR 的缺点仅在于您只想切换一位而不知道特定位的实际状态。 (为了保持原子性,你需要记住实际值)