版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Stm32中斷優(yōu)先級(jí)相關(guān)概念與使用筆記一、基本概念1ARM cortex_m3內(nèi)核支持256個(gè)中斷(16個(gè)內(nèi)核+240外部)和可編程256級(jí)中斷優(yōu)先級(jí)的設(shè)置,與中斷控制核中斷優(yōu)先級(jí)控制的寄存器(NVIC、SYSTICK等)屬于cortex_m3內(nèi)核的部分。STM32采用了cortex_m3內(nèi)核,所以這些部分仍舊保留使用,但并不是完全使用的,只是使用了一部分。2STM32目前支持的中斷共為84個(gè)(16個(gè)內(nèi)核+68個(gè)外部),和16級(jí)可編程中斷優(yōu)先級(jí)的設(shè)置(僅使用中斷優(yōu)先級(jí)設(shè)置8bit中的高4位,見(jiàn)后面解釋?zhuān)⒖甲钚?01xx-107xx STM32 Reference manual, RM000
2、8。以下主要對(duì)外部中斷進(jìn)行說(shuō)明。368個(gè)外部中斷(通道)在STM32中已經(jīng)固定的分配給相應(yīng)的外部設(shè)備,每個(gè)中斷通道都具備自己的中斷優(yōu)先級(jí)控制字節(jié)PRI_n(8位,但在STM32中只有高4位有效),每4個(gè)通道的8位中斷優(yōu)先級(jí)控制字(PRI_n)構(gòu)成一個(gè)32位的優(yōu)先級(jí)寄存器(Priority Register)。68個(gè)通道的優(yōu)先級(jí)寄存器至少有是17個(gè)32位的寄存器,它們是NVIC寄存器的一部分。4這4bit的中斷優(yōu)先級(jí)控制位還要分成2組看,從高位開(kāi)始,前面的定義搶先式優(yōu)先級(jí),后面為子優(yōu)先級(jí)。4bit的組合可以有以下幾種形式:5在一個(gè)系統(tǒng)中,通常只使用上面5種分配情況的一種,具體采用哪一種,需要在初
3、始化時(shí)寫(xiě)入到一個(gè)32位寄存器AIRC(Application Interrupt and Reset Control Register)的第10:8這2個(gè)位中。這3個(gè)bit位有專(zhuān)門(mén)的稱(chēng)呼:PRIGROUP(具體寫(xiě)操作后面介紹)。比如你將0x05(上表的編號(hào))寫(xiě)到AIRC的10:8中,那么也就規(guī)定了你的系統(tǒng)中只有4個(gè)搶先式優(yōu)先級(jí),相同的搶先式優(yōu)先級(jí)下還可以有4個(gè)不同級(jí)別的子優(yōu)先級(jí)。6AIRC中PRIGROUP的值規(guī)定了設(shè)置和確定每個(gè)外部中斷通道優(yōu)先級(jí)的格式。例如,在上面將0x05寫(xiě)入了AIRC中PRIGROUP,也就規(guī)定了當(dāng)前系統(tǒng)中只能有4個(gè)搶先式優(yōu)先級(jí),7如果在你的系統(tǒng)中使用了TIME2(中斷
4、通道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后進(jìn)行設(shè)置。8具體優(yōu)先級(jí)的確定和嵌套規(guī)則。ARM cortex_m3(STM32)規(guī)定a/ 只能高搶先優(yōu)先級(jí)的中斷可以打斷低搶先優(yōu)先級(jí)的中斷服務(wù),構(gòu)成中斷嵌套。b/ 當(dāng)2(n)個(gè)相同搶先優(yōu)先級(jí)的中斷出現(xiàn),它們之間不能構(gòu)成中斷嵌套,但STM32首先響應(yīng)子優(yōu)先級(jí)高的中斷。c/
5、 當(dāng)2(n)個(gè)相同搶先優(yōu)先級(jí)和相同子優(yōu)先級(jí)的中斷出現(xiàn),STM32首先響應(yīng)在該中斷通道向量地址低的中斷(ROM0008,表52)。具體一點(diǎn):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í)也相同,就看它們的中斷向量位置了。9上電RESET后,AIRC中PRIGROUP10:8,因此此時(shí)系統(tǒng)使用16個(gè)搶先優(yōu)先級(jí),無(wú)子優(yōu)先級(jí)。另外由于所有外部中斷通道的優(yōu)先級(jí)控制字
6、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)。注意:此時(shí)內(nèi)部中斷的搶先優(yōu)先級(jí)也都是0號(hào),由于它們的中斷向量地址比外部中斷向量地址都低,所以它們的優(yōu)先級(jí)比外部中斷高,但如果此時(shí)正在執(zhí)行一個(gè)外部中斷服務(wù),它們也必須排隊(duì)等待,只是可以插隊(duì),當(dāng)正在執(zhí)行的中斷完成后,它們可以優(yōu)先得到執(zhí)行。了解以上基本概念還是不夠的,還要了解具體中斷的控制有那些途徑,中斷服務(wù)程序如何正確的編寫(xiě)。下面的描
7、述主要以TIME2通道為例。二、中斷控制1對(duì)于STM32講,外部中斷通道位置28(35號(hào)優(yōu)先級(jí))是給外部設(shè)備TIME2的,但TIME2本身能夠引起中斷的中斷源或事件有好多個(gè),比如更新事件(上溢/下溢)、輸入捕獲、輸出匹配、DMA申請(qǐng)等。(題外話:就一個(gè)通用定時(shí)計(jì)數(shù)器,比8位控制器中TIME要復(fù)雜多了。學(xué)過(guò)AVR的,可能對(duì)輸入捕獲、輸出匹配等還有概念,如果你學(xué)的標(biāo)準(zhǔn)架構(gòu)的MCS-51,那么上手32位控制困難就更多了。所以我一直推薦學(xué)習(xí)8位應(yīng)該認(rèn)真從AVR開(kāi)始,盡管51有很大的市場(chǎng),價(jià)格也相對(duì)便宜些,但從發(fā)展的眼光,從后續(xù)掌握32位的使用,AVR是比較好的選擇。)所有TIME2的中斷事件都是通過(guò)一
8、個(gè)TIME2的中斷通道向STM32內(nèi)核提出申請(qǐng)的,那么STM32中如何處理和控制TIME2和它眾多的、不同的、中斷申請(qǐng)呢?2cortex_m3內(nèi)核對(duì)于每一個(gè)外部中斷通道都有相應(yīng)的控制字和控制位,用于單獨(dú)的和總的控制該中斷通道。它們包括有:中斷優(yōu)先級(jí)控制字:PRI_n(上面提到的)中斷允許設(shè)置位:在ISER寄存器中中斷允許清除位:在ICER寄存器中中斷懸掛Pending(排隊(duì)等待)位置位:在ISPR寄存器中(類(lèi)似于置中斷通道標(biāo)志位) 中斷懸掛Pending(排隊(duì)等待)位清除:在ICPR寄存器中(用于清除中斷通道標(biāo)志位) 正在被服務(wù)的中斷(Active)標(biāo)志位:在IABR寄存器中,(只讀,可以知道
9、當(dāng)前內(nèi)核正在處理哪個(gè)中斷通道)因此,與TIME2中斷通道相關(guān)的,在NVIC中有13個(gè)bits,它們是PRI_28,8個(gè) bits(只用高4位);中斷通道允許,中斷通道清除(相當(dāng)禁止),中斷通道Pending置位(我的理解是中斷請(qǐng)求發(fā)生了,但當(dāng)前有其它中斷服務(wù)在執(zhí)行,你的中斷級(jí)別又不能打斷別人,所以Pending等待,這個(gè)應(yīng)該由硬件置位的),中斷Pending位清除(可以通過(guò)軟件將本次中斷請(qǐng)求且尚處在Pending狀態(tài),取消掉),正在被服務(wù)的中斷(Active)標(biāo)志位,各1個(gè)bit。上面的控制字和控制位都是在NVIC中的寄存器組中,可惜的是在STM32中竟然不給出任何的解釋和說(shuō)明。3作為外圍設(shè)備
10、TIME2本身也包括更具體的,管理自己不同中斷的中斷控制器(位),它們主要是各個(gè)不同類(lèi)型中斷的允許控制位,和各自相應(yīng)中斷標(biāo)志位。(這個(gè)STM32的手冊(cè)中有詳細(xì)的說(shuō)明了)4在弄清楚2、3兩點(diǎn)的基礎(chǔ)上,我們可以看看TIME2的中斷過(guò)程,以及如何控制的了。a/ 初始化過(guò)程設(shè)置AIRC中PRIGROUP的值,規(guī)定系統(tǒng)中的搶先優(yōu)先級(jí)和子優(yōu)先級(jí)的個(gè)數(shù)(在4個(gè)bits中占用的位數(shù))設(shè)置TIME2本身的寄存器,允許相應(yīng)的中斷,如允許UIE(TIME2_DIER的第0位) 設(shè)置TIME2中斷通道的搶先優(yōu)先級(jí)和子優(yōu)先級(jí)(PRI_28,在NVIC寄存器組中) 設(shè)置允許TIME2中斷通道。在NVIC寄存器組的ISER
11、寄存器中的一位。b/ 中斷響應(yīng)過(guò)程當(dāng)TIME2的UIE條件成立(更新,上溢或下溢),硬件將TIME2本身寄存器中UIE中斷標(biāo)志置位,然后通過(guò)TIME2中斷通道向內(nèi)核申請(qǐng)中斷。此時(shí)硬件將TIME2的Pending標(biāo)志置位,相當(dāng)與中斷通道標(biāo)志置位,表示TIME2有中斷申請(qǐng)。如果當(dāng)前有中斷在處理,TIME2的中斷級(jí)別不高,那么就保持Pending,當(dāng)然軟件可以通過(guò)寫(xiě)ICPR寄存器中相應(yīng)的位把本次中斷清除掉。當(dāng)內(nèi)核有空,開(kāi)始響應(yīng)TIME2的中斷,進(jìn)入TIME2的中斷服務(wù)。此時(shí)硬件將IABR寄存器中相應(yīng)的標(biāo)志位置位,表示TIME2中斷正在被處理。同時(shí)硬件清除TIME2的Pending標(biāo)志位。c/ 執(zhí)行T
12、IME2的中斷服務(wù)程序所有TIME2的中斷事件,都是在一個(gè)TIME2中斷服務(wù)程序中完成的,所以進(jìn)入中斷程序后,中斷程序需要首先判斷是哪個(gè)TIME2的具體事件的中斷,然后轉(zhuǎn)移到相應(yīng)的服務(wù)代碼段去。注意不要忘了把該具體中斷事件的中斷標(biāo)志位清除掉,硬件是不會(huì)自動(dòng)清除TIME2寄存器中具體的中斷標(biāo)志位的。d/ 中斷返回執(zhí)行完中斷服務(wù)后,中斷返回過(guò)程,在這個(gè)過(guò)程中需要:硬件將IABR寄存器中相應(yīng)的標(biāo)志位清另,表示該中斷處理完成如果TIME2本身還有中斷標(biāo)志位置位,表示TIME2 還有中斷在申請(qǐng),則重新將TIME2的Pending標(biāo)志置為1,等待再次進(jìn)入TIME2的中斷服務(wù)。注意:以上中斷過(guò)程在ARM C
13、ortex-M3權(quán)威指南中有詳細(xì)描述,并配合時(shí)序圖說(shuō)明,可以參考。如果以上明白了,那么可以在ST提供的函數(shù)庫(kù)的幫助下,正確的設(shè)置和使用STM32的中斷系統(tǒng)了。如果你要了解更深入的東西,或者直接對(duì)寄存器操作,還要繼續(xù)望下看。三、深入NVIC1. 看看Cortex-M3中定義與NVIC相關(guān)的寄存器有那些SysTick Control and Status Register Read/write 0xE000E010 SysTick Reload Value Register Read/write 0xE000E014 SysTick Current Value Register Read/writ
14、e clear 0xE000E018 SysTick Calibration Value Register Read-only 0xE000E01CIrq 0 to 31 Set Enable Register Read/write 0xE000E100 . . . . .Irq 224 to 239 Set Enable Register Read/write 0xE000E11CIrq 0 to 31 Clear Enable Register Read/write 0xE000E180 . . . . .Irq 224 to 239 Clear Enable Register Read/
15、write 0xE000E19CIrq 0 to 31 Set Pending Register Read/write 0xE000E200 . . . . .Irq 224 to 239 Set Pending Register Read/write 0xE000E21CIrq 0 to 31 Clear Pending Register Read/write 0xE000E280 . . . . .Irq 224 to 239 Clear Pending Register Read/write 0xE000E29CIrq 0 to 31 Active Bit Register Read-o
16、nly 0xE000E300 . . . . . .Irq 224 to 239 Active Bit Register Read-only 0xE000E31CIrq 0 to 3 Priority Register Read/write 0xE000E400 . . . . .Irq 224 to 239 Priority Register Read/write 0xE000E4ECCPUID Base Register Read-only 0xE000ED00 Interrupt Control State Register Read/write or read-only 0xE000E
17、D04 Vector Table Offset Register Read/write 0xE000ED08 Application Interrupt/Reset Control Register Read/write 0xE000ED0C System Control Register Read/write 0xE000ED10 Configuration Control Register Read/write 0xE000ED14 System Handlers 4-7 Priority Register Read/write 0xE000ED18 System Handlers 8-1
18、1 Priority Register Read/write 0xE000ED1C System Handlers 12-15 Priority Register Read/write 0xE000ED20 . . . . .2Stm32中用了那些下面是從ST公司提供的函數(shù)庫(kù)的頭文件得到的,庫(kù)是v3.1.0/* memory mapping struct for Nested Vectored Interrupt Controller (NVIC) */typedef struct_IO uint32_t ISER8; /*!< Interrupt Set Enable Register
19、 */ uint32_t RESERVED024;_IO uint32_t ICER8; /*!< Interrupt Clear Enable Register */ uint32_t RSERVED124;_IO uint32_t ISPR8; /*!< Interrupt Set Pending Register */ uint32_t RESERVED224;_IO uint32_t ICPR8; /*!< Interrupt Clear Pending Register */ uint32_t RESERVED324;_IO uint32_t IABR8; /*!&
20、lt; Interrupt Active bit Register */ uint32_t RESERVED456;_IO uint8_t IP240; /*!< Interrupt Priority Register, 8Bit wide */ uint32_t RESERVED5644;_O uint32_t STIR; /*!< Software Trigger Interrupt Register */ NVIC_Type;a/ 寄存器ISER、ICER、ISPR、ICPR、IABR在STM32中都使用的8個(gè)(實(shí)際3個(gè)就夠了,后面的將來(lái)還要擴(kuò)充?)。這些32位的寄存器中每一
21、位對(duì)應(yīng)了一個(gè)中斷通道相應(yīng)的標(biāo)志。比如地址在0xE000E100的ISER0這個(gè)32位的寄存器,第0位是中斷通道0的允許位,第2位是中斷通道1的允許標(biāo)志第32位是中斷通道31的允許位;接下來(lái)地址在0xE000E104的ISER1則是中斷通道32-63的允許位。ICER、ISPR、ICPR、IABR的結(jié)構(gòu)相同,只是含義不同。注意是對(duì)這些寄存器的操作:寫(xiě)1表示置位或清除,寫(xiě)0無(wú)任何影響。例如:對(duì)0xE000E100的ISER0的第0位寫(xiě)1,表示允許中斷通道0中斷;但對(duì)0xE000E100的ISER0的第0位寫(xiě)0,則沒(méi)有任何作用,該位保持不變。如果要禁止中斷通道0的中斷響應(yīng),那么就必須:對(duì)0xE000
22、E180的ICER0的第0位寫(xiě)1,表示禁止中斷通道0的中斷;對(duì)0xE000E180的ICER0的第0位寫(xiě)0,也是不起任何作用的。b/ IP240用于定義240個(gè)外部中斷通道的優(yōu)先級(jí),每1個(gè)字節(jié)對(duì)應(yīng)一個(gè)通道。4個(gè)通道的IP構(gòu)成一個(gè)32位的寄存器。在STM32中最多有68個(gè)外部中斷通道,每個(gè)IP的1個(gè)字節(jié)中只使用高4位(見(jiàn)前面介紹)。IP的結(jié)構(gòu)如下:c/ 在ST公司提供的函數(shù)庫(kù)的頭文件中另一個(gè)數(shù)據(jù)結(jié)構(gòu)中,還有一個(gè)寄存器需要關(guān)注 :/* memory mapping struct for System Control Block */typedef struct_I uint32_t CPUID;
23、/*!<CPU ID Base Register */_IO uint32_t ICSR; /*!< Interrupt Control State Register */_IO uint32_t VTOR; /*!< Vector Table Offset Register */_IO uint32_t AIRCR; /*!< Application Interrupt / Reset Control Register */ _IO uint32_t SCR; /*!< System Control Register */_IO uint32_t CCR; /*
24、!< Configuration Control Register */_IO uint8_t SHP12; /*!< System Handlers Priority Registers (4-7, 8-11, 12-15)*/_IO uint32_t SHCSR; /*!< System Handler Control and State Register */ _IO uint32_t CFSR; /*!< Configurable Fault Status Register */_IO uint32_t HFSR; /*!< Hard Fault Stat
25、us Register */_IO uint32_t DFSR; /*!< Debug Fault Status Register */_IO uint32_t MMFAR; /*!< Mem Manage Address Register */_IO uint32_t BFAR; /*!< Bus Fault Address Register */_IO uint32_t AFSR; /*!< Auxiliary Fault Status Register */_I uint32_t PFR2; /*!< Processor Feature Register *
26、/_I uint32_t DFR; /*!< Debug Feature Register */_I uint32_t ADR; /*!< Auxiliary Feature Register */_I uint32_t MMFR4; /*!< Memory Model Feature Register */_I uint32_t ISAR5; /*!< ISA Feature Register */ SCB_Type;它就是地址在0xE000ED0C的32位寄存器AIRCR(Application Interrupt/Reset Control Register),該寄存器的10:83位就是 PRIGROUP的定義位值,它規(guī)定了系統(tǒng)中有多少個(gè)搶先級(jí)中斷和子優(yōu)先級(jí)中斷。而STM32只使用高4位bits,起可能的值如下(來(lái)自ST的函數(shù)庫(kù)頭文件中的定義)#define NVIC_PriorityGroup_0 (uint32_t)0x700) /*!< 0 bits for pre-emption priority 4 bits for subpriority */ #define NVIC_PriorityGroup_1 (uint32_t)0x600
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版時(shí)尚博主隱私權(quán)保護(hù)與商業(yè)合作協(xié)議書(shū)4篇
- 二零二五年度企企通采購(gòu)合同知識(shí)產(chǎn)權(quán)保護(hù)與侵權(quán)處理協(xié)議
- 2025年度綠色建筑臨建板房搭設(shè)與環(huán)保施工一體化合同4篇
- 二零二五年度智能家居產(chǎn)業(yè)股東股份轉(zhuǎn)讓及投資合作協(xié)議書(shū)3篇
- 專(zhuān)業(yè)錄音棚2024年租賃裝修合同3篇
- 2025年度大學(xué)生實(shí)習(xí)項(xiàng)目實(shí)習(xí)成果轉(zhuǎn)化合同4篇
- 二零二五年度農(nóng)業(yè)項(xiàng)目投資借款合同范本
- 二零二五年度交通事故交通管制賠償協(xié)議書(shū)2篇
- 2025年度農(nóng)業(yè)新品種選育與推廣合作合同
- 專(zhuān)屬2024年招聘協(xié)議模板一
- GB/T 37238-2018篡改(污損)文件鑒定技術(shù)規(guī)范
- 普通高中地理課程標(biāo)準(zhǔn)簡(jiǎn)介(湘教版)
- 河道治理工程監(jiān)理通知單、回復(fù)單范本
- 超分子化學(xué)簡(jiǎn)介課件
- 高二下學(xué)期英語(yǔ)閱讀提升練習(xí)(一)
- 易制爆化學(xué)品合法用途說(shuō)明
- 【PPT】壓力性損傷預(yù)防敷料選擇和剪裁技巧
- 大氣喜慶迎新元旦晚會(huì)PPT背景
- DB13(J)∕T 242-2019 鋼絲網(wǎng)架復(fù)合保溫板應(yīng)用技術(shù)規(guī)程
- 心電圖中的pan-tompkins算法介紹
- 羊絨性能對(duì)織物起球的影響
評(píng)論
0/150
提交評(píng)論