1.什么是中斷
打斷CPU執(zhí)行正常的程序,轉(zhuǎn)而處理緊急程序,然后返回原暫停的程序繼續(xù)運行,就叫中斷。
2.中斷向量表
2.1 系統(tǒng)中斷
其中,系統(tǒng)中斷表 及對應的說明 如下圖所示:
我們可以按住 Ctrl 點擊中斷向量表中的 ISR 函數(shù)名,可以進入該函數(shù),可以發(fā)現(xiàn),這些系統(tǒng)函數(shù)雖然都定義了,但是沒有編寫其工作方式,即函數(shù)體。
例如:按如下操作:
第1 步:
第2步:
此就是滴答中斷函數(shù):(其他找到 中斷函數(shù)的方法 都一樣)
如果用戶需要對中斷內(nèi)容進行定義,就要在對應的中斷函數(shù)內(nèi)編寫對應的中斷執(zhí)行代碼。
其中,SysTick是個非常有用的定時中斷,它能精確產(chǎn)生 1ms 的定時供用戶使用。
2.2 外部可屏蔽中斷(82個可屏蔽中斷)
NVIC采用4位二進制數(shù)設置中斷優(yōu)先級,分為 搶占優(yōu)先級 和 次優(yōu)先級。
1.搶占優(yōu)先級 和 次優(yōu)先級 相同的情況下,自然優(yōu)先級越高,就先執(zhí)行;
2.次優(yōu)先級 相同的情況下,即使次優(yōu)先級 高的中斷正在執(zhí)行,搶占優(yōu)先級 高 的中斷也可以打斷它,并先執(zhí)行;
3.次優(yōu)先級 高的中斷不能打斷 次優(yōu)先級 低的中斷;
注意:中斷優(yōu)先級別設置非常重要,但該工作都可以在CUBEMX中可視化完成,比較簡單。
在CUBEMX中設置NVIC方法如下:
中斷的相關函數(shù)所在位置:
3.外部中斷的使用
3.1 23個EXIT外部中斷線(16個GPIO線關聯(lián),7個外部事件關聯(lián))
? STM32F407有23個外部中斷,其中16個與GPIO引腳相掛鉤(如下圖所示),另外7個EXIT線與其他外設產(chǎn)生的事件信號相關聯(lián)。
外部中斷EXIT線共用及ISR函數(shù)情況:
另外7個EXIT線連接的對應事件信號:
3.2 跟GPIO相關的EXIT外部中斷線函數(shù)
4.外部中斷按鍵示例
要求:以外部中斷方式檢測按鍵按下,并控制LED的亮滅
第1步:導入先前建立的.ioc文件,就可以在原來的MX配置文件中繼續(xù)添加功能了
第2步:輸入新的工程文件名
第3步:將引腳從原來的“輸入模式”修改為 “外部中斷”模式
按鍵引腳修改完成以后的前后對比:
修改以前:
修改以后:
然后設置NVIC優(yōu)先級:
第4步:保存,點擊生成代碼:
第5步 生成代碼分析
main.c主程序分析:
main.h 對引腳號、端口的宏定義:
在文件 stm32f4xx_it.c中,自動生成了4個ISR的代碼框架,如下圖所示:
按CTRL鍵,進入到該函數(shù)
HAL_GPIO_EXTI_IRQHandler()
中,這些ISR最終都要調(diào)用回調(diào)函數(shù)
HAL_GPIO_EXTI_Callback()
如下圖所示:
因此,我們只需要重新實現(xiàn) 該 回調(diào)函數(shù) 的功能, 就可以完成中斷的任務了。
第6步 編寫用戶功能代碼
在其中調(diào)用外部中斷軟中斷的宏函數(shù):
在gpio.c中,用戶沙箱中重新編寫該“回調(diào)函數(shù)”:
/* USER CODE BEGIN 2 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == Key_Up_Pin) //上按鍵 按下,兩LED燈翻轉(zhuǎn)
{
HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
HAL_Delay(500);
}
else if(GPIO_Pin == Key_Right_Pin) //右上按鍵 按下,LED2燈翻轉(zhuǎn)
{
HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
HAL_Delay(1000);
}
else if(GPIO_Pin == KeyDown_Pin) //下上按鍵 按下,上按鍵產(chǎn)生軟中斷,兩LED燈翻轉(zhuǎn)
{
__HAL_GPIO_EXTI_GENERATE_SWIT(Key_Up_Pin);
HAL_Delay(1000);
}
else if(GPIO_Pin == KeyLeft_Pin) //左上按鍵 按下,LED1燈翻轉(zhuǎn)
{
HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
HAL_Delay(1000);
}
}
/* USER CODE END 2 */
還需要對以下系統(tǒng)函數(shù)調(diào)整語句位置:
最后實現(xiàn)功能:文章來源:http://www.zghlxwxcb.cn/news/detail-849702.html
- 按下 上按鍵,兩個LED輸出翻轉(zhuǎn);
- 按下 下按鍵,產(chǎn)生EXTI0軟中斷,模擬 上按鍵 按下;
- 按下 右按鍵,LED2輸出翻轉(zhuǎn);
- 按下 左按鍵,LED1輸出翻轉(zhuǎn);
中斷優(yōu)先級測試:
文章來源地址http://www.zghlxwxcb.cn/news/detail-849702.html
- 按下 左按鍵 后,再快速按下右按鍵 ,LED2不會立刻翻轉(zhuǎn),需要等待1000ms后再變化。
- 按下 下按鍵,產(chǎn)生EXTI0軟中斷,執(zhí)行1000ms的延時后,再進入 上按鍵 產(chǎn)生的中斷,實現(xiàn)兩LED翻轉(zhuǎn)。
到了這里,關于2.外部中斷方式檢測按鍵輸入并控制LED示例的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!