NVIC(Nested Vectored Interrupt Controller):嵌套向量中断控制器
库函数程序(以USART1为例)
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置优先级分组为2
//Usart1 NVIC 配置
//方式一,配置结构体
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级为3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //响应优先级为3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据设置的参数初始化NVIC寄存器
//方式二,直接调用API函数
NVIC_SetPriority(USART1_IRQn, 0x0f);
NVIC_EnableIRQ(USART1_IRQn);
优先级分组
中断优先级寄存器IP为8位,原则上可为外部中断设置的优先级为0~255,实际上只用到了高4位就够用了,这高四位又被分为抢占式优先和响应式优先两种,因为只用到了高四位,所以一共有5个分组,NVIC_PriorityGroup_0~4,每个组分配的抢占式优先和响应式优先非常容易记混淆,我是这样记得:几组就是给抢占式优先分配了几个位宽,比如NVIC_PriorityGroup_1就是高1位给抢占式优先,可以取0~1,低3位给响应式优先,可以取0~7。
中断优先有下面几个规则:
1、优先级号越低者,优先级越高,PreemptionPriority=3的优先级就低于PreemptionPriority=0
2、只有抢占式有限可以中断嵌套,抢占式优先级高的可以打断抢占式优先级低的中断
3、抢占式优先级与响应式优先级都相同的,则比较它们的硬件中断编号,中断编号越小,优先级越高。(硬件中断编号从中断向量表当中查看)