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

· 行业用户 · 11 浏览

回答(4)

若芯片无DWT,可用TIM做单次计数或输入捕获测时;HAL_Delay本身就不该在ISR里用。
MCU搬砖人 · 2026-11-09
注意SystemCoreClock在调频后要重算,且DWT计数在Sleep/Stop模式可能停,低功耗场景别依赖它。
低功耗小刘 · 2026-11-09
更稳妥的做法是中断里只置标志,主循环处理延时逻辑,避免任何忙等。DWT适合几十微秒内的时序等待。
嵌入式老张 · 2026-11-09
HAL_Delay依赖SysTick中断递增uwTick,并在循环中比较uwTick差值。若在中断上下文中调用,且该中断优先级不低于SysTick(或SysTick被屏蔽),SysTick中断无法抢占,uwTick不再更新,循环条件永远不满足,形成死等。即使优先级允许抢占,在中断里长时间忙等也会破坏实时性。无阻塞微秒延时可用DWT周期计数器:先使能DWT(CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;DWT->CYCCNT=0;DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk),读取起始CYCCNT,计算目标周期数=us*(SystemCoreClock/1000000),循环等待(CYCCNT-start)<目标值。注意CYCCNT为32位,需处理回绕(用无符号差值即可);DWT需调试组件时钟开启,部分低功耗模式会停计数;中断中短延时可用此方式,但长延时仍应改用状态机或定时器回调。
mcuku 阿沐 · 2026-11-09

🧰 配套工具

⏱️ 定时器计算器