HAL_Delay本质是轮询uwTick并与HAL_GetTick()比较,而uwTick由SysTick中断每1ms递增。若在中断上下文中调用HAL_Delay,且该中断优先级不低于SysTick(通常SysTick为最低优先级),SysTick中断无法抢占,uwTick永不更新,HAL_Delay就死等卡死。即便优先级允许抢占,长时间忙等也会破坏实时性。替代方案:使能DWT,CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; DWT->CYCCNT=0; DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk。读取DWT->CYCCNT得到周期数,用SystemCoreClock换算微秒。实现非阻塞延时:记录起始tick,循环中判断(DWT->CYCCNT - start)是否达到us*(SystemCoreClock/1000000),未到则执行其他任务或直接返回状态,不阻塞CPU。注意DWT为32位,高主频下约数秒回绕,用无符号减法可正确处理;调试器暂停时CYCCNT可能停走,量产前需评估。