一,Nested vectored interrupt controller
NVIC即嵌套向量中断控制器,它是内核的器件,M3内核都是支持256个中断,其中包含了16系统中断和240个外部中断,并且具有256级的可编程中断设置。芯片厂商一般不会把内核的这些资源全部用完,如STM32F103ZET6 的系统中断有10个,外部中断有60个。
NVIC相关的寄存器定义在core_cm3.h文件中
typedef struct
{
_IOM uint32_t ISER[8U]; /* 中断使能寄存器 */
uint32_t RESERVED0[24U];
__IOM uint32_t ICER[8U]; /* 中断清除使能寄存器 */
uint32_t RSERVED1[24U];
__IOM uint32_t ISPR[8U]; /* 中断使能挂起寄存器 */
uint32_t RESERVED2[24U];
__IOM uint32_t ICPR[8U]; /* 中断解挂寄存器 */
uint32_t RESERVED3[24U];
__IOM uint32_t IABR[8U]; /* 中断有效位寄存器 */
uint32_t RESERVED4[56U];
__IOM uint8_t IP[240U]; /* 中断优先级寄存器(8Bit 位宽) */
uint32_t RESERVED5[644U];
__OM uint32_t STIR; /* 软件触发中断寄存器 */
} NVIC_Type;
中断优先级
STM32 中的中断优先级可以分为:抢占式优先级和响应优先级,响应优先级也称子优先级,
每个中断源都需要被指定这两种优先级。抢占式优先级和响应优先级的区别:
抢占优先级:抢占优先级高的中断可以打断正在执行的抢占优先级低的中断。
响应优先级:抢占优先级相同,响应优先级高的中断不能打断响应优先级低的中断。
还有一种情况就是当两个或者多个中断的抢占式优先级和响应优先级相同时,那么就遵循
自然优先级,看中断向量表的中断排序,数值越小,优先级越高
在NVIC中由寄存器NVIC_IPR0-NVIC_IPR59共60个寄存器控制中断优先级,每个寄存器的8位,所以就有了240个宽度为 8bit 的中断优先级控制寄存器,原则上每个外部中断可配置的优先级为 0~255,数值越小,优先级越高。但是实际上M3芯片为了精简设计,只使用了高四位[7:4],低四位取零,这样最多只有16级中断嵌套,即2^4=16。对于NVCI的中断优先级分组;STM32F103将中断分为5个组,组0~4。该分组的设置是由SCB->AIRCR寄存器的bit10~8来定义的。