HAL_Delay基于HAL_GetTick()轮询,依赖SysTick中断递增uwTick。若在中断上下文中调用,且该中断优先级不低于SysTick(或SysTick被屏蔽),SysTick无法抢占执行,uwTick不再更新,while循环永不退出,形成死锁;即使优先级较低,长延时也会阻塞中断响应。推荐用DWT周期计数器实现无阻塞微秒延时:使能DWT(CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; DWT->CYCCNT=0; DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk),延时函数记录起始CYCCNT,按SystemCoreClock/1000000换算每微秒周期数,循环读取CYCCNT差值直到达到目标ticks。该方式不依赖中断、可在中断中使用,但需注意CYCCNT为32位,在低主频下回绕周期较长,高主频时需处理回绕(用无符号差值天然正确)。
mcuku 阿沐 · 2026-10-17