在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