STM32 GPIO 暫存器的配置

BN宋發表於2024-08-28

32位配置暫存器:GPIOx_CRL,GPIOx_CRH
32位資料暫存器:GPIOx_IDR,GPIOx_ODR
32位置位/復位暫存器:GPIOx_BSRR
16位復位暫存器:GPIOx_BRR
32位鎖定暫存器:GPIOx_LCKR

GPIO 暫存器詳解

CRL

32位埠配置低暫存器(GPIOx_CRL) (x=A..E)

用於配置低8位的GPIO口,每個GPIO口占用4個位元位,用於設定引腳的模式、輸入/輸出型別、上下拉電阻等。

CNFy[1:0]:埠x配置位(y = 0…7)
在輸入模式(MODE[1:0]=00):
00:模擬輸入模式
01:浮空輸入模式(復位後的狀態)
10:上拉/下拉輸入模式
11:保留
在輸出模式(MODE[1:0]>00):
00:通用推輓輸出模式
01:通用開漏輸出模式
10:複用功能推輓輸出模式
11:複用功能開漏輸出模式
------------
MODEy[1:0]:埠x的模式位(y = 0…7)
00:輸入模式(復位後的狀態)
01:輸出模式,最大速度10MHz
10:輸出模式,最大速度2MHz
11:輸出模式,最大速度50MHz

CRH

32位埠配置高暫存器(GPIOx_CRH) (x=A..E)

用於配置高8位的GPIO口,每個GPIO口占用4個位元位,與CRL暫存器類似,用於設定引腳的模式、輸入/輸出型別、上下拉電阻等。

CNFy[1:0]:埠x配置位(y = 8…15)
------------
MODEy[1:0]:埠x的模式位(y = 8…15)

IDR

32位埠輸入資料暫存器(GPIOx_IDR) (x=A..E)

用於讀取GPIO口的輸入狀態,每個GPIO口占用一個位元位,當該位元位為1時,表示對應的GPIO輸入電平為高電平;否則為低電平。

位31:16 保留,始終讀為0。

位15:0 IDRy[15:0]:埠輸入資料(y = 0…15) (Port input data)
這些位為只讀並只能以字(16位)的形式讀出。讀出的值為對應I/O口的狀態。

ODR

32位埠輸出資料暫存器(GPIOx_ODR) (x=A..E)

用於讀取GPIO口的輸入狀態,每個GPIO口占用一個位元位,當該位元位為1時,表示對應的GPIO輸入電平為高電平;否則為低電平。

位31:16 保留,始終讀為0。

位15:0 ODRy[15:0]:埠輸出資料(y = 0…15) (Port output data)
這些位可讀可寫並只能以字(16位)的形式操作。
注:對GPIOx_BSRR(x = A…E),可以分別地對各個ODR位進行獨立的設定/清除。

BRR、BSRR是原子操作,不會被中斷操作打斷

BSRR

埠位設定/清除暫存器(GPIOx_BSRR) (x=A..E)

也用於控制GPIO口的輸出狀態,每個GPIO口占用兩個位元位,第一個位元位為0時代表置位(設定為1),為1時代表復位(設定為0),第二個位元位用於選擇GPIO口,當該位元位被置為1時,對應的GPIO口輸出電平被控制。

位31:16
BRy: 清除埠x的位y (y = 0…15) (Port x Reset bit y)
這些位只能寫入並只能以字(16位)的形式操作。
0:對對應的ODRy位不產生影響
1:清除對應的ODRy位為0
注:如果同時設定了BSy和BRy的對應位, BSy位起作用。
------------
位15:0
BSy: 設定埠x的位y (y = 0…15) (Port x Set bit y)
這些位只能寫入並只能以字(16位)的形式操作。
0:對對應的ODRy位不產生影響
1:設定對應的ODRy位為1

BRR

埠位清除暫存器(GPIOx_BRR) (x=A..E)

也用於控制GPIO口的輸出狀態,每個GPIO口占用一個位元位,當該位元位被置為1時,對應的GPIO口輸出電平被複位(設定為0)。

位31:16 保留。

位15:0 BRy: 清除埠x的位y (y = 0…15) (Port x Reset bit y)
這些位只能寫入並只能以字(16位)的形式操作。
0:對對應的ODRy位不產生影響
1:清除對應的ODRy位為0

LCKR

埠配置鎖定暫存器(GPIOx_LCKR) (x=A..E)

用於鎖定GPIO口的配置,防止在執行過程中對其進行修改。LCKR暫存器有16個位元位,每個GPIO口占用一個位元位,當該位元位被置為1時,對應的GPIO口的配置被鎖定。

當執行正確的寫序列設定了位16(LCKK)時,該暫存器用來鎖定埠位的配置。位[15:0]用於鎖
定GPIO埠的配置。在規定的寫入操作期間,不能改變LCKP[15:0]。當對相應的埠位執行了
LOCK序列後,在下次系統復位之前將不能再更改埠位的配置。
每個鎖定位鎖定控制暫存器(CRL, CRH)中相應的4個位。

位31:17 保留。

位16
LCKK:鎖鍵 (Lock key)
該位可隨時讀出,它只可透過鎖鍵寫入序列修改。
0:埠配置鎖鍵位啟用
1:埠配置鎖鍵位被啟用,下次系統復位前GPIOx_LCKR暫存器被鎖住。
鎖鍵的寫入序列:
寫1 -> 寫0 -> 寫1 -> 讀0 -> 讀1
最後一個讀可省略,但可以用來確認鎖鍵已被啟用。
注:在操作鎖鍵的寫入序列時,不能改變LCK[15:0]的值。
操作鎖鍵寫入序列中的任何錯誤將不能啟用鎖鍵。
------------
位15:0
LCKy: 埠x的鎖位y (y = 0…15) (Port x Lock bit y)
這些位可讀可寫但只能在LCKK位為0時寫入。
0:不鎖定埠的配置
1:鎖定埠的配置

暫存器程式碼實現

LED控制

以PC4為例,LED 的負極連線到 GND,而正極連線到 PC4

void LED_Init(void)
{
    RCC->APB2ENR|=1<<4;    //使能時鐘 PORTC
    GPIOC->CRL&=0XFFF0FFFF;//PC4 配置位清零
    GPIOC->CRL|=0X00030000;//PC4 推輓輸出
    GPIOC->ODR|=1<<4;      //PC4 輸出高電平,熄滅。等價於 GPIOC->ODR |= 0X10;
}
int main()
{
    GPIOC->BSRR = 0x10;//設定對應的 ODRy 位為 1,給高電平->熄滅。等價於 GPIOC->BSRR = 0x10<<16;
    GPIOC->BRR = 0x10; //清除對應的 ODRy 位為 0,給低電平->點亮
}

相關文章