STM32 多个EXTI中断存在时因优先级导致的另外的中断无法被处理

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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32中,中断优先级是非常重要的,因为它决定了中断处理的顺序。在处理多个中断时,优先级高的中断会先被处理,而优先级低的中断会被暂停,等待高优先级中断处理完毕后再进行。 STM32中断优先级主要由以下几个部分组成: 1. 中断线优先级 中断线优先级是整个中断优先级的最高级别。它决定了不同中断之间的优先级顺序。STM32中断线优先级是由16个优先级位组成的,每个优先级位可以取值0或1,其中0表示优先级低,1表示优先级高。当两个中断中断线优先级相同时,还需要考虑子优先级。 2. 子优先级优先级是每个中断内部的优先级。子优先级的取值范围为0-15,其中0表示最高优先级。当多个中断中断线优先级相同时,子优先级高的中断会先被处理。 3. 抢占优先级和响应优先级 抢占优先级和响应优先级是用户自定义的,它们决定了中断处理优先级顺序。抢占优先级是指当一个中断正在处理时,另一个中断发生了,那么哪个中断可以打断正在执行的中断。响应优先级是指当两个中断同时发生时,哪个中断先被处理。 下面是一个STM32中断优先级设置示例代码: ``` NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); ``` 在这个示例代码中,我们设置了EXTI0的中断优先级,抢占优先级为0x01,响应优先级为0x01。这意味着当EXTI0中断发生时,它可以打断正在执行的低优先级中断,并且它的子优先级为0x01,意味着它比其他中断的子优先级高。 总之,STM32中断优先级的设置是非常重要的,它可以帮助我们处理多个中断时的优先级顺序,保证系统的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值