中斷作為stm32中必不可少的一個功能,其重要性是不言而喻的因此把中斷學習好是根本。
所以今天就來好好啃一下中斷配置的知識,俗話說:磨刀不誤砍柴工。問題是什么呢?項目中我用到了一個觸摸鍵盤TTP229,結果在測試鍵盤時,不能夠輸入密碼?最終,調試出bug就是由於中斷優先級的影響。
本項目使用到的是STM32F030C8型號的MCU,我們可以從官方下載到的標准庫文件中的啟動匯編文件中,查看到本型號單片機的外部中斷向量表。(如下圖所示)
首先,我們了解一下NVIC是什么,在core_cm0.h文件中的標准庫中的NVIC結構體。
其中,我們一般只用到ISER、ICER、IP這3個寄存器。ISER用於使能中斷,ICER用來清除中斷,IP用來設置中斷優先級。
其次,我們了解一下中斷優先級,中斷優先級寄存器NVIC_IPRx,本寄存器寬度為8位,原則上每個外部中斷可配置的優先級為0~255,實際上精簡了,只用到了它的高4位。這4位,又被分成了搶占優先級和響應優先級兩組,然后,中斷優先級有分為以下幾種情況:
1、搶占優先級不同,會涉及到中斷嵌套,搶占優先級高的會優先搶占優先級低的,優先得到執行。(注意:優先級數字越小,優先級越高)
2、搶占優先級相同,不涉及到中斷嵌套,響應優先級不同,響應優先級高的先響應。(例如:兩個中斷同時響應,這里就會先執行響應優先級高的那個中斷)(注意:優先級數字越小,優先級越高)
3、搶占優先級和響應優先級都相同,則比較它們的硬件中斷編號,中斷編號越小,優先級越高。(硬件中斷編號從中斷向量表當中查看)
中斷優先級分組,因為中斷優先級只使用了高4位,所以,中斷優先級的分組分別有以下幾種情況:
最后,總結一下中斷編程的三步曲:
第一步:使能外設某個中斷,具體由對應的中斷使能位控制。
(例如:我們使用到GPIO之前必須開啟GPIO端口的時鍾,用到EXTI必須開啟AFIO時鍾)
第二步:初始化NVIC_InitTypeDef結構體,配置中斷優先級分組,設置搶占優先級和響應優先級,使能中斷請求。
庫函數:
NVIC_IRQChannel()設置不同的中斷源,在IRQn_Type IRQn結構體尋找自己對應的中斷源。
NVIC_IRQChannelPreemptionPriority()設置搶占優先級
NVIC_IRQChannelCmd() 中斷使能或者取消使能
第三步:編寫中斷服務函數,在stm32f0xx_it.c文件中,都有一個根據中斷向量表,實現的一個空的中斷服務函數,需要我們自己重新編寫。
stm32相關的視頻資料
(stm32直流電機驅動)
http://www.makeru.com.cn/live/1392_1218.html?s=45051
(時鍾系統)
http://www.makeru.com.cn/live/1392_1082.html?s=45051
STM32中斷系統
http://www.makeru.com.cn/live/3523_1745.html?s=45051
STM32可以這樣玩
http://www.makeru.com.cn/live/4034_1460.html?s=45051
分析STM32的的開發方式
http://www.makeru.com.cn/live/3523_1673.html?s=45051