久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8091|回復(fù): 0
收起左側(cè)

Stm32中斷優(yōu)先級相關(guān)概念與使用筆記

[復(fù)制鏈接]
ID:72519 發(fā)表于 2015-1-23 03:29 | 顯示全部樓層 |閱讀模式
一、基本概念
1ARM cortex_m3內(nèi)核支持256個中斷(16個內(nèi)核+240外部)和可編程256級中斷優(yōu)先級的設(shè)置,與中斷控制核中斷優(yōu)先級控制的寄存器(NVIC、SYSTICK等)屬于cortex_m3內(nèi)核的部分。STM32采用了cortex_m3內(nèi)核,所以這些部分仍舊保留使用,但并不是完全使用的,只是使用了一部分。
2STM32目前支持的中斷共為84個(16個內(nèi)核+68個外部),和16級可編程中斷優(yōu)先級的設(shè)置(僅使用中斷優(yōu)先級設(shè)置8bit中的高4位,見后面解釋)!秴⒖甲钚101xx-107xx STM32 Reference manual, RM0008》。
以下主要對外部中斷進(jìn)行說明。
368個外部中斷(通道)在STM32中已經(jīng)固定的分配給相應(yīng)的外部設(shè)備,每個中斷通道都具備自己的中斷優(yōu)先級控制字節(jié)PRI_n8位,但在STM32中只有高4位有效),每4個通道的8位中斷優(yōu)先級控制字(PRI_n)構(gòu)成一個32位的優(yōu)先級寄存器(Priority Register)。68個通道的優(yōu)先級寄存器至少有是1732位的寄存器,它們是NVIC寄存器的一部分。
4.這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)先級
5.在一個系統(tǒng)中,通常只使用上面5種分配情況的一種,具體采用哪一種,需要在初始化時寫入到一個32位寄存器AIRCApplication Interrupt and Reset Control Register)的第[10:這2個位中。這3bit位有專門的稱呼:PRIGROUP(具體寫操作后面介紹)。比如你將0x05(上表的編號)寫到AIRC[10:中,那么也就規(guī)定了你的系統(tǒng)中只有4個搶先式優(yōu)先級,相同的搶先式優(yōu)先級下還可以有4個不同級別的子優(yōu)先級。
6AIRCPRIGROUP的值規(guī)定了設(shè)置和確定每個外部中斷通道優(yōu)先級的格式。例如,在上面將0x05寫入了AIRCPRIGROUP,也就規(guī)定了當(dāng)前系統(tǒng)中只能有4個搶先式優(yōu)先級,相同的搶先式優(yōu)先級下還可以有4個不同級別的子優(yōu)先級,他們分別為:
[7
[5
[3
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)先級
無效
7.如果在你的系統(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ù)目小)。假定EXTI02號搶先優(yōu)先級,那么TIME2就必須設(shè)置成01號搶先優(yōu)先級。這些工作需要在AIRCPRIGROUP后進(jìn)行設(shè)置。
8.具體優(yōu)先級的確定和嵌套規(guī)則。ARM cortex_m3STM32)規(guī)定
a/ 只能高搶先優(yōu)先級的中斷可以打斷低搶先優(yōu)先級的中斷服務(wù),構(gòu)成中斷嵌套。
b/ 當(dāng)2n)個相同搶先優(yōu)先級的中斷出現(xiàn),它們之間不能構(gòu)成中斷嵌套,但STM32首先響應(yīng)子優(yōu)先級高的中斷。
c/ 當(dāng)2n)個相同搶先優(yōu)先級和相同子優(yōu)先級的中斷出現(xiàn),STM32首先響應(yīng)在該中斷通道向量地址低的中斷(ROM0008,表52)。
具體一點:
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)先級也相同,就看它們的中斷向量位置了。
9.上電RESET后,AIRCPRIGROUP[10:,因此此時系統(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)。注意:此時內(nèi)部中斷的搶先優(yōu)先級也都是0號,由于它們的中斷向量地址比外部中斷向量地址都低,所以它們的優(yōu)先級比外部中斷高,但如果此時正在執(zhí)行一個外部中斷服務(wù),它們也必須排隊等待,只是可以插隊,當(dāng)正在執(zhí)行的中斷完成后,它們可以優(yōu)先得到執(zhí)行。
了解以上基本概念還是不夠的,還要了解具體中斷的控制有那些途徑,中斷服務(wù)程序如何正確的編寫。下面的描述主要以TIME2通道為例。
二、中斷控制
1.對于STM32講,外部中斷通道位置2835號優(yōu)先級)是給外部設(shè)備TIME2的,但TIME2本身能夠引起中斷的中斷源或事件有好多個,比如更新事件(上溢/下溢)、輸入捕獲、輸出匹配、DMA申請等。
(題外話:就一個通用定時計數(shù)器,比8位控制器中TIME要復(fù)雜多了。學(xué)過AVR的,可能對輸入捕獲、輸出匹配等還有概念,如果你學(xué)的標(biāo)準(zhǔn)架構(gòu)的MCS-51,那么上手32位控制困難就更多了。所以我一直推薦學(xué)習(xí)8位應(yīng)該認(rèn)真從AVR開始,盡管51有很大的市場,價格也相對便宜些,但從發(fā)展的眼光,從后續(xù)掌握32位的使用,AVR是比較好的選擇。)
   所有TIME2的中斷事件都是通過一個TIME2的中斷通道向STM32內(nèi)核提出申請的,那么STM32中如何處理和控制TIME2和它眾多的、不同的、中斷申請呢?
2cortex_m3內(nèi)核對于每一個外部中斷通道都有相應(yīng)的控制字和控制位,用于單獨的和總的控制該中斷通道。它們包括有:
中斷優(yōu)先級控制字:PRI_n(上面提到的)
中斷允許設(shè)置位:在ISER寄存器中
中斷允許清除位:在ICER寄存器中
中斷懸掛Pending(排隊等待)位置位:在ISPR寄存器中(類似于置中斷通道標(biāo)志位)
中斷懸掛Pending(排隊等待)位清除:在ICPR寄存器中(用于清除中斷通道標(biāo)志位)
正在被服務(wù)的中斷(Active)標(biāo)志位:在IABR寄存器中,(只讀,可以知道當(dāng)前內(nèi)核正在處理哪個中斷通道)
因此,與TIME2中斷通道相關(guān)的,在NVIC中有13bits,它們是PRI_28,8 bits(只用高4);中斷通道允許,中斷通道清除(相當(dāng)禁止),中斷通道Pending置位(我的理解是中斷請求發(fā)生了,但當(dāng)前有其它中斷服務(wù)在執(zhí)行,你的中斷級別又不能打斷別人,所以Pending等待,這個應(yīng)該由硬件置位的),中斷Pending位清除(可以通過軟件將本次中斷請求且尚處在Pending狀態(tài),取消掉),正在被服務(wù)的中斷(Active)標(biāo)志位,各1bit
上面的控制字和控制位都是在NVIC中的寄存器組中,可惜的是在STM32中竟然不給出任何的解釋和說明。
3.作為外圍設(shè)備TIME2本身也包括更具體的,管理自己不同中斷的中斷控制器(位),它們主要是各個不同類型中斷的允許控制位,和各自相應(yīng)中斷標(biāo)志位。(這個STM32的手冊中有詳細(xì)的說明了)
4.在弄清楚2、3兩點的基礎(chǔ)上,我們可以看看TIME2的中斷過程,以及如何控制的了。
a/ 初始化過程
設(shè)置AIRCPRIGROUP的值,規(guī)定系統(tǒng)中的搶先優(yōu)先級和子優(yōu)先級的個數(shù)(在4bits中占用的位數(shù))
設(shè)置TIME2本身的寄存器,允許相應(yīng)的中斷,如允許UIETIME2_DIER的第[0]位)
設(shè)置TIME2中斷通道的搶先優(yōu)先級和子優(yōu)先級(PRI_28,在NVIC寄存器組中)
設(shè)置允許TIME2中斷通道。在NVIC寄存器組的ISER寄存器中的一位。
b/ 中斷響應(yīng)過程
當(dāng)TIME2UIE條件成立(更新,上溢或下溢),硬件將TIME2本身寄存器中UIE中斷標(biāo)志置位,然后通過TIME2中斷通道向內(nèi)核申請中斷。
此時硬件將TIME2Pending標(biāo)志置位,相當(dāng)與中斷通道標(biāo)志置位,表示TIME2有中斷申請。
如果當(dāng)前有中斷在處理,TIME2的中斷級別不高,那么就保持Pending,當(dāng)然軟件可以通過寫ICPR寄存器中相應(yīng)的位把本次中斷清除掉。
當(dāng)內(nèi)核有空,開始響應(yīng)TIME2的中斷,進(jìn)入TIME2的中斷服務(wù)。此時硬件將IABR寄存器中相應(yīng)的標(biāo)志位置位,表示TIME2中斷正在被處理。同時硬件清除TIME2Pending標(biāo)志位。
c/ 執(zhí)行TIME2的中斷服務(wù)程序
所有TIME2的中斷事件,都是在一個TIME2中斷服務(wù)程序中完成的,所以進(jìn)入中斷程序后,中斷程序需要首先判斷是哪個TIME2的具體事件的中斷,然后轉(zhuǎn)移到相應(yīng)的服務(wù)代碼段去。
注意不要忘了把該具體中斷事件的中斷標(biāo)志位清除掉,硬件是不會自動清除TIME2寄存器中具體的中斷標(biāo)志位的。
d/ 中斷返回
執(zhí)行完中斷服務(wù)后,中斷返回過程,在這個過程中需要:
硬件將IABR寄存器中相應(yīng)的標(biāo)志位清另,表示該中斷處理完成
如果TIME2本身還有中斷標(biāo)志位置位,表示TIME2 還有中斷在申請,則重新將TIME2Pending標(biāo)志置為1,等待再次進(jìn)入TIME2的中斷服務(wù)。
注意:以上中斷過程在《ARM Cortex-M3權(quán)威指南》中有詳細(xì)描述,并配合時序圖說明,可以參考。
如果以上明白了,那么可以在ST提供的函數(shù)庫的幫助下,正確的設(shè)置和使用STM32的中斷系統(tǒng)了。
如果你要了解更深入的東西,或者直接對寄存器操作,還要繼續(xù)望下看。
三、深入NVIC
1. 看看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/write clear    0xE000E018
SysTick     Calibration Value Register          Read-only           0xE000E01C
Irq 0 to 31     Set Enable Register             Read/write          0xE000E100
. . . . .
Irq 224 to 239  Set Enable Register             Read/write          0xE000E11C
Irq 0 to 31     Clear Enable Register           Read/write          0xE000E180
. . . . .
Irq 224 to 239 Clear Enable Register           Read/write          0xE000E19C
Irq 0 to 31     Set Pending Register            Read/write          0xE000E200
. . . . .
Irq 224 to 239  Set Pending Register            Read/write          0xE000E21C
Irq 0 to 31     Clear Pending Register          Read/write          0xE000E280
. . . . .
Irq 224 to 239  Clear Pending Register          Read/write          0xE000E29C
Irq 0 to 31     Active Bit Register             Read-only           0xE000E300
. . . . . .
Irq 224 to 239  Active Bit Register             Read-only           0xE000E31C
Irq 0 to 3      Priority Register               Read/write          0xE000E400
. . . . .
Irq 224 to 239  Priority Register               Read/write          0xE000E4EC
CPUID Base Register                             Read-only           0xE000ED00
Interrupt Control State Register        Read/write or read-only     0xE000ED04
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-11 Priority Register          Read/write          0xE000ED1C
System Handlers 12-15 Priority Register         Read/write          0xE000ED20
. . . . .
2Stm32中用了那些
下面是從ST公司提供的函數(shù)庫的頭文件得到的,庫是v3.1.0
/* memory mapping struct for Nested Vectored Interrupt Controller (NVIC) */
typedef struct
{
  __IO uint32_t ISER[8];                 /*!< Interrupt Set Enable Register            */
       uint32_t RESERVED0[24];
  __IO uint32_t ICER[8];                 /*!< Interrupt Clear Enable Register          */
       uint32_t RSERVED1[24];
  __IO uint32_t ISPR[8];                 /*!< Interrupt Set Pending Register           */
       uint32_t RESERVED2[24];
  __IO uint32_t ICPR[8];                 /*!< Interrupt Clear Pending Register         */
       uint32_t RESERVED3[24];
  __IO uint32_t IABR[8];                 /*!< Interrupt Active bit Register            */
       uint32_t RESERVED4[56];
  __IO uint8_t  IP[240];                 /*!< Interrupt Priority Register, 8Bit wide   */
       uint32_t RESERVED5[644];
  __O  uint32_t STIR;                   /*!< Software Trigger Interrupt Register      */
}  NVIC_Type;
a/  寄存器ISER、ICER、ISPRICPR、IABRSTM32中都使用的8個(實際3個就夠了,后面的將來還要擴(kuò)充?)。這些32位的寄存器中每一位對應(yīng)了一個中斷通道相應(yīng)的標(biāo)志。
比如地址在0xE000E100的ISER[0]這個32位的寄存器,第0位是中斷通道0的允許位,第2位是中斷通道1的允許標(biāo)志……32位是中斷通道31的允許位;接下來地址在0xE000E104的ISER[1]則是中斷通道32-63的允許位。ICER、ISPR、ICPR、IABR的結(jié)構(gòu)相同,只是含義不同。
注意是對這些寄存器的操作:寫1表示置位或清除,寫0無任何影響。
例如:
對0xE000E100的ISER[0]的第0位寫1,表示允許中斷通道0中斷;
但對0xE000E100的ISER[0]的第0位寫0,則沒有任何作用,該位保持不變。
如果要禁止中斷通道0的中斷響應(yīng),那么就必須:
對0xE000E180的ICER[0]的第0位寫1,表示禁止中斷通道0的中斷;
對0xE000E180的ICER[0]的第0位寫0,也是不起任何作用的。
b/ IP[240]用于定義240個外部中斷通道的優(yōu)先級,每1個字節(jié)對應(yīng)一個通道。4個通道的IP[]構(gòu)成一個32位的寄存器。在STM32中最多有68個外部中斷通道,每個IP[]1個字節(jié)中只使用高4位(見前面介紹)。IP[]的結(jié)構(gòu)如下:
31:28
27:24
23:20
19:16
15:12
11:8
7:4
3:0
E000E400
PIR_3
PIR_2
PIR_1
PIR_0
每8位的高4位有效,灰色位表示無效
E000E404
PIR_7
PIR_6
PIR_5
PIR_4
……
……
……
……
……
c/ 在ST公司提供的函數(shù)庫的頭文件中另一個數(shù)據(jù)結(jié)構(gòu)中,還有一個寄存器需要關(guān)注 :
/* memory mapping struct for System Control Block */
typedef struct
{
__I uint32_t CPUID;     /*!<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;      /*!< Configuration Control Register */
__IO uint8_t  SHP[12];  /*!< 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 Status 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 PFR[2];   /*!< Processor Feature Register  */
__I  uint32_t DFR;      /*!< Debug Feature Register */
__I  uint32_t ADR;      /*!< Auxiliary Feature Register */
__I  uint32_t MMFR[4];  /*!< Memory Model Feature Register */
__I  uint32_t ISAR[5];  /*!< ISA Feature Register */
} SCB_Type;
它就是地址在0xE000ED0C32位寄存器AIRCRApplication Interrupt/Reset Control Register),該寄存器的[10:8]3位就是 PRIGROUP的定義位值,它規(guī)定了系統(tǒng)中有多少個搶先級中斷和子優(yōu)先級中斷。而STM32只使用高4bits,起可能的值如下(來自ST的函數(shù)庫頭文件中的定義)
#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 bits for pre-emption priority
                                                            3 bits for subpriority */
#define NVIC_PriorityGroup_2         ((uint32_t)0x500) /*!< 2 bits for pre-emption priority
                                                            2 bits for subpriority */
#define NVIC_PriorityGroup_3         ((uint32_t)0x400) /*!< 3 bits for pre-emption priority
                                                            1 bits for subpriority */
#define NVIC_PriorityGroup_4         ((uint32_t)0x300) /*!< 4 bits for pre-emption priority
                                                            0 bits for subpriority */
由于這個寄存器相當(dāng)重要,所以為了防止誤操作(寫),因此要改寫這個寄存器的內(nèi)容時,必須同時向這個寄存器的高16位[31:16]寫驗證字(Register key) 0x05FA。
例如:SBC->AIRCR |= (0x05FA0000 || 0x300);    // 設(shè)置系統(tǒng)中斷有16個搶先優(yōu)先// 級,無子優(yōu)先級
d/ 下面的定義與SYSTICK相關(guān),有時也會用到的。
/* memory mapping struct for SysTick */
typedef struct
{
  __IO uint32_t CTRL;       /*!< SysTick Control and Status Register */
  __IO uint32_t LOAD;       /*!< SysTick Reload Value Register       */
  __IO uint32_t VAL;        /*!< SysTick Current Value Register      */
  __I  uint32_t CALIB;      /*!< SysTick Calibration Register        */
} SysTick_Type;

回復(fù)

使用道具 舉報

無效樓層,該帖已經(jīng)被刪除
無效樓層,該帖已經(jīng)被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品一区二区三区蜜桃久 | 亚洲欧美一区二区三区1000 | 欧美电影免费观看高清 | 午夜成人免费视频 | 男女国产网站 | 国产欧美久久一区二区三区 | 国产欧美日韩一区二区三区在线 | 在线欧美视频 | 日本精品视频在线观看 | 91精品国产综合久久久亚洲 | 欧美黄色片 | 国产精品亚洲综合 | 日韩欧美一区二区三区 | 国产精品一区二区视频 | 国产精品美女久久久久久免费 | 狠狠躁天天躁夜夜躁婷婷老牛影视 | 亚洲图片一区二区三区 | 国产精品久久久久久久久图文区 | 亚洲美女一区二区三区 | 亚洲国产一区二区三区在线观看 | 国产精品久久久久久238 | 精品国产一区二区三区久久久蜜月 | 精品国产一区二区三区久久久蜜月 | 精品1区2区| 亚洲劲爆av | 一级少妇女片 | 亚洲精品自拍 | 91国自产| 在线日韩在线 | 欧美精品在线播放 | 国产精品久久久久久久久久久久久久 | 精品一区久久 | 成人网在线观看 | 免费成人av网站 | 成人网视频| 国产99久久久国产精品 | 亚洲欧美在线免费观看 | 在线观看成年视频 | 亚洲综合色自拍一区 | 女同久久| 久久精品国产久精国产 |