STM32 通用輸入輸出端口GPIO BRR、BSRR、ODR寄存器詳解
詳細(xì)頁(yè)面:http://alanzjl.sinaapp.com/2015/02/gpio_brr_bsrr_odr/
BRR、BSRR、ODR都是用來(lái)控制16位針腳的。
其中,BRR和ODR高16位都不可用(Reserved),使用低16位控制針腳,而BSRR高16位和低16位皆可用,都用來(lái)控制16位針腳。
BRR與BSRR使用方法
BRR和BSRR的最顯著用處就是可以只改變某一個(gè)或某幾個(gè)針腳的值而不改變其他。
1.BRR:如果程序?qū)ζ淠翅樐_賦值0,則該針腳維持原值不變,比如BRR的位0本來(lái)為1,則GPIOx->BRR=0x0語(yǔ)句之后該位值還為1。若對(duì)其賦值1,則該位值變?yōu)?(即復(fù)位值),比如BRR的位0本來(lái)為1,則GPIOx->BRR=0x01語(yǔ)句之后該位值為0。
2.BSRR:對(duì)于高16位,與BRR相同。對(duì)于低16位,如果程序?qū)ζ淠翅樐_賦值0,則該針腳維持原值不變。若對(duì)其賦值1,則該位值變?yōu)?,比如BSRR的位0本來(lái)為0,則GPIOx->BRR=0x01語(yǔ)句之后該位值為1。
舉個(gè)例子,GPIOx->BRR=0x01與GPIOx->BSRR=0x01<<16相同,后者為通過(guò)0x01左移16位來(lái)控制高16位。
BRR、BSRR都可以做到假如只想改變位0的值,則不論其他位為何值,用一個(gè)等號(hào)就可以完成。
而ODR改變時(shí)則是全部改變。
比如16位本來(lái)為1010101010101010,經(jīng)過(guò)GPIOx->BSRR=0x01后變?yōu)?010101010101011,而經(jīng)過(guò)GPIOx->ODR=0x01后變?yōu)?000000000000001。
借用之前看到的一個(gè)例子,
GPIOE->BSRR = 0x80; // 置’1'
GPIOE->BRR = 0x80; // 置'0'
如果使用常規(guī)'讀-改-寫'的方法:
GPIOE->ODR = GPIOE->ODR | 0x80; // 置’1'
GPIOE->ODR = GPIOE->ODR & 0xFF7F; // 置’0'
二者作用相同。
附上官網(wǎng)手冊(cè)截圖: