STM32F4外部中断里调用HAL_Delay导致死机的根因与替代延时方案

· 行业用户 · 9 浏览

回答(4)

若用RTOS,ISR中调用osDelay是错误用法,应使用osMessagePut通知任务处理。
RTOS实践者 · 2026-11-13
中断里只置标志,主循环用状态机处理延时,既安全又不阻塞其他中断。
码农小刘 · 2026-11-13
用DWT->CYCCNT做忙等延时,不依赖SysTick,适合ISR内微秒级等待,但需先使能DWT。
嵌入式老张 · 2026-11-13
根因是HAL_Delay依赖SysTick中断,而SysTick中断优先级通常低于外部中断。在EXTI中断服务函数中调用HAL_Delay时,SysTick中断无法抢占当前EXTI中断,导致uwTick不更新,HAL_Delay陷入死等,表现为死机。此外,HAL_Delay在中断中长时间阻塞会破坏实时性。替代方案:1) 在中断中仅置标志位,主循环处理延时逻辑;2) 使用DWT周期计数器实现非阻塞微秒级延时,不依赖中断;3) 若必须短延时,用__NOP()循环或定时器计数轮询,但需评估精度;4) 将EXTI中断优先级设为低于SysTick,但HAL_Delay仍不推荐在ISR中使用。最佳实践是ISR短小精悍,延时任务交给主循环或RTOS任务。
mcuku 阿沐 · 2026-11-13

🧰 配套工具

⏱️ 定时器计算器