BSRR 和 BRR 都是 STM32 系列 MCU 中 GPIO 的寄存器。 BSRR 称为端口位设置/清楚寄存器,BRR称为端口位清除寄存器。 BSRR 低 16 位用于设置 GPIO 口对应位输出高电平,高 16 位用于设置 GPIO 口对应位输出低电平。 BRR 低 16 位用于设置 GPIO 口对应位输出低电平。高 16 位为保留地址,读写无效。 我们详...
而使用改写 BSRR 寄存器时,仅需要使用如下语句: GPIOA-》BSRR = GPIO_Pin_6; 这是因为在修改 ODR 时,为了确保对端口 6 的修改不会影响到其他端口的输出,需要对端口的原始数据进行保存,之后再对端口 6 的值进行修改,最后再写入寄存器。而对 BSRR 的操作,是写 1 有效,写 0 不改变原状态,因此可以对端口 6...
(1)ODR设置位值时是影响其他的位,ODR使用时先读取其状态才能设置其值 (2) BSRR寄存器设置位值的时候,不会影响到其他的位的输出或输入。
GPIO_ResetBits(GPIOD, (~data & 0xff00)); 也可以直接操作这两个寄存器: GPIOD->BSRR = data & 0xff00; GPIOD->BRR = ~data & 0xff00; 规则: 一、置GPIOD->BSRR低16位的某位为'1',则对应的I/O端口置'1';而置GPIOD->BSRR低16位的某位为'0',则对应的I/O端口不变。 二、置GPIOD->B...
特别的: F1和F4系列都有 ODR和BSRR,但F4 取消了BRR。所以为了代码通用,尽量不使用BRR,反正BSRR能完成. ODR、BSRR的使用区别: 你应该有过和我一样的疑问: ODR寄存器只用低16位,就能控制引脚的高、低电平,还能读寄存器的值,用以判断引脚电平状态;
GPIOE->BSRR=(Newdata&0xff)|(~Newdata&0xff)<<16; 从最后这个操作可以看出使用BSRR寄存器,可以实现8个端口位的同时修改操作。 如果不是用BRR和BSRR寄存器,则上述要求就需要这样实现: GPIOE->ODR=GPIOE->ODR&0xff00|Newdata; 使用BRR和BSRR寄存器可以方便地快速地实现对端口某些特定位的操作,而不...
使用BRR和BSRR寄存器可以方便地快速地实现对端口某些特定位的操作,而不影响其它位的状态。 比如希望快速地对GPIOE的位7进行翻转,则可以: GPIOE->BSRR = 0x80; // 置'1' GPIOE->BRR = 0x80; // 置'0' 如果使用常规'读-改-写'的方法: GPIOE->ODR = GPIOE->ODR | 0x80; // 置'1' ...
GPIOE->BSRR=(Newdata&0xff)|(~Newdata&0xff)<<16; 从最后这个操作可以看出使用BSRR寄存器,可以实现8个端口位的同时修 改操作。 如果不是用BRR和BSRR寄存器,则上述要求就需要这样实现: GPIOE->ODR=GPIOE->ODR&0xff00|Newdata; 使用BRR和BSRR寄存器可以便当地快速地实现对端口某些特定位的操作, 而不影响其它...
本质上并无区别。ODR可读可写。使用时是针对端口的整体操作,在操作单个GPIO口时则比较麻烦、需要读-修改-写过程。而BSRR只能写不能读。它更适合进行原子级的置位/清零操作、且不影响其它输出口的状态。
使用BRR和BSRR寄存器可以方便地快速地实现对端口某些特定位的操作,而不影响其它位的状态。 比如希望快速地对GPIOE的位7进行翻转,则可以: GPIOE->BSRR = 0x80; // 置'1' GPIOE->BRR = 0x80; // 置'0' 如果使用常规'读-改-写'的方法: GPIOE->ODR = GPIOE->ODR | 0x80; // 置'1' ...