STM32 通用输入输出端口GPIO BRR、BSRR、ODR寄存器详解
扫描二维码
随时随地手机看文章
详细页面:http://alanzjl.sinaapp.com/2015/02/gpio_brr_bsrr_odr/
BRR、BSRR、ODR都是用来控制16位针脚的。
其中,BRR和ODR高16位都不可用(Reserved),使用低16位控制针脚,而BSRR高16位和低16位皆可用,都用来控制16位针脚。
BRR与BSRR使用方法
BRR和BSRR的最显著用处就是可以只改变某一个或某几个针脚的值而不改变其他。
1.BRR:如果程序对其某针脚赋值0,则该针脚维持原值不变,比如BRR的位0本来为1,则GPIOx->BRR=0x0语句之后该位值还为1。若对其赋值1,则该位值变为0(即复位值),比如BRR的位0本来为1,则GPIOx->BRR=0x01语句之后该位值为0。
2.BSRR:对于高16位,与BRR相同。对于低16位,如果程序对其某针脚赋值0,则该针脚维持原值不变。若对其赋值1,则该位值变为1,比如BSRR的位0本来为0,则GPIOx->BRR=0x01语句之后该位值为1。
举个例子,GPIOx->BRR=0x01与GPIOx->BSRR=0x01<<16相同,后者为通过0x01左移16位来控制高16位。
BRR、BSRR都可以做到假如只想改变位0的值,则不论其他位为何值,用一个等号就可以完成。
而ODR改变时则是全部改变。
比如16位本来为1010101010101010,经过GPIOx->BSRR=0x01后变为1010101010101011,而经过GPIOx->ODR=0x01后变为0000000000000001。
借用之前看到的一个例子,
GPIOE->BSRR = 0x80; // 置’1'
GPIOE->BRR = 0x80; // 置'0'
如果使用常规'读-改-写'的方法:
GPIOE->ODR = GPIOE->ODR | 0x80; // 置’1'
GPIOE->ODR = GPIOE->ODR & 0xFF7F; // 置’0'
二者作用相同。
附上官网手册截图: