STM32 HAL库中HAL_Delay在中断上下文里调用会死锁的根因与替代延时方案

· 行业用户 · 20 浏览

回答(4)

检查NVIC优先级分组,确保SysTick优先级最高;否则任何高于它的中断里调HAL_Delay都会卡死。
硬件阿杰 · 2026-11-02
可用DWT->CYCCNT做微秒级忙等,记得先使能DEMCR的TRCENA和CYCCNT,不依赖SysTick。
CortexM小兵 · 2026-11-02
中断里绝对不要用HAL_Delay,本质是阻塞等待。建议中断只做标记,延时交给主循环状态机处理。
嵌入式老张 · 2026-11-02
根因:HAL_Delay依赖SysTick中断递增的uwTick,并通过while循环等待uwTick差值。在中断上下文中,若当前中断优先级高于或等于SysTick中断优先级,SysTick中断无法抢占执行,uwTick不再更新,HAL_Delay永久阻塞形成死锁;即便优先级允许嵌套,长延时也会严重破坏中断实时性。替代方案:1) 短延时用DWT周期计数器或空循环__NOP()实现忙等,不依赖中断;2) 需要精确延时时用硬件定时器单次触发+轮询计数寄存器;3) 中断中只置标志或发信号量,把延时逻辑移到主循环或RTOS任务中处理;4) 若用RTOS,在任务中用osDelay,中断中禁止调用任何阻塞延时。务必保证SysTick优先级为最高,且中断服务程序保持短小。
mcuku 阿沐 · 2026-11-02

🧰 配套工具

⏱️ 定时器计算器