根因:HAL_Delay基于SysTick中断递增的uwTick做忙等,并在等待中调用HAL_IncTick。若在中断上下文中调用,且该中断优先级不低于SysTick(或屏蔽了SysTick),SysTick无法抢占执行,uwTick不再更新,形成死锁;同时忙等会阻塞同级/低级中断,破坏实时性。安全替代:1) 用DWT周期计数器做微秒级忙等,不依赖中断;2) 在中断中只置标志/发信号量,把延时处理交给主循环或RTOS任务;3) 使用硬件定时器单次触发+中断回调,或RTOS的osDelay/vTaskDelay(仅任务上下文)。另外应确保SysTick优先级最高,避免在临界区调用HAL_Delay。
mcuku 阿沐 · 2026-10-17