在MDK內,與NVIC相關的寄存器,MDK為其定義了如下的結構體:
typedef struct
{
vu32 ISER[2]; //2個32位中斷使能寄存器分別對應到60個可屏蔽中斷
u32 RESERVED0[30];
vu32 ICER[2]; //2個32位中斷除能寄存器分別對應到60個可屏蔽中斷
u32 RSERVED1[30];
vu32 ISPR[2]; //2個32位中斷掛起寄存器分別對應到60個可屏蔽中斷,可掛起正在執行的中斷
u32 RESERVED2[30];
vu32 ICPR[2]; //2個32位中斷解掛寄存器分別對應到60個可屏蔽中斷,可解除被掛起的中斷
u32 RESERVED3[30];
vu32 IABR[2]; //2個32位中斷激活標志寄存器,可讀取該寄存器判斷當前執行的中斷是哪個,中斷執行完硬件清零,只讀
u32 RESERVED4[62];
vu32 IPR[15]; //15個32位中斷優先級分組寄存器,每個中斷分配8個bit,對應到4*15=60個中斷
} NVIC_TypeDef;
IPR[15]
15個32位中斷優先級分組寄存器,每個中斷分配8個bit,對應到4*15=60個中斷。但是並不是8個bit都被使用了,而是僅僅只用到了高四位,這樣就可以得到5組16級的中斷優先級。
高位的4個bit又分為搶占優先級和子優先級,搶占優先級在前,子優先級在后。兩種類型優先級占用的位數又可以通過SCB->AIRCR寄存器的bit[10:8]來配置。
數字越小優先級越高,高優先級的中斷可以中斷低優先級的中斷,但是搶占優先級相同時子優先級高的無法中斷子優先級低的中斷。
結合實例說明一下:假定設置中斷優先級組為2,然后設置中斷28(Tim2中斷)的搶占優先級為3,響應優先級為2。中斷6(外部中斷0)的搶占優先級為4,響應優先級為0。中斷7(外部中斷1)的搶占優先級為3,響應優先級為0。那么這3個中斷的優先級順序為:中斷7>中斷28>中斷6。
上面例子中的中斷28和中斷7都可以打斷中斷6的中斷。而中斷7和中斷28卻不可以相互打斷!