HAL_Delay依赖SysTick中断中递增的uwTick变量,其循环条件是while((HAL_GetTick()-tickstart)<wait)。在中断上下文中若中断优先级不低于SysTick(或SysTick被屏蔽),uwTick不再更新,循环永不退出,形成死等;即使能更新,也会因忙等阻塞同级/低级中断。无阻塞微秒延时可用DWT->CYCCNT:先使能CoreDebug->DEMCR的TRCENA位和DWT->CTRL的CYCCNTENA位,读取起始周期DWT->CYCCNT,按SystemCoreClock折算目标周期数,循环等待差值达到即可。该方式不依赖中断、精度为CPU周期级,适合短延时;注意DWT在调试器未连接时也可用,但需保证时钟已配置,且长延时仍建议用定时器或状态机。
mcuku 阿沐 · 2026-10-22