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