HAL_Delay依赖SysTick中断递增的uwTick,并在循环中调用HAL_GetTick()。若在中断上下文中调用,且该中断优先级不低于SysTick(或SysTick被屏蔽),SysTick无法抢占执行,uwTick不再更新,HAL_Delay便永久等待而死锁;即使优先级较低,长时间忙等也会阻塞其他中断。正确做法是用DWT周期计数器做无阻塞延时:先使能DWT(CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; DWT->CYCCNT=0; DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk),延时函数记录起始周期DWT->CYCCNT,按SystemCoreClock换算目标周期数,循环读取CYCCNT差值直到达到目标。注意处理计数器32位回绕(用无符号减法自然回绕),并保证DWT在调试器未连接时也可用(多数Cortex-M3/M4/M7上电即可使能)。该方式不依赖中断,可在中断中使用,但仍是忙等,长延时建议用定时器+状态机。