STM32 NVIC中断优先级管理
后面用一个具体的例子说明了中断分组、中断线、中断通道的连接关系,先看基本概念:
CM3内核支持256个中断,包括16个内核中断和240个外部中断,并且具有256级的可编程中断设置。STM32只使用了一部分CM3内核的东西。STM32有84个中断,包括16个内核中断和68个可屏蔽中断,具有16级可编程的中断优先级。常用的就是这68个可屏蔽中断,但是在STM32F103系列上面只有60个(107系列有68个)。
在MDK内,与NVIC相关的寄存器,MDK为其定义了如下的结构体:
typedef struct
{
vu32 ISER[2];
u32 RESERVED0[30];
vu32 ICER[2];
u32 RSERVED1[30];
vu32 ISPR[2];
u32 RSERVED2[30];
vu32 ICPR[2];
u32 RSERVED3[30];
vu32 IABR[2];
u32 RSERVED4[30];
vu32 IPR[15];
}NVIC_TypeDef;
ISER[2]:ISER全称是:Interrupt Set-Enable Registers,这是一个中断使能寄存器组。103系列可屏蔽中断有60个,这里用了2个32位寄存器,总共可以表示64个中断,STM32F103只用了其中的前60位,ISER[0]的bit0~bit31分别对应中断0~31。ISER[1]的bit0~27对应中断32~59;这样,要使能某个中断,必须设置相应的ISER位为1,使该中断被使能(这里仅是使能,还要配合中断分组、屏蔽、IO口映射等设置才算一个完整的中断设置)。
ICER[2]:全称是Interrupt Clear-Enable Registers,是一个清除中断使能寄存器组,和ISER寄存器功能相反。这里专门设置一个ICER寄存器来清除中断位,而不是向ISER写0来擦除,是因为NVIC的这些寄存器都是写1有效的,写0是无效的。
ISPR[2]:全程是Interrupt Set-Pending Registers,是一个中断挂起控制寄存器组。每个位对应的中断和ISER是一样的,通过置1,可将正在进行中的中断挂起,而执行同级或更高级别的中断,写0无效。
ICPR[2]:Interrupt Clear-Pending Registers,解除中断挂起。写1