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