第一步:分组(一次)
第二步:根据每个中断,设置抢占优先级(根据分组可以知道可以几位设置),然后子优先级。
1. 中断编号
ARM 为 Cortex-M3 内核 一共设计了 255 个中断,编号为 1~255,而 0 表示没有异常
这里的编号单纯只是这些中断的一个序号,而不是优先级
编号 1-15 是内核中产生的、而 16-255 属于来自内核外
2. 中断优先级
对于编号为 1-3 的中断,其优先级是固定的,从 -3 到 -1
编号为 4-255 的中断,其优先级都是可以编程的
中断优先级
(1)中断优先级分为两种,可编程和不可编程,可编程的表示可以自己修改中断优先级,不可编程的就不能修改
(2)对于STM32中断优先级,决定着内核优先响应谁的中断请求
(3)小值优先原则,中断优先级数值越小,中断就会被优先相应
(4)中断优先级按照优先级分组配置
对于组0,抢占优先级为0,表示他没有抢占优先级,4个bit全部用来表示子优先级。对于组1,抢占优先级为0-1,用1个bit表示抢占优先级,其余3个bit表示子优先级…
(1)通过优先级分组,可以管理中断的响应顺序
(2)只有抢占优先级才由抢占中断权限,发生中断嵌套,打断就发生中断嵌套,没有能力打断,那就被挂起
假如事件A抢占优先级为0,B的抢占优先级为10,在B执行过程中,A发出中断请求,则会抢过B中断的使用权,等A执行完毕再继续执行B(ps:如果A并不能打断事件B,A就会被挂起)
(3)如果中断抢占优先级相同,不发生抢占
(4)如果多个挂起的中断具有相同的抢占优先级,则子优先级高的先行,如果子优先级相同,则IRQ(通常指外部中断请求)编号小的先行(IRQ来源例如:stm32f103xe.h)
抢占优先级(组)>子优先级(响应优先级)>IRQ编号
系统运行后,先设置中断优先级分组
调用函数: void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
系统执行过程中,只设置一次中断分组
针对每个中断,设置对应的抢占优先级和响应优先级
调用函数:void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
如果需要挂起/解挂,查看中断当前激活状态,分别调用相关函数即可
即我们在上电初始化进行一次配置即可,正常是配置分组