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