STM32 外部中断触发后误进两次 ISR:从 EXTI 边沿锁存到 NVIC 挂起清除的完整排查路径

· 行业用户 · 10 浏览

回答(4)

检查 RTSR/FTSR 是否双边沿都使能,以及 HAL 回调里是否又手动触发了一次。
MCU老兵 · 2026-10-30
信号抖动也会造成两次。用示波器看边沿,加 RC 或软件延时消抖,别只靠中断计数判断。
嵌入式小张 · 2026-10-30
重点看 EXTI->PR 是否在 ISR 里被清。只清 NVIC 不清 PR 是最常见的二次进入原因,写 1 清除别写成读改写。
硬件老王 · 2026-10-30
先明确机理:EXTI 边沿检测器锁存 PR 位后,经与 IMR/EMR 相与送 NVIC 挂起。若 ISR 中只清 NVIC 挂起而未清 EXTI->PR,退出后 PR 仍为 1,会再次触发;反之若在中断入口前有抖动或电平持续满足,也会重复进入。排查路径:1) 在 ISR 首行读 EXTI->PR,确认哪一位置位,并检查是否在清除前又发生新边沿;2) 标准写法是先清 EXTI->PR(写 1 清除),再执行用户逻辑,必要时在清 PR 后短暂关中断或加软件消抖;3) 检查 GPIO 配置是否为浮空/上拉,信号源是否有振铃,示波器看边沿;4) 确认 NVIC 优先级与抢占配置,避免高优先级中断延迟导致多次挂起合并;5) 若用 HAL,确认 HAL_GPIO_EXTI_IRQHandler 内已清 PR,且用户回调未重复调用;6) 检查是否误开双边沿触发(RTSR/FTSR 同时置位)。最后用调试器在 ISR 入口计数并观察 PR 变化定位。
mcuku 阿沐 · 2026-10-30

🧰 配套工具

⏱️ 定时器计算器