STM32 多个EXTI中断存在时因优先级导致的个别中断无法处理
今天在学习STM32时在设置多个EXTI中断时,其中一个中断处理函数是一个死循环,这导致了另外一个中断无法被处理,经研究这是因为中断优先级设置的问题,在修改之后我这样设置:
首先他们都加入NVIC_PriorityGroup_1 ,因为0组是没有抢断优先级的,是无法打断正在处理的中断的,随后我设置1号的抢占优先级为1,2号的为0,这样2号就能打断1号的处理过程了。
总结一下就是抢占优先级高的可以打断别人先处理,如果同级就比较响应优先级,如果再相同就按顺序处理,同时组与组也是有优先级的,0组>1组>2组这样类推
以下是一些NVIC_PriorityGroup_1 的介绍:
#define NVIC_PriorityGroup_0 ((u32)0x700) //0 bits for pre-emption priority 4 bits for subpriority
#define NVIC_PriorityGroup_1 ((u32)0x600) //1 bits for pre-emption priority 3 bits for subpriority
#define NVIC_PriorityGroup_2 ((u32)0x500) //2 bits for pre-emption priority 2 bits for subpriority
#define NVIC_PriorityGroup_3 ((u32)0x400) // 3 bits for pre-emption priority 1 bits for subpriority
#define NVIC_PriorityGroup_4 ((u32)0x300) //4 bits for pre-emption priority 0 bits for subpriority
NVIC_PriorityGroup_0 代表 4BIT位都是响应优先级,共16个,无抢占优先级,所有中断不能被打断,同时来临时最高相应优先级先处理。即NVIC_IRQChannelPreemptionPriority无效,NVIC_IRQChannelSubPriority可以赋值为0~15.
NVIC_PriorityGroup_1 代表有两位抢占优先级,8个响应优先级,抢占优先级能够打断响应优先级。即NVIC_IRQChannelPreemptionPriority可以为0或1,NVIC_IRQChannelSubPriority可以赋值为0~7
NVIC_PriorityGroup_2 代表有4个抢占优先级,4个响应优先级。即NVIC_IRQChannelPreemptionPriority可以为0-3,NVIC_IRQChannelSubPriority可以赋值为0~3
NVIC_PriorityGroup_3 代表有8个抢占优先级和2个响应优先级。即NVIC_IRQChannelPreemptionPriority可以为0~7,NVIC_IRQChannelSubPriority可以赋值为0或1
NVIC_PriorityGroup_4 有16个抢占优先级,无响应优先级,高抢占优先级可以打断低抢占优先级。即NVIC_IRQChannelPreemptionPriority可以为0~15,NVIC_IRQChannelSubPriority无效。
————————————————
上述介绍的原文链接:https://blog.csdn.net/yyyljw/article/details/50539520