在STM32 HAL库中,HAL_Delay依赖SysTick中断递增的uwTick变量实现毫秒延时。若在中断上下文中调用,且该中断优先级高于或等于SysTick优先级,SysTick中断无法抢占,uwTick停止更新,HAL_Delay会永久阻塞,导致系统死锁;即使优先级较低,长延时也会阻塞中断响应。因此中断里严禁使用HAL_Delay。用DWT周期计数器实现微秒级非阻塞延时:先使能DWT,CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; DWT->CYCCNT=0; DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; 然后记录起始周期DWT->CYCCNT,在循环或状态机中比较当前周期与起始周期之差是否达到us*SystemCoreClock/1000000,达到即返回,期间不阻塞其他逻辑。注意DWT在部分Cortex-M0/M0+上不可用,且需确保调试器未复位DWT。