由於各種外設都可以有中斷,今天我們就來實際使用一種比較簡單的中斷-外部中斷,但卻是非常重要的功能。
外部中斷顧名思義就是在外部來發起中斷請求,例如用一個按鈕連接到腳位,當按鈕按下時,腳位產生電位的變化,就可以透過按鈕來發起中斷。
在講更詳細一些,STM32進入中斷的時機有兩種,一種是低電位變高電位時,也就是電位上升的過程(上升緣檢測);另一種是高電位變低電位時,也就是電位下降的過程(下降緣檢測),這兩種都屬於邊緣檢測,也就是只有在電位改變時才會檢測到。
開發版上已經有現成的按鈕可以使用,不必自己在接線路,非常方便。
由datasheet可以知道,按鈕是連接在PC13腳位上。也就是說當你按下按鈕後,PC13就會輸入高電位,而放開則為低電位。我們就可以利用按鈕來讓電位從低變高(上升緣),從而觸發中斷。實際設定如下:
__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)。
實際使用時,不一定要使用開發板上面的按鈕,可以設為任何一個腳位,我們就可以利用輸入腳位的電位不同來觸發中斷。例如我們可以外接幾個按鈕,每個按鈕分別代表不同的任務,當按下時就會觸發中斷執行相應的任務。
由datasheet可以知道,按鈕是連接在PC13腳位上。
想請問這邊要怎麼看得懂datasheet去找按鈕對應到哪個腳位上?謝謝