STM32 cube外部中斷教程
阿新 • • 發佈:2021-10-27
STM32 cube外部中斷的使用
啥是中斷?
作為一個工程師,遇到問題的第一反應就是上網搜
百度:
中斷是指計算機執行過程中,出現某些意外情況需主機干預時,機器能自動停止正在執行的程式並轉入處理新情況的程式,處理完畢後又返回原被暫停的程式繼續執行。
舉個栗子:
類比一下
在實際的程式碼中,HAL庫的中斷處理機制較為複雜:
startup_stm32f103xb.s通過彙編註冊了中斷處理函式EXTI1_IRQHandler()
在stm32f1xx_it.c中,EXTI_IRQHandler()引用了HAL庫的處理函式HAL_GPIO_EXTI_IRQHandler(),其功能主要為判斷具體的中斷原因,並呼叫對應的中斷回撥函式:HAL_GPIO_EXTI_Callback()
使用者可以自己重宣告中斷回撥函式(HAL_GPIO_EXTI_Callback()),在其中寫入自己的使用者邏輯
不出意外的話,你這時候可能會有點懵
上圖!
中斷處理函式寫在EXTI_IRQHandler()裡或HAL_GPIO_EXTI_Callback()皆可
不過HAL_GPIO_EXTI_Callback()需要重新宣告,比如
對於程式碼的意思不必理會,只需知道這些是自己按需求寫的void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(HAL_GetTick()-t>30) { if(GPIO_Pin == GPIO_PIN_1) { duty_cycle=duty_cycle+100; __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_4,duty_cycle); } if(GPIO_Pin == GPIO_PIN_2) { duty_cycle=duty_cycle-100; __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_4,duty_cycle); } } t=HAL_GetTick(); }
下面開始連線硬體:
開始配置工程
- 開啟CUBE
- File->New Project
-
找到晶片
-
使能RCC
-
使能Debug
-
配置時鐘樹
-
配置引腳
-
使能外部中斷
-
配置專案資訊
-
然後點選右上角GENERATE CODE生成程式碼
完成後點選OPEN PROJECT
keil新增程式碼
Hal_GPIO_TogglePin()這個函式可以反轉引腳電平,以控制小燈亮滅
多加的那幾行程式碼用來做一個簡單的消抖(如果不知道消抖的話,建議百度“按鍵消抖”)
然後編譯,下載
如果沒出問題的話,每按一次按鍵,燈都會改變一次亮滅狀態
上面用的是xxxit.c中的Handler函式,下面試一試Callback函式
註釋掉剛才加的程式碼,在main.c中新增如下程式碼
編譯,下載,執行,效果應該跟剛才一樣
下面試一下TIM中斷
(要繃不住了,下面的粗製爛造一下)
搞完後,小燈應該每秒閃爍5次
注意:
- 中斷裡不要使用延時函式(Hal_Delay())
- TIM中斷要手動開啟(Hal_TIM_Base_Start_IT())