# BSRR、BRR、ODR暫存器控制GPIO ---- ### 在每一種晶片中,每個腳位的輸出、輸入設定都是可以依靠暫存器的,當暫存器中的某個位置被設置為特定的數值後,就可以對腳位進行設定 ---- ### 如何做出這種效果? <iframe src="https://giphy.com/embed/U8avBGg03o633vVRmY" width="480" height="270" frameBorder="0" class="giphy-embed" allowFullScreen></iframe><p><a href="https://giphy.com/gifs/U8avBGg03o633vVRmY"></a></p> ---- # ARDUINO ### 在ARDUINO中我們只能這樣做,非常簡單,因為都包好好了 ``` void setup() { pinMode(LED_BUILTIN, OUTPUT); } void loop() { digitalWrite(LED_BUILTIN, HIGH); delay(1000); digitalWrite(LED_BUILTIN, LOW); delay(1000); } ``` ---- # STM32 ``` void mycodes(void){ while(1){ HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5); //PB5 High、LOW HAL_Delay(500); } } ``` ---- ### 那如果要做這樣呢? <iframe src="https://giphy.com/embed/1eoTx9ET46Hm1HB1kM" width="480" height="270" frameBorder="0" class="giphy-embed" allowFullScreen></iframe><p><a href="https://giphy.com/gifs/1eoTx9ET46Hm1HB1kM"></a></p> ---- ### 先在STM32cube內選好我們要使用的腳位 ![](https://hackmd.io/_uploads/S1vRAC7K3.png) ---- ### 正常來說我們會這麼做,一個一個設定 ``` void mycodes(void){ while(1){ HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET); HAL_Delay(50); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET); HAL_Delay(50); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET); HAL_Delay(50); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_SET); HAL_Delay(50); } } ``` ---- ### 很明顯的這樣寫太過於麻煩 ---- # using BSRR、BRR ### 但是當我們透過操縱BSRR、BRR暫存器來操控GPIO後簡單多了 ``` void mycodes(void){ int i; while(1){ for(i=0;i<=15;i++) { GPIOB -> BSRR = (1<<i); HAL_Delay(50); } for(b=14;b>=1;b--) { GPIOB -> BRR = (1<<i); HAL_Delay(50); } } } ``` ---- ### BSRR、BRR只會對於單一腳位更改其HIGH、LOW ### 假如今天你塞了GPIOB->BSRR = 5,以二進制來說它是0101,所以PB0和PB2會被點亮,其餘IO不論原先是HIGH或LOW會保持原先的狀態就算原本PB1、PB3是亮的也不會因此變暗,並不會被影響,ODR反之 ---- # using ODR <iframe src="https://giphy.com/embed/asNZqj4rVGguBgekJt" width="480" height="270" frameBorder="0" class="giphy-embed" allowFullScreen></iframe><p><a href="https://giphy.com/gifs/asNZqj4rVGguBgekJt"></a></p> ``` void mycodes(void){ int i; while(1){ for(i=0;i<=15;i++) { GPIOB -> ODR = (1<<i); HAL_Delay(50); } for(b=14;b>=1;b--) { GPIOB -> ODR = (1<<i); HAL_Delay(50); } } } ``` ----