32位配置寄存器:GPIOx_CRL,GPIOx_CRH 32位數據寄存器:GPIOx_IDR,GPIOx_ODR 32位置位/複位寄存器:GPIOx_BSRR 16位複位寄存器:GPIOx_BRR 32位鎖定寄存器:GPIOx_LCKR GPIO 寄存器詳解 CRL 32位埠配置低寄存器(GPI ...
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,給低電平->點亮
}
本文來自博客園,作者:BN宋,轉載請註明原文鏈接:https://www.cnblogs.com/songpoetry/p/18385051