使用HAL庫開發STM32:GPIO口基礎使用與外部中斷

目的

對於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_SETGPIO_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等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章