GPIO(通用輸入輸出接口)
1 GPIO 功能概述
GPIO 是通用輸入/輸出(General Purpose I/O)的簡稱,主要用于工業(yè)現(xiàn)場需要用到數(shù)字量輸入/輸出的場合,例如:
- 輸出功能 :繼電器、 LED、蜂鳴器等的控制
- 輸入功能 :傳感器狀態(tài)、高低電平等信息的讀取
- 復用功能 :片內(nèi)外設(shè)的對外接口
- 時序模擬 :模擬 SPI、I2C 和 UART 等常用接口的時序
2 STM32 的 GPIO 特性
- 多種工作模式:輸出/輸入/復用/模擬
- 靈活的復用模式
- 5V 電壓容限
- 外部中斷功能
3 端口和引腳
- 端口(PORT): 獨立的外設(shè)子模塊,包括多個引腳,通過多個硬件寄存器控制引腳。
GPIO 模塊由端口 GPIOA、GPIOB、GPIOC 等多個獨立的子模塊構(gòu)成。
例如:端口 GPIOA 包括 PA0 ~ PA15 這 16 個引腳,通過 10 個硬件寄存器控制引腳工作。
PA0,屬于端口 GPIOA,輸出電平由端口 GPIOA 的輸出數(shù)據(jù)寄存器 GPIOA_ODR 的第 0 位決定。
4 GPIO 電路
5 GPIO 工作模式
- 輸入模式:浮空輸入/上拉輸入/下拉輸入
- 浮空輸入:按鍵識別
- 上拉輸入:IO 內(nèi)部上拉電阻輸入
- 下拉輸入:IO 內(nèi)部下拉電阻輸入
- 輸出模式:推挽輸出/開漏輸出
- 推挽輸出時,P-MOS 管和 NMOS 管輪流工作,可以輸出高電平或低電平。主要用于連接數(shù)字器件,如指示燈和繼電器等模塊;
- 開漏輸出時,P-MOS 管關(guān)閉,只有 N-MOS 管工作,此時只能輸出低電平。要輸出高電平必須外加上拉電阻,主要用于 I2C 總線。
- 模擬模式
- 模擬狀態(tài):表示引腳功能選擇為模擬模式,但不作為任何片內(nèi)模擬外設(shè)的復用腳,只是為了減少系統(tǒng)功耗。
- 模擬外設(shè)復用引腳:表示引腳作為片內(nèi)模擬外設(shè)(A/D 轉(zhuǎn)換模塊、D/A 轉(zhuǎn)換模塊、模擬比較器等)的復用腳,用于完成相應(yīng)的功能操作。
- 復用模式
在 CubeMX 軟件的引腳分配圖中點擊引腳即可彈出引腳的復用功能 - 復用推挽:片內(nèi)外設(shè)功能(URAT 的 TX,RX,SPI 的 MOSI,MISO,SCK,SS );
- 復用開漏:片內(nèi)外設(shè)功能( I2C 的 SCL,SDA )。
6 基于 HAL 庫控制 GPIO
6.1 GPIO 外設(shè)的數(shù)據(jù)類型
- 引腳初始化: 采用結(jié)構(gòu)體類型實現(xiàn),用于定義引腳的序號、工作模式、輸出速度等基本特性。
- 引腳電平狀態(tài): 采用枚舉類型實現(xiàn),用于定義引腳的電平狀態(tài):高電平和低電平。
- 引腳所屬端口: 采用結(jié)構(gòu)體指針實現(xiàn),用于訪問該端口所對應(yīng)的寄存器組。
引腳初始化數(shù)據(jù)類型
成員變量 Pin 的取值范圍:
GPIO_PIN_0
~GPIO_PIN15
成員變量 Pin 的取值范圍:
GPIO_MODE_INPUT 浮空輸入模式 GPIO_MODE_OUTPUT_PP 推挽輸出模式 GPIO_MODE_OUTPUT_OD 開漏輸出模式 GPIO_MODE_AF_PP 復用功能下的推挽模式 GPIO_MODE_AF_OD 復用功能下的開漏模式 GPIO_MODE_ANALOG 模擬模式 成員變量 Pull 的取值范圍:
GPIO_NOPULL 沒有上拉或下拉電阻激活 GPIO_PULLUP 上拉電阻激活 GPIO_PULLDOWN 下拉電阻激活 成員變量 Speed 的取值范圍:
GPIO_SPEED_FREQ_LOW 引腳輸出速度 2MHz GPIO_SPEED_FREQ_MEDIUM 引腳輸出速度 12.5MHz ~ 50MHz GPIO_SPEED_FREQ_HIGH 引腳輸出速度 25MHz ~ 100MHz GPIO_SPEED_FREQ_VERY_HIGH 引腳輸出速度 50MHz ~ 200MHz 成員變量 Alternate 的取值范圍
- Alternate 表示引腳的復用功能;
- 由于不同型號的 STM32 微控制器片內(nèi)集成的外設(shè)不同,因此該成員變量的取值范圍由芯片型號決定。
- 以 STM32F1 系列芯片為例,通過查閱
stm32f1xx_hal_gpio_ex.h
文件可以了解 Alternate 的取值范圍; - 該成員變量的取值一般通過 CubeMX 軟件分配,不需要用戶手動設(shè)置;
引腳電平狀態(tài)數(shù)據(jù)類型
端口數(shù)據(jù)類型:指向端口寄存器組的結(jié)構(gòu)體指針
GPIOA
,GPIOB
,GPIOC
…
- 不同型號的 STM32 微控制器的端口數(shù)量各不相同;
- 端口數(shù)據(jù)類型的定義是在以芯片型號命名的.h 文件中.
6.2 使用 HAL 庫的引腳初始化步驟
- 定義變量: 利用引腳初始化結(jié)構(gòu)體類型
GPIO_InitTypeDef
定義一個結(jié)構(gòu)體變量。 - 設(shè)置模式: 按照引腳的工作模式,依次對該結(jié)構(gòu)體的成員變量賦值,如 pin、mode、pull 等。
- 調(diào)用函數(shù): 調(diào)用初始化函數(shù)
HAL_GPIO_Init
將配置參數(shù)寫入到對應(yīng)的寄存器,入口參數(shù)為端口號和結(jié)構(gòu)體變量。
6.3 GPIO 外設(shè)接口函數(shù)的概述
引腳初始化函數(shù):
HAL_GPIO_Init
函數(shù)原型 復位引腳到初始狀態(tài) 功能描述 引腳初始化 入口參數(shù) 1 GPIOx:引腳端口號,取值范圍是 GPIOA ~ GPIOK 入口參數(shù) 2 GPIO_Init:指向引腳初始化類型 GPIO_InitTypeDef 的結(jié)構(gòu)體指針,該結(jié)構(gòu)體包含指定引腳的配置參數(shù) 返回值 無 注意事項 該函數(shù)可以由 CubeMX 軟件自動生成 引腳復位函數(shù):
HAL_GPIO_DeInit
函數(shù)原型 void HAL_GPIO_DeInit (GPIO_TypeDef * GPIOx, uint32_t GPIO_Pin) 功能描述 復位引腳到初始狀態(tài) 入口參數(shù) 1 GPIOx:引腳端口號,取值范圍是 GPIOA ~ GPIOK 入口參數(shù) 2 GPIO_Init:指向引腳初始化類型 GPIO_InitTypeDef 的結(jié)構(gòu)體指針,該結(jié)構(gòu)體包含指定引腳的配置參數(shù) 返回值 無 注意事項 該函數(shù)需要用戶調(diào)用 讀取引腳函數(shù):
HAL_GPIO_ReadPin
函數(shù)原型 GPIO_PinState HAL_GPIO_ReadPin ( GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin ) 功能描述 讀取引腳的電平狀態(tài) 入口參數(shù) 1 GPIOx:引腳端口號,取值范圍是 GPIOA ~ GPIOK 入口參數(shù) 2 GPIO_Init:指向引腳初始化類型 GPIO_InitTypeDef 的結(jié)構(gòu)體指針,該結(jié)構(gòu)體包含指定引腳的配置參數(shù) 返回值 GPIO_PinState:表示引腳電平狀態(tài)的枚舉類型變量,可以是GPIO_PIN_SET 或 GPIO_PIN_RESET 注意事項 該函數(shù)需要用戶調(diào)用 寫入引腳函數(shù):
HAL_GPIO_WritePin
函數(shù)原型 void HAL_GPIO_WritePin( GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState ) 功能描述 設(shè)置引腳輸出高/低電平 入口參數(shù) 1 GPIOx:引腳端口號,取值范圍是 GPIOA ~ GPIOK 入口參數(shù) 2 GPIO_Init:指向引腳初始化類型 GPIO_InitTypeDef 的結(jié)構(gòu)體指針,該結(jié)構(gòu)體包含指定引腳的配置參數(shù) 返回值 GPIO_PinState:表示引腳電平狀態(tài)的枚舉類型變量,可以是 GPIO_PIN_SET 或 GPIO_PIN_RESET 注意事項 該函數(shù)需要用戶調(diào)用 翻轉(zhuǎn)引腳函數(shù):
HAL_GPIO_TogglePin
函數(shù)原型 void HAL_GPIO_TogglePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin) 功能描述 翻轉(zhuǎn)引腳狀態(tài) 入口參數(shù) 1 GPIOx:引腳端口號,取值范圍是 GPIOA ~ GPIOK 入口參數(shù) 2 GPIO_Init:指向引腳初始化類型 GPIO_InitTypeDef 的結(jié)構(gòu)體指針,該結(jié)構(gòu)體包含指定引腳的配置參數(shù) 返回值 無 注意事項 該函數(shù)需要用戶調(diào)用
任務(wù)實踐
基于STM32F103C8T6,開發(fā)板原理圖
采用查詢方式檢測按鍵KEY1狀態(tài),按鍵按下后執(zhí)行操作:翻轉(zhuǎn)指示燈 LED1 的狀態(tài)。
注:本任務(wù)例程使用的開發(fā)板,LED1與STM32的PA1相連接,KEY1與PA0相連接。KEY1原理圖如下:
使用按鍵時,需要設(shè)置PA0為輸入上拉模式,這樣在KEY1沒有按下時,PA0可以讀取到高電平,KEY1按下時PA0可以讀取到低電平。
按鍵消抖:
通常的按鍵所用開關(guān)為機械彈性開關(guān),當機械觸點斷開、閉合時,由于機械觸點的彈性作用,一個按鍵開關(guān)在閉合時不會馬上穩(wěn)定地接通,在斷開時也不會一下子斷開。因而在閉合及斷開的瞬間均伴隨有一連串的抖動,為了不產(chǎn)生這種現(xiàn)象而作的措施就是按鍵消抖。
抖動時間的長短由按鍵的機械特性決定,一般為5ms~10ms。按鍵穩(wěn)定閉合時間的長短則是由操作人員的按鍵動作決定的,一般為零點幾秒至數(shù)秒。為確保CPU對鍵的一次閉合僅作一次處理,必須去除鍵抖動。在鍵閉合穩(wěn)定時讀取鍵的狀態(tài),并且必須判別到鍵釋放穩(wěn)定后再作處理。
下圖為按鍵按下時,電壓波形的變化。
- 前沿抖動 5 ~ 10ms,后沿抖動 5 ~ 10ms
- 按鍵的抖動會導致一次按鍵動作被當成多次按鍵,為確保 MCU 對按鍵的一次閉合僅作一次處理,必須消除按鍵的抖動,在按鍵處于穩(wěn)定狀態(tài)時讀取按鍵的狀態(tài)。
- 硬件消抖:利用 RC 低通濾波器濾掉抖動
- 軟件消抖:
- 檢測出按鍵閉合后執(zhí)行延時程序,延時時間為 5ms ~ 10ms,用于去掉前沿抖動;
- 再次檢測按鍵狀態(tài),如果保持閉合狀態(tài),才認為按下,并執(zhí)行相應(yīng)的按鍵任務(wù);
- 按鍵的釋放可以采用延時或者循環(huán)檢測的方式去掉后沿抖動。
- 配置 PA0 為 GPIO_Input,PA1 為 GPIO_Output
- PA1 保持默認 GPIO 輸出模式即可
- PA0 配置為輸入模式,上拉
以上步驟生成如下代碼:
stm32f1xx_hal_gpio.c
中生成 GPIO 引腳初始化函數(shù)MX_GPIO_Init
,并在 main.c 中調(diào)用
- 開啟外設(shè)時鐘 RCC
- 配置 PA0,PA1 兩個引腳結(jié)構(gòu)
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
/*Configure GPIO pin : PA0 */
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pin : PA1 */
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
- 編寫程序
在main.c
中編寫程序
/* USER CODE BEGIN 3 */
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)
{
HAL_Delay(10);
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)
{
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1);
}
while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET);
}
}
/* USER CODE END 3 */
-
繼電器
+關(guān)注
關(guān)注
132文章
5350瀏覽量
148917 -
接口
+關(guān)注
關(guān)注
33文章
8600瀏覽量
151166 -
STM32
+關(guān)注
關(guān)注
2270文章
10900瀏覽量
356049 -
GPIO
+關(guān)注
關(guān)注
16文章
1204瀏覽量
52104 -
HAL庫
+關(guān)注
關(guān)注
1文章
121瀏覽量
6243
發(fā)布評論請先 登錄
相關(guān)推薦
評論