1. 程式人生 > 其它 >STM32 cube外部中斷教程

STM32 cube外部中斷教程

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();
}
對於程式碼的意思不必理會,只需知道這些是自己按需求寫的

下面開始連線硬體:

開始配置工程

  1. 開啟CUBE
  2. File->New Project
  1. 找到晶片

  2. 使能RCC

  3. 使能Debug

  4. 配置時鐘樹

  5. 配置引腳

  6. 使能外部中斷

  7. 配置專案資訊

  8. 然後點選右上角GENERATE CODE生成程式碼

完成後點選OPEN PROJECT

keil新增程式碼

Hal_GPIO_TogglePin()這個函式可以反轉引腳電平,以控制小燈亮滅

多加的那幾行程式碼用來做一個簡單的消抖(如果不知道消抖的話,建議百度“按鍵消抖”)

然後編譯,下載
如果沒出問題的話,每按一次按鍵,燈都會改變一次亮滅狀態

上面用的是xxxit.c中的Handler函式,下面試一試Callback函式

註釋掉剛才加的程式碼,在main.c中新增如下程式碼

編譯,下載,執行,效果應該跟剛才一樣

下面試一下TIM中斷

(要繃不住了,下面的粗製爛造一下)
搞完後,小燈應該每秒閃爍5次

注意:

  • 中斷裡不要使用延時函式(Hal_Delay())
  • TIM中斷要手動開啟(Hal_TIM_Base_Start_IT())