STM32中斷優(yōu)先級相關概念與使用筆記
1.ARM cortex_m3內(nèi)核支持256個中斷(16個內(nèi)核+240外部)和可編程256級中斷優(yōu)先級的設置,與其相關的中斷控制和中斷優(yōu)先級控制寄存器(NVIC、SYSTICK等)也都屬于cortex_m3內(nèi)核的部分。STM32采用了cortex_m3內(nèi)核,所以這部分仍舊保留使用,但STM32并沒有使用cortex_m3內(nèi)核全部的東西(如內(nèi)存保護單元MPU等),因此它的NVIC是cortex_m3內(nèi)核的NVIC的子集。
2.STM32目前支持的中斷共為84個(16個內(nèi)核+68個外部),和16級可編程中斷優(yōu)先級的設置(僅使用中斷優(yōu)先級設置8bit中的高4位,見后面解釋)?!秴⒖甲钚?01xx-107xx STM32 Reference manual, RM0008》。
3.以下主要對“外部中斷通道”進行說明。
對于cortex_m3內(nèi)核所支持的240個外部中斷,我在這里使用了“中斷通道”這個概念,因為盡管每個中斷對應一個外圍設備,但該外圍設備通常具備若干個可以引起中斷的中斷源或中斷事件。而該設備的所有的中斷都只能通過該指定的“中斷通道”向內(nèi)核申請中斷。因此,下面關于中斷優(yōu)先級的概念都是針對“中斷通道”的。當該中斷通道的優(yōu)先級確定后,也就確定了該外圍設備的中斷優(yōu)先級,并且該設備所能產(chǎn)生的所有類型的中斷,都享有相同的通道中斷優(yōu)先級。至于該設備本身產(chǎn)生的多個中斷的執(zhí)行順序,則取決于用戶的中斷服務程序。
4. STM32可以支持的68個外部中斷通道,已經(jīng)固定的分配給相應的外部設備。每個中斷通道都具備自己的中斷優(yōu)先級控制字節(jié)PRI_n(8位,但在STM32中只使用4位,高4位有效),每4個通道的8位中斷優(yōu)先級控制字(PRI_n)構成一個32位的優(yōu)先級寄存器(Priority Register)。68個通道的優(yōu)先級控制字至少構成17個32位的優(yōu)先級寄存器,它們是NVIC寄存器中的一個重要部分。
5.對于這4bit的中斷優(yōu)先級控制位還必須分成2組看:從高位開始,前面是定義搶先式優(yōu)先級的位,后面用于定義子優(yōu)先級。4bit的分組組合可以有以下幾種形式:
編 號
分配情況
7
0:4
無搶先式優(yōu)先級,16個子優(yōu)先級
6
1:3
2個搶先式優(yōu)先級,8個子優(yōu)先級
5
2:2
4個搶先式優(yōu)先級,4個子優(yōu)先級
4
3:1
8個搶先式優(yōu)先級,2個子優(yōu)先級
3/2/1/0
4:0
16個搶先式優(yōu)先級,無子優(yōu)先級
6.在一個系統(tǒng)中,通常只使用上面5種分配情況的一種,具體采用哪一種,需要在初始化時寫入到一個32位寄存器AIRC(Application Interrupt and Reset Control Register)
的第[10:8]這3個位中。這3個bit位有專門的稱呼:PRIGROUP(具體寫操作后面介紹)。比如你將0x05(即上表中的編號)寫到AIRC的[10:8]中,那么也就規(guī)定了你的系統(tǒng)中只有4個搶先式優(yōu)先級,相同的搶先式優(yōu)先級下還可以有4個不同級別的子優(yōu)先級。
7.AIRC中PRIGROUP的值規(guī)定了設置和確定每個外部中斷通道優(yōu)先級的格式。例如,在上面將0x05寫入了AIRC中PRIGROUP,也就規(guī)定了當前系統(tǒng)中只能有4個搶先式優(yōu)先級,相同的搶先式優(yōu)先級下還可以有4個不同級別的子優(yōu)先級,他們分別為:
位[7:6]
位[5:4]
位[3:0]
00
0號搶先優(yōu)先級
00
0號子優(yōu)先級
無效
01
1號搶先優(yōu)先級
01
1號子優(yōu)先級
無效
10
2號搶先優(yōu)先級
10
2號子優(yōu)先級
無效
11
3號搶先優(yōu)先級
11
3號子優(yōu)先級
無效
8.如果在你的系統(tǒng)中使用了TIME2(中斷通道28)和EXTI0(中斷通道6)兩個中斷,而TIME2中斷必須優(yōu)先響應,而且當系統(tǒng)在執(zhí)行EXIT0中斷服務時也必須打斷(搶先、嵌套),就必須設置TIME2的搶先優(yōu)先級比EXTI0的搶先優(yōu)先級要高(數(shù)目小)。假定EXTI0為2號搶先優(yōu)先級,那么TIME2就必須設置成0或1號搶先優(yōu)先級。這些工作需要在AIRC中的PRIGROUP設置完成,確定了整個系統(tǒng)所具有的優(yōu)先級個數(shù)后,再分別對每個中斷通道(設備)進行設置。
9.具體優(yōu)先級的確定和嵌套規(guī)則。ARM cortex_m3(STM32)規(guī)定
a/ 只能高搶先優(yōu)先級的中斷可以打斷低搶先優(yōu)先級的中斷服務,構成中斷嵌套。
b/ 當2(n)個相同搶先優(yōu)先級的中斷出現(xiàn),它們之間不能構成中斷嵌套,但STM32首先響應子優(yōu)先級高的中斷。
c/ 當2(n)個相同搶先優(yōu)先級和相同子優(yōu)先級的中斷出現(xiàn),STM32首先響應中斷通道所對應的中斷向量地址低的那個中斷(見ROM0008,表52)。
具體一點:
0號搶先優(yōu)先級的中斷,可以打斷任何中斷搶先優(yōu)先級為非0號的中斷;1號搶先優(yōu)先級的中斷,可以打斷任何中斷搶先優(yōu)先級為2、3、4號的中斷;……;構成中斷嵌套。
如果兩個中斷的搶先優(yōu)先級相同,誰先出現(xiàn),就先響應誰,不構成嵌套。如果一起出現(xiàn)(或掛在那里等待),就看它們2個誰的子優(yōu)先級高了,如果子優(yōu)先級也相同,就看它們的中斷向量位置了。
10.上電Reset后,寄存器AIRC中PRIGROUP[10:8]的值為0(編號0),因此此時系統(tǒng)使用16個搶先優(yōu)先級,無子優(yōu)先級。另外由于所有外部中斷通道的優(yōu)先級控制字PRI_n也都是0,所以根據(jù)上面的定義可以得出,此時68個外部中斷通道的搶先優(yōu)先級都是0號,沒有子優(yōu)先級的區(qū)分。故此時不會發(fā)生任何的中斷嵌套行為,誰也不能打斷當前正在執(zhí)行的中斷服務。當多個中斷出現(xiàn)后,則看它們的中斷向量地址:地址越低,中斷級別越高,STM32優(yōu)先響應。
注意:此時內(nèi)部中斷的搶先優(yōu)先級也都是0號,由于它們的中斷向量地址比外部中斷向量地址都低,所以它們的優(yōu)先級比外部中斷通道高,但如果此時正在執(zhí)行一個外部中斷服務,它們也必須排隊等待,只是可以插隊,當正在執(zhí)行的中斷完成后,它們可以優(yōu)先得到執(zhí)行。
了解以上基本概念還是不夠的,還要了解具體中斷的控制有那些途徑,中斷服務程序如何正確的編寫。下面的描述主要以TIME2通道為例。
二、中斷控制
1.對于STM32講,外部中斷通道位置28(35號優(yōu)先級)是給外部設備TIME2的,但TIME2本身能夠引起中斷的中斷源或事件有好多個,比如更新事件(上溢/下溢)、輸入捕獲、輸出匹配、DMA申請等。所有TIME2的中斷事件都是通過一個TIME2的中斷通道向STM32內(nèi)核提出中斷申請,那么STM32中如何處理和控制TIME2和它眾多的、不同的、中斷申請呢?
(題外話:STM32中的一個通用定時計數(shù)器,就比8位控制器(如AVR,MCS-51就更不必說了)中TIME要復雜多了。學過AVR的,可能對輸入捕獲、輸出匹配等還有概念,但如果你學的標準架構的MCS-51,那么上手32位可能困難就更多了。所以我一直推薦學習8位機應該認真的從AVR開始。盡管51有很大的市場,價格也相對便宜,但從長遠的眼光看問題,從后續(xù)掌握32位的使用,考慮到學生的可持續(xù)發(fā)展,AVR應該是比較好的選擇。)
2.cortex_m3內(nèi)核對于每一個外部中斷通道都有相應的控制字和控制位,用于單獨的和總的控制該中斷通道。它們包括有:
評論