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位,所以,中斷優先順序的分組分別有以下幾種情況:
優先順序分組 |
搶佔優先順序 |
響應優先順序 |
描述 |
NVIC_PriorityGroup_0 |
0 |
0到15的取值 |
高4位全部是響應優先順序,無搶佔優先順序 |
NVIC_PriorityGroup_1 |
0到1的取值 |
0到7的取值 |
搶佔優先順序為1位,響應優先順序為3位 |
NVIC_PriorityGroup_2 |
0到3的取值 |
0到3的取值 |
搶佔優先順序為2位, 響應優先順序為2位 |
NVIC_PriorityGroup_3 |
0到7的取值 |
0到1的取值 |
搶佔優先順序為3位,響應優先順序為1位 |
NVIC_PriorityGroup_4 |
0到15的取值 |
0 |
高4位全部是搶佔優先順序,無響應優先順序 |
最後,總結一下中斷程式設計的三步曲:
第一步:使能外設某個中斷,具體由對應的中斷使能位控制。
(例如:我們使用到GPIO之前必須開啟GPIO埠的時鐘,用到EXTI必須開啟AFIO時鐘)
第二步:初始化NVIC_InitTypeDef結構體,配置中斷優先順序分組,設定搶佔優先順序和響應優先順序,使能中斷請求。
庫函式:
NVIC_IRQChannel()設定不同的中斷源,在IRQn_Type IRQn結構體尋找自己對應的中斷源。
NVIC_IRQChannelPreemptionPriority()設定搶佔優先順序
NVIC_IRQChannelCmd() 中斷使能或者取消使能
第三步:編寫中斷服務函式,在stm32f0xx_it.c檔案中,都有一個根據中斷向量表,實現的一個空的中斷服務函式,需要我們自己重新編寫。