bsrr和brr寄存器的应用?
发布时间:2023-07-17 12:11 作者:admin 来源:未知 点击: 标签: 和 、 bsrr 引脚 寄存器 低 高 应用 的 brr
引脚的高、低电平限度,有3种步骤(3个寄存器)
永别是通过GPIO的 3个 管脚限度寄存器:
ODR寄存器, 限度管脚的高、低电平,低16位有用,写1 高电平, 写0 低电平;
BSRR寄存器, 限度管脚的高、低电平,32位有用,低16位写1 高电平,高16位写1 低电平;
BRR寄存器, 限度管脚的低电平,低16位有用,写1 低电平;
迥殊的: F1和F4系列都有 ODR和BSRR,但F4 解除了BRR。所认为了代码通用,尽量不应用BRR,归正BSRR能实行.
ODR、BSRR的应用区别:
你应当有过和我一律的疑义:
ODR寄存器只用低16位,就能限度引脚的高、低电平,还能读寄存器的值,用以判别引脚电平形态;
那么, 为什么要存正在一个BSRR! 还分高、低16位! 还不行读寄存器的值!
写了几年的STM32代码, 平昔正在应用ODR, 险些没用过BSRR. 直到此日查找F1和F4的GPIO操作区别时, 才发觉BSRR的奇妙之处。
(1) BSRR: 写入1生效, 写入0无作为. 同样置/复位, 比用ODR操作编译后要速几个作为, 思思以前用或/与操作, 真是多余了!
比方: PB1要设高电平, PB11设低电平;防卫看注解
// 通过 ODR 寄存器
GPIOB->ODR= 0X01 ; // 代码是一行, 但背后的运转是许多步:读取->或运算->写入
GPIOB->ODR &= ~(0X01<<11) ; // 同样是:读取->或运算->写入
// 通过 BSRR 寄存器
GPIOB->BSRR = 0X01 ; // 某个位直接置1,OK, 搞掂了。其它没置1的位不爆发转化
GPIOB->BSRR = 0X01<<11; // 同上
(2) BSRR 操作, 不消合隔绝
这个不太领悟, 功力不到时间. 援用网友的话吧:
“This way, there is no risk that an IRQ occurs between the read and the modify access.”
什么趣味呢?便是你用BSRR和BRR去改观管脚形态的时间,没有被隔绝打断的危急。也就不必要紧闭隔绝。
应用总结:
操作管脚形态, BSRR = 速 + 浅易 !