STM32 HAL库中HAL_Delay在中断上下文里为何会死等,以及替代方案

· 行业用户 · 19 浏览

回答(4)

更好的做法是中断只做标记,主循环用 HAL_GetTick 做非阻塞超时判断,彻底避免延时。
状态机爱好者 · 2026-10-23
推荐用 DWT->CYCCNT 做微秒级延时,不依赖中断,中断里也能安全使用,但要注意使能 DWT。
CortexM小兵 · 2026-10-23
本质是优先级问题:SysTick 默认优先级最低,任何中断里调 HAL_Delay 都可能卡死。调试时先查 NVIC 优先级配置。
嵌入式老张 · 2026-10-23
HAL_Delay 依赖 SysTick 中断递增的全局变量 uwTick,并在 while 循环中等待该变量变化。如果在中断上下文中调用,且该中断优先级不低于 SysTick(默认最低优先级),SysTick 中断无法抢占当前中断,uwTick 不再更新,HAL_Delay 就会永久死等;即使优先级较低,也会阻塞中断响应,破坏实时性。替代方案:1) 中断中只置标志或发信号,主循环延时处理;2) 需要短延时时用 DWT 周期计数器或硬件定时器做忙等;3) 用硬件定时器实现非阻塞状态机,记录时间戳比较;4) 若必须延时,可临时提升 SysTick 优先级,但不推荐。核心原则:中断服务程序应短小、非阻塞,禁止调用 HAL_Delay。
mcuku 阿沐 · 2026-10-23

🧰 配套工具

⏱️ 定时器计算器