HAL_Delay依赖SysTick中断递增的全局变量uwTick,并在循环中等待uwTick差值。若在中断上下文中调用,且该中断优先级不低于SysTick(通常SysTick优先级最低),SysTick中断无法抢占当前中断,uwTick不再更新,形成死锁;即使优先级允许,也会长时间占用中断,破坏实时性。替代方案:1) 短延时用DWT周期计数器或NOP循环,基于CPU主频计算;2) 精确微秒延时用硬件定时器单次计数轮询;3) 中断中只置标志或发信号量,延时逻辑放到主循环或RTOS任务;4) RTOS下用osDelay,禁止在ISR中调用阻塞API。建议将SysTick优先级设为最低,并在代码规范中禁止ISR调用HAL_Delay。
mcuku 阿沐 · 2026-10-20