You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ARM Cortex-M4中断抢占异常咨询:高优先级EXTI0未抢占DMA1

ARM Cortex-M4中断抢占异常排查:EXTI0无法抢占DMA1 ISR的原因

核心问题分析

你当前的测试场景:EXTI0(IRQ6)配置优先级0x00,DMA1_Stream1(IRQ12)配置0x50,按规则EXTI0应能抢占DMA1的ISR,但实际只有移除DMA1 ISR中的while(1)后才会进入EXTI0 ISR,反向配置时抢占正常。问题大概率出在优先级配置细节或NVIC分组规则上,以下是具体排查点:

1. 中断优先级分组配置错误

Cortex-M4的NVIC优先级由抢占优先级和子优先级两部分组成,通过SCB->AIRCR寄存器设置分组(共5种分组方式):

  • 若设置的分组导致两个中断的抢占优先级实际相同,即使优先级数值不同,也不会触发抢占(子优先级仅影响同抢占优先级的中断排队,不影响抢占)。
  • 例如:若分组设为0(4位全为子优先级),所有中断的抢占优先级都是0,此时EXTI0无法抢占DMA1;若设为分组2(2位抢占、2位子优先级),0x00的抢占优先级为0,0x50的抢占优先级为1,此时才能触发抢占。
  • 排查方法:读取SCB->AIRCR的值,确认分组配置符合预期,确保EXTI0的抢占优先级确实高于DMA1。

2. 优先级配置未实际生效

  • 检查NVIC_SetPriority(DMA1_Stream1_IRQn, 0x50)的执行时机,确保在中断启用前完成配置。
  • 直接读取NVIC->IP[DMA1_Stream1_IRQn]寄存器,确认实际写入的优先级值是否为0x50;部分MCU可能对特定中断的优先级有硬件限制,需核对芯片手册。

3. 中断挂起的触发方式有误

  • 若你在DMA1 ISR中是通过操作EXTI寄存器(如EXTI->SWIER)挂起中断,需确认该操作是否正确将中断请求传递到NVIC。建议使用标准库函数NVIC_SetPendingIRQ(EXTI0_IRQn)来触发挂起,避免寄存器操作遗漏。

4. ISR中意外关闭全局中断

  • 检查DMA1的ISR代码,是否存在__disable_irq()或类似关闭全局中断的操作。若全局中断被关闭,即使高优先级中断挂起,NVIC也不会触发抢占。

总结

反向配置DMA优先级更高时抢占正常,说明NVIC的抢占机制本身无问题,核心问题集中在EXTI0优先级的实际生效状态或优先级分组配置上。优先排查SCB->AIRCR的分组设置,再验证两个中断的实际抢占优先级是否符合预期。

内容的提问来源于stack exchange,提问作者Deeptesh Chari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 22:42:33