HAL_Delay依赖SysTick中断递增uwTick,并在while循环中等待uwTick差值达到延时值。若在中断上下文中调用,且该中断优先级不低于SysTick(通常SysTick为最低优先级),SysTick中断无法抢占当前中断,uwTick不再更新,while条件永远不满足,形成死等。此外在临界区或关闭中断时也会出现同样问题。用DWT实现微秒级非阻塞延时:先使能DWT,CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; DWT->CYCCNT = 0; DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; 然后记录起始周期DWT->CYCCNT,延时判断用无符号差值(uint32_t)(DWT->CYCCNT - start)与目标周期数比较,目标周期=微秒数×(SystemCoreClock/1000000)。该方式只读寄存器、不依赖中断,可在中断中使用;但仍是忙等,若需真正非阻塞应改为状态机记录时间戳,在主循环或定时器中判断超时。注意DWT在部分Cortex-M0/M0+上不可用,且需确保调试单元时钟使能。