stm32 NVIC中断管理实现(直接操作寄存器)
cortex-m3支持256个中断,其中包含了16个内核中断,240个外部中断。
stm32只有84个中断,包括16个内核中断和68个可屏蔽中断
(stm32f103上只有60个可屏蔽中断,f107上才有68个中断)
中断是stm32很基础的一个功能,学会使用中断,才可以更好的使用其他的外设。理解stm32的中断,必须要先从stm32的中断优先级分组是怎么回事。要理解优先级分组,就要先理解什么是先占优先级和次占优先级。
先占优先级的概念等同于51单片机中的中断。假设有两中断先后触发,已经在执行的中断的先占优先级如果没有后触发的中断的先占优先级高,就会处理先占优先级高的中断。也就是说又有较高的先占优先级的中断可以打断先占优先级较低的中断。这是实现中断嵌套的基础。
次占优先级只在同一先占优先级的中断同时触发时起作用,先占优先级相同,则优先执行次占优先级较高的中断。次占优先级不会造成中断嵌套(但是可以在挂起等待时插队)。 如果中断的两个优先级都一致,则优先执行位于中断向量表中位置较高的中断。还需要注意的一点是:这里的中断优先级高是指谁更接近0级,0级优先级是最高的。
那么最低的优先级可以是多少?这就涉及了优先级分组的概念。 stm32 通过一个嵌套中断向量控制器(NVIC)来分配先占优先级和次占优先级的数量。cortex-m3 内核中拥有一个3位宽度的的PRIGROUP数据区,用来指示一个8位数据序列中的小数点的位置从而表示中断优先级的分组。
举个例子可以更好的理解:如果PRIGROUP 数据位000(即为0组), 用于表示中断优先级的分组的含义就是用7位的数据宽度来表示先占优先级的数量即为128, 用1位的数据宽度来表示次占优先级数量即为2。(上述是指cortex-m3内核的情况,而实际的stm32则只用到8位中的高四位)
所以cortex-m3中有2的三次方 即为8个优先级分组。但是stm32中只有5个优先级分组(0000~0100),表示方法略有不同。
一、NVIC寄存器组
在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;
它们对应ARM手册中的名称为: ISER = Interrupt Set-Enable Registers
ICER = Interrupt Clear-Enable Registers
ISPR = Interrupt Set-Pending Register
ICPR = Interrupt Clear-Pending Register
IABR = Interrupt Active Bit Register
IPR = Interrupt Priority Registers
每个寄存器有32位,以Interrupt Set-Enable Registers说明,ISER[0]对应中断源0~31,ISER[1]对应中断源32~63,STM32只有60个中断源,所以没有ISER[2:7](因为cortex-m3支持256个中断,即需要256个使能位),转为RESERVED(保留)。
首先分析为什么定义。这是因为ISER的地址是从E000E100开始的,ICER是从E000E180开始的,依次类推
NVIC嵌套向量中断控制器 来自淘豆网www.taodocs.com转载请标明出处.