ODR,BRR,BSRR用法理解


GPIO 有 3个 管脚控制寄存器:

  1. ODR寄存器,   控制管脚的高/低电平,  只有低16位, 置1 为高电平,  置0 为低电平;
  2. BSRR寄存器, 控制管脚的高/低电平, 低16位:写入1 为高电平高16位:写入1为低电平;
  3. BRR寄存器,   只能控制管脚的电平, 只有低16位, 写入1置低电平;

特别的: F1和F4系列都有 ODR和BSRR, 但F4 取消了BRR, 为了代码通用, 最好少使用BRR, 反正BSRR能完成.

ODR和BSRR的两个区别:

你应该有过和我一样的疑问:

ODR寄存器低16位就能完成置位和复位, 还能读状态;  为何存在一个BSRR, 不事多吗?? 还分高低16位! ! 还读无效!!

写代码写了几年, 一直在使用ODR, 几乎没用过BSRR. 直到今天查找F1和F4的GPIO操作区别时, 才发现BSRR的神奇之处:

(1) BSRR: 写入1生效, 写入0无动作.  同样置/复位, 比用ODR操作编译后要快几个动作, 想想以前用或/与操作, 真是多余了!

例如:  PB6设高电平, PB11设低电平

// ODR
GPIOB->ODR |=  PIN6;      // 或操作, 虽然一行代码, 其实编译时动作: 读取->操作->写入
GPIOB->ODR &= ~PIN11;     // 与操作, 同样几个动作了

// BSRR 
GPIOB->BSRR = PIN6;       // 直接置1就成, 其它没置1的位不产生影响
GPIOB->BSRR = PIN11<<16;  // 

(2) BSRR 操作, 不用关中断

这个不太理解, 功力不到时候. 引用网友的话吧:

“This way, there is no risk that an IRQ occurs between the read and the modify access.”
什么意思呢?就就是你用BSRR和BRR去改变管脚状态的时候,没有被中断打断的风险。也就不需要关闭中断。


使用总结:

操作管脚状态, BSRR = 快 + 简单 !

扫描二维码关注公众号,回复: 8870341 查看本文章

(完~~~)

发布了44 篇原创文章 · 获赞 20 · 访问量 9534

猜你喜欢

转载自blog.csdn.net/zhouml_msn/article/details/103677994