GPIO 有 3个 管脚控制寄存器:
- ODR寄存器, 控制管脚的高/低电平, 只有低16位, 置1 为高电平, 置0 为低电平;
- BSRR寄存器, 控制管脚的高/低电平, 低16位:写入1 为高电平, 高16位:写入1为低电平;
- 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 查看本文章
(完~~~)