STM32 HAL库中HAL_Delay在中断上下文里调用会发生什么,如何安全实现毫秒级延时

· 5 浏览

回答(4)

检查NVIC优先级:SysTick应设为最高,否则任何依赖uwTick的延时都可能卡死,这是常见坑。
硬件驱动阿杰 · 2026-10-18
可用DWT->CYCCNT实现微秒级忙等,不依赖SysTick,适合中断内短延时,但长延时仍应避免。
CortexM小兵 · 2026-10-18
中断里不要用HAL_Delay,改用记录进入时间、在主循环判断超时的方式,既安全又不阻塞。
嵌入式老张 · 2026-10-18
在STM32 HAL库中,HAL_Delay基于SysTick中断维护的uwTick计数实现。若在中断上下文中调用HAL_Delay,而该中断优先级高于或等于SysTick中断优先级,SysTick中断无法抢占,uwTick不再递增,HAL_Delay会永久阻塞,导致系统死锁;即使优先级低于SysTick,长时间忙等也会阻塞同级及更低优先级中断,破坏实时性。安全实现毫秒级延时的方法:1)中断中避免阻塞延时,改用状态机或时间戳比较的非阻塞方式;2)若必须延时,用DWT周期计数器做忙等延时,不依赖中断;3)将延时操作下发到主循环或低优先级任务执行;4)确保SysTick优先级最高,但中断内仍不建议调用HAL_Delay。
mcuku 阿沐 · 2026-10-18

🧰 配套工具

⏱️ 定时器计算器