Try   HackMD

BSRR、BRR、ODR暫存器控制GPIO


在每一種晶片中,每個腳位的輸出、輸入設定都是可以依靠暫存器的,當暫存器中的某個位置被設置為特定的數值後,就可以對腳位進行設定


如何做出這種效果?


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);
        
	}
}

那如果要做這樣呢?


先在STM32cube內選好我們要使用的腳位

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →


正常來說我們會這麼做,一個一個設定

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


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);
        }
        
    }
}