iT邦幫忙

2021 iThome 鐵人賽

DAY 13
1
Arm Platforms

STM32 基礎入門教學系列 第 13

【Day13】:EXTI外部中斷/事件控制器

外部中斷

由於各種外設都可以有中斷,今天我們就來實際使用一種比較簡單的中斷-外部中斷,但卻是非常重要的功能。
外部中斷顧名思義就是在外部來發起中斷請求,例如用一個按鈕連接到腳位,當按鈕按下時,腳位產生電位的變化,就可以透過按鈕來發起中斷。
在講更詳細一些,STM32進入中斷的時機有兩種,一種是低電位變高電位時,也就是電位上升的過程(上升緣檢測);另一種是高電位變低電位時,也就是電位下降的過程(下降緣檢測),這兩種都屬於邊緣檢測,也就是只有在電位改變時才會檢測到。
https://ithelp.ithome.com.tw/upload/images/20210915/20141525hm7AhQS6aD.jpg

實作-利用開發版上的按鈕執行外部中斷

開發版上已經有現成的按鈕可以使用,不必自己在接線路,非常方便。
https://ithelp.ithome.com.tw/upload/images/20210915/20141525rgvTMebjTV.jpg
由datasheet可以知道,按鈕是連接在PC13腳位上。也就是說當你按下按鈕後,PC13就會輸入高電位,而放開則為低電位。我們就可以利用按鈕來讓電位從低變高(上升緣),從而觸發中斷。實際設定如下:

  1. 先將PC13腳位設為GPIO_EXTI_13
    https://ithelp.ithome.com.tw/upload/images/20210915/20141525vP1j7C6mi3.jpg
  2. 接著可以在System Core 內的 GPIO選擇剛剛的PC13腳位來設定GPIO mode,可以設定觸發中斷的時機。
  3. 接著在NVIC的地方將剛剛腳位的中斷設為Enabled
    https://ithelp.ithome.com.tw/upload/images/20210915/20141525WpDJiIBai8.jpg
    接下來我們來寫程式吧
    外部中斷觸發的函式是:
__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(GPIO_Pin);
  /* NOTE: This function Should not be modified, when the callback is needed,
           the HAL_GPIO_EXTI_Callback could be implemented in the user file
   */
}

「觸發這個函式」的意思就是呼叫這個函式,當按鈕按下時,腳位偵測到上升緣,就會進行中斷觸發,
函式的開頭有__weak,用在函式前,代表這個函式是弱定義,當你的程式碼其他地方有對這個函式就其他地方做定義,就會以新的定義為主,那有人可能會問,這樣他定義這個有什麼用呢?
就是給你複製的...通常不熟悉的人很難記住函式的API,照著打出來,因此你可以先到gpio.c當中找到這些程式碼,直接複製到main.c當中,就可以直接使用了。
實際程式碼演示:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  /* Prevent unused argument(s) compilation warning */
	if(GPIO_Pin == GPIO_PIN_13){
		x = (x == 0)? 1:0;
	}
}

記得在全域設一個變數x
這段函式可以放在程式碼任何一個位置,我通常會放在 USER CODE BEGIN/END 4 之間
在EXTI模式當中,你只能用數字不同的腳位,例如PE9,PC9不可同時都為EXTI模式,一次只能有一個,從他的中斷函式也可以知道,他的參數只有GPIO_PIN,他只知道數字多少,而不知道英文(A~F)哪一個。若你有很多的外部中斷,你就可以用if-else的方式來決定哪一個腳位的中斷要做什麼事。
編寫完程式後,我們就可以用利用按鈕來改變x的值啦~每按一次按鈕x值就會改變(0變1或1變0)。

實際使用時,不一定要使用開發板上面的按鈕,可以設為任何一個腳位,我們就可以利用輸入腳位的電位不同來觸發中斷。例如我們可以外接幾個按鈕,每個按鈕分別代表不同的任務,當按下時就會觸發中斷執行相應的任務。


上一篇
【Day12】:NVIC中斷概要
下一篇
【Day14】:STM32輾壓Arduino的功能—TIM(上)
系列文
STM32 基礎入門教學15

尚未有邦友留言

立即登入留言