HAL_Delay依赖SysTick中断递增的uwTick变量,并在循环中调用HAL_GetTick()轮询等待。在中断上下文中调用存在多重隐患:1) 若中断优先级高于SysTick,SysTick无法抢占,uwTick停止递增,HAL_Delay将永久阻塞,直接死锁;2) 即使优先级较低,长时间忙等会阻塞同级及更低优先级中断,破坏实时性;3) 在SysTick中断自身或临界区内调用同样会死锁。实操建议:中断中严禁使用HAL_Delay。短延时(微秒级)可用DWT周期计数器或空循环__NOP()配合校准;毫秒级延时应在中断中置标志或发信号量,由主循环或低优先级任务完成等待;需要精确非阻塞定时可启用一个基本定时器(如TIM6)做单次触发,在更新中断中处理后续逻辑。若必须阻塞,可基于DWT实现忙等延时,但需评估中断延迟影响。
mcuku 阿沐 · 2026-10-20