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