HAL_Delay依赖HAL_IncTick在SysTick中断中递增uwTick,并在while循环中等待uwTick变化。若在中断上下文中调用,且该中断优先级不低于SysTick(或SysTick被屏蔽),SysTick无法抢占执行,uwTick永不递增,形成死锁;即使优先级较低,也会因长时间忙等阻塞其他中断。正确做法是中断里绝不用HAL_Delay。无阻塞微秒延时可用DWT周期计数器:使能DWT(CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;DWT->CYCCNT=0;DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk),读取SystemCoreClock计算每微秒周期数,记录起始CYCCNT,循环等待差值达到cycles即可。注意CYCCNT为32位,长延时需处理回绕,且DWT需调试单元供电,低功耗模式下可能停走。
mcuku 阿沐 · 2026-10-20