目的
對於MCU來說GPIO口的使用是最基礎的內容,僅使用GPIO口和延時等,就可以完成很多功能了。
GPIO口基礎使用
基礎說明
STM32的GPIO口可以工作在以下八種模式:
- Input floating(浮空輸入)
默認情況下GPIO口處於浮空輸入模式; - Input pull-up(上拉輸入)
基本數字輸入使用; - Input-pull-down(下拉輸入)
基本數字輸入使用; - Analog(模擬)
一般用於ADC或DAC功能複用; - Output open-drain with pull-up or pull-down capability(具有上拉或下拉功能的開漏輸出)
基本輸出使用,一般爲了輸出5V高電平的時候可以用該模式,然後外部上拉電阻到5V(注意只有Datasheet中I/O structure爲FT的引腳才耐5V電壓); - Output push-pull with pull-up or pull-down capability(具有上拉或下拉功能的推輓輸出)
基本輸出使用; - Alternate function push-pull with pull-up or pull-down capability(具有上拉或下拉功能的複用功能推輓)
用於其它外設複用; - Alternate function open-drain with pull-up or pull-down capability(具有上拉或下拉功能的複用功能開漏)
用於其它外設複用;
初始化設置
使用STM32Cube來初始化設置IO口是比較方便的,畢竟初始化代碼都會自動生成,當然我們也可以自己編寫初始化代碼,參考下面軟件生成的初始化代碼:
//以下代碼將PA2口初始化設置爲推輓輸出模式
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0}; //聲明GPIO初始化數據結構
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA口時鐘
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET); //設置初始爲低電平
/*Configure GPIO pin : PA2 */
GPIO_InitStruct.Pin = GPIO_PIN_2; //設置2口
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); //初始化設置
}
輸出與控制
輸出模式算是最常用的功能,最常見的被用來接個LED做指示燈。
- GPIO口設置爲輸出的時候模式可以配置爲推輓輸出或是開漏輸出;
- GPIO output level指端口初始輸出狀態;
- Maximum output speed影響輸出電平轉換時的變化速度,速度越快變換越快,同時速度越快越容易因過沖問題對電信號產生干擾;
在編寫程序時可以使用下面兩個函數來改變IO口輸出狀態: HAL_GPIO_WritePin(GPIOx, GPIO_Pin, PinState)
向指定IO口寫值,GPIO_PIN_SET
爲高(1),GPIO_PIN_RESET
爲低(0);HAL_GPIO_TogglePin(GPIOx, GPIO_Pin)
翻轉指定IO口輸出值;
讀取端口值
輸入模式也比較常用,比如外接按鈕、開關等,可以在輸入模式下讀取端口值來確認這些器件的狀態。
輸入模式下通過 HAL_GPIO_ReadPin(GPIOx, GPIO_Pin)
函數來讀取指定端口值,該函數返回 GPIO_PIN_SET
或 GPIO_PIN_RESET
。
GPIO口與外部中斷
STM32每一個IO口都可以設置外部中斷,但有點限制,比如PA2設置了外部中斷那麼PB2、PC2、PD2……等等這些都無法設置外部中斷了。所以在IO口上的外部中斷最多可以設置0~15號共16個。IO口上的外部中斷可以被配置成電平上升沿、下降沿、上升下降沿觸發。
下面使用按鈕進行外部中斷使用演示,按照下圖將按鈕接到PA1腳,圖中電容用於消除按鈕操作時的電平抖動:
按照下圖進行初始化配置:
上圖中設置了PA1腳外部中斷,配置爲上升下降沿均觸發中斷,並且將PA1設置爲上拉模式,這樣根據上面電路按鈕未按下時端口爲高電平,按鈕按下時端口變爲低電平。(爲了方便測試這裏我還啓用了Debug引腳,下圖就是實際調試效果)
上圖中在軟件自動生成的代碼以外只添加了 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
函數,該函數就是IO口外部中斷的回調函數,使用外部中斷時除了配置以外我們只需要編寫此函數就行。在上面例子中我在中斷回調函數中讀取了PA1的端口值,在調試中追蹤該值。可以看到在按下和鬆開按鈕時該值會被改變,說明中斷被正確執行。
總結
GPIO口的基礎使用比較簡單,更多內容可以參考官方Datasheet、Reference manual、User Manual等。