一、什么是GPIO?
GPIO的英文全稱是General-Purpose IO ports,也就是通用輸入輸出口。
在嵌入式系統(tǒng)中,經(jīng)常需要控制許多結(jié)構(gòu)簡單的外部設(shè)備或者電路,這些設(shè)備有的需要通過CPU控制,有的需要CPU提供輸入信號。并且,許多設(shè)備或電路只要求有開/關(guān)兩種狀體就夠了,比如LED的亮與滅。對這些設(shè)備的控制,使用傳統(tǒng)的串口或者并口就顯得比較復(fù)雜,所以,在嵌入式微處理器上通常提供了一種“通用可編程I/O端口”,也就是GPIO。
一個GPIO端口至少需要兩個寄存器,一個做控制用的“通用IO端口控制寄存器”,還有一個是存放數(shù)據(jù)的“通用I/O端口數(shù)據(jù)寄存器”。數(shù)據(jù)寄存器的每一位是和GPIO的硬件引腳對應(yīng)的,而數(shù)據(jù)的傳遞方向是通過控制寄存器設(shè)置的,通過控制寄存器可以設(shè)置每一位引腳的數(shù)據(jù)流向。
二、STM32中關(guān)于GPIO口的介紹
在STM32中每個GPI/O端口有兩個32位配置寄存器(GPIOx_CRL,GPIOx_CRH),兩個32位數(shù)據(jù)寄存器(GPIOx_IDR和GPIOx_ODR),一個32位置位/復(fù)位寄存器(GPIOx_BSRR),一個16位復(fù)位寄存器(GPIOx_BRR)和一個32位鎖定寄存器(GPIOx_LCKR)。
根據(jù)數(shù)據(jù)手冊中列出的每個I/O端口的特定硬件特征, GPIO端口的每個位可以由軟件分別配置成多種模式。
─ 輸入浮空
─ 輸入上拉
─ 輸入下拉
─ 模擬輸入
─ 開漏輸出
─ 推挽式輸出
─ 推挽式復(fù)用功能
─ 開漏復(fù)用功能
三、常用GPIO口寄存器描述
1、端口配置寄存器(GPIOx_CRL,GPIOx_CRH)
GPIOx_CRL和GPIOx_CRH分別對應(yīng)GPIO口的低8位和高8位輸入輸出口,每個寄存器的4位對應(yīng)GPIO口的一個端口的配置模式,其中4位中的低兩位代表配置為輸入還是輸出模式,記為MODEy[1:0],具體的模式配置情況如下:
00:輸入模式(復(fù)位后的狀態(tài))
01:輸出模式,最大速度10MHz
10:輸出模式,最大速度2MHz
11:輸出模式,最大速度50MHz
高兩位通常對應(yīng)于什么輸入輸出方式,記為CNFy[1:0],具體的模式配置情況如下:
在輸入模式(MODE[1:0]=00):
00:模擬輸入模式
01:浮空輸入模式(復(fù)位后的狀態(tài))
10:上拉/下拉輸入模式
11:保留
在輸出模式(MODE[1:0]>00):
00:通用推挽輸出模式
01:通用開漏輸出模式
10:復(fù)用功能推挽輸出模式
11:復(fù)用功能開漏輸出模式
2、端口輸入數(shù)據(jù)寄存器(GPIOx_IDR)
位31:16 保留,始終讀為0。
位15:0 端口輸入數(shù)據(jù),這些位為只讀并只能以字(16位)的形式讀出。讀出的值為對應(yīng)I/O口的狀態(tài)。
3、端口輸出數(shù)據(jù)寄存器(GPIOx_ODR)
位31:16 保留,始終讀為0。
位15:0 端口輸出數(shù)據(jù),這些位可讀可寫并只能以字(16位)的形式操作。
4、端口位設(shè)置/清除寄存器(GPIOx_BSRR)
5、端口位清除寄存器(GPIOx_BRR)
四、一個簡單的關(guān)于寄存器的操作
MiniSTM32關(guān)于狀態(tài)指示燈的連接
由圖示可以看出DS0和DS1分別接在GPIOA8和GPIOD2上,由此可以對寄存器的操作來實現(xiàn)流水燈實驗
void LED_Init(void)
{
RCC->APB2ENR |= 1 << 2; //使能PORTA時鐘
RCC->APB2ENR |= 1 << 5; //使能PORTB時鐘
GPIOA->CRH &= 0xFFFFFFF0;//清空PA8
GPIOA->CRH |= 0x00000003;//將PA8設(shè)置成通用推挽輸出模式
GPIOA->ODR |= 1 << 8; ? ? ??
GPIOD->CRL &= 0xFFFFF0FF;//清空PD2
GPIOD->CRL |= 0x00000300;//將PD2設(shè)置成通用推挽輸出模式
GPIOD->CRL |= 1 << 2;
}
int main(void)
{
Stm32_Clock_Init(9); //初始化時鐘
delay_init(72); //延時初始化
LED_Init(); //配置相應(yīng)寄存器
while(1)
{
LED0 = 0; //點亮DS0
LED1 = 1;
delay_ms(500);
LED0 = 1; //點亮DS1
LED1 = 0;
delay_ms(500);
}
}
-
寄存器
+關(guān)注
關(guān)注
31文章
5359瀏覽量
120792 -
STM32
+關(guān)注
關(guān)注
2270文章
10915瀏覽量
356747 -
GPIO
+關(guān)注
關(guān)注
16文章
1215瀏覽量
52224
發(fā)布評論請先 登錄
相關(guān)推薦
評論