詳細頁面: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'
二者作用相同。
附上官網手冊截圖: