主要參考: startup_stm32f10x_hd.s,?stm32f10x_exti.h,?stm32f10x_exti.c,另外,這里說的外部中斷是相對于M3內(nèi)核之外的,主要是外設(shè)中斷如:如I/O口相應(yīng)的外接設(shè)備中斷,USART、Timer等其它本身固件中斷。
? ? ? 對于?cortex_m3?內(nèi)核所支持的?240?個外部中斷,這里使用了“中斷通道”這個概念,因為盡管每個中斷對應(yīng)一個外圍設(shè)備,但該外圍設(shè)備通常具備若干個可以引起中斷的中斷源或中斷事件。而該設(shè)備的所有的中斷都只能通過該指定的“中斷通道”向內(nèi)核申請中斷。因此,關(guān)于中斷優(yōu)先級的概念都是針對“中斷通道”的。當(dāng)該中斷通道的優(yōu)先級確定后,也就確定了該外圍設(shè)備的中斷優(yōu)先級,并且該設(shè)備所能產(chǎn)生的所有類型的中斷,都享有相同的通道中斷優(yōu)先級。至于該設(shè)備本身產(chǎn)生的多個中斷的執(zhí)行順序,則取決于用戶的中斷服務(wù)程序。 ? ? ? ? ??STM32?可以支持的?68?個外部中斷通道,已經(jīng)固定的分配給相應(yīng)的外部設(shè)備。每個中斷通道都具備自己的中斷優(yōu)先級控制字節(jié)?PRI_n(8?位,但在?STM32?中只使用?4?位,高?4?位有效)?,?每?4?個通道的?8?位中斷優(yōu)先級控制字?(PRI_n)?構(gòu)成一個?32?位的優(yōu)先級寄存器?(PriorityRegister)?。68?個通道的優(yōu)先級控制字至少構(gòu)成?17?個?32?位的優(yōu)先級寄存器,它們是?NVIC寄存器中的一個重要部分(具體參考本組:嵌套的向量式中斷控制器(NVIC))。 ? 比如: ? ? ? 如果在你的系統(tǒng)中使用了?TIME2(中斷通道?28)和?EXTI0(中斷通道?6)兩個中斷,而TIME2?中斷必須優(yōu)先響應(yīng),而且當(dāng)系統(tǒng)在執(zhí)行?EXIT0?中斷服務(wù)時也必須打斷(搶先、嵌套)?,就必須設(shè)置?TIME2?的搶先優(yōu)先級比?EXTI0?的搶先優(yōu)先級要高(數(shù)目?。?。假定?EXTI0?為?2?號搶先優(yōu)先級,那么?TIME2?就必須設(shè)置成?0?或?1?號搶先優(yōu)先級。這些工作需要在?AIRC?中的PRIGROUP?設(shè)置完成,確定了整個系統(tǒng)所具有的優(yōu)先級個數(shù)后,再分別對每個中斷通道(設(shè)備)進(jìn)行設(shè)置。 ? 這些中斷優(yōu)先級的確定和嵌套規(guī)則,在ARM?cortex_m3(STM32)有規(guī)定: 只能高搶先優(yōu)先級的中斷可以打斷低搶先優(yōu)先級的中斷服務(wù),構(gòu)成中斷嵌套。 當(dāng)?2(n)個相同搶先優(yōu)先級的中斷出現(xiàn),它們之間不能構(gòu)成中斷嵌套,但?STM32?首先響應(yīng)子優(yōu)先級高的中斷。 當(dāng)?2(n)個相同搶先優(yōu)先級和相同子優(yōu)先級的中斷出現(xiàn),STM32?首先響應(yīng)中斷通道所對應(yīng)的中斷向量地址低的那個中斷(當(dāng)多個中斷出現(xiàn)后,則看它們的中斷向量地址:地址越低,中斷級別越高,STM32優(yōu)先響應(yīng)) 。 0?號搶先優(yōu)先級的中斷,可以打斷任何中斷搶先優(yōu)先級為非?0?號的中斷;1?號搶先優(yōu)先級的中斷,可以打斷任何中斷搶先優(yōu)先級為?2、3、4?號的中斷;……;構(gòu)成中斷嵌套。 如果兩個中斷的搶先優(yōu)先級相同,誰先出現(xiàn),就先響應(yīng)誰,不構(gòu)成嵌套。如果一起出現(xiàn)(或掛在那里等待)?,就看它們?2?個誰的子優(yōu)先級高了,如果子優(yōu)先級也相同,就看它們的中斷向量位置了。 ? 再比如: ? ? ? 上電?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ā)生任何的中斷嵌套行為,?誰也不能打斷當(dāng)前正在執(zhí)行的中斷服務(wù)。當(dāng)多個中斷出現(xiàn)后,則看它們的中斷向量地址:地址越低,中斷級別越高,STM32優(yōu)先響應(yīng)(可在啟動文件里查找)。 ? PS:?此時內(nèi)部中斷的搶先優(yōu)先級也都是?0?號,?由于它們的中斷向量地址比外部中斷向量地址都低,?所以它們的優(yōu)先級比外部中斷通道高,?但如果此時正在執(zhí)行一個外部中斷服務(wù),它們也必須排隊等待,只是可以插隊,當(dāng)正在執(zhí)行的中斷完成后,它們可以優(yōu)先得到執(zhí)行。