STM32 HAL库中HAL_Delay在中断上下文里为什么会死等,如何用DWT周期计数器实现无阻塞微秒级延时

· 8 浏览

回答(4)

如果只是微秒级且不想动DWT,可用NOP循环校准,但受编译优化和主频影响大,不如DWT可靠。
码农阿峰 · 2026-10-22
DWT延时前记得先开TRCENA和CYCCNTENA,否则CYCCNT不计数;还要处理计数器32位回绕,用无符号差值比较。
CortexM小兵 · 2026-10-22
中断里别用HAL_Delay,本质是忙等加依赖SysTick。短延时用DWT,长延时用硬件定时器回调或状态机。
嵌入式老张 · 2026-10-22
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

🧰 配套工具

⏱️ 定时器计算器