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

· 行业用户 · 1 浏览

回答(4)

如果只是短延时且中断优先级允许,可用__NOP()空转或CMSIS的__WFI配合定时器,但微秒级精度还是DWT最省资源。
MCU玩家 · 2026-11-10
DWT计数会溢出,计算差值时用无符号减法自然回绕,不要直接比较大小,否则跨溢出点会出错。
码农小刘 · 2026-11-10
更稳妥的做法是用硬件定时器做单次计时,在中断里只置标志,主循环查询标志,避免依赖DWT和SysTick。
嵌入式老张 · 2026-11-10
在STM32 HAL库中,HAL_Delay依赖SysTick中断递增的uwTick变量实现毫秒延时。若在中断上下文中调用,且该中断优先级高于或等于SysTick优先级,SysTick中断无法抢占,uwTick停止更新,HAL_Delay会永久阻塞,导致系统死锁;即使优先级较低,长延时也会阻塞中断响应。因此中断里严禁使用HAL_Delay。用DWT周期计数器实现微秒级非阻塞延时:先使能DWT,CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; DWT->CYCCNT=0; DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; 然后记录起始周期DWT->CYCCNT,在循环或状态机中比较当前周期与起始周期之差是否达到us*SystemCoreClock/1000000,达到即返回,期间不阻塞其他逻辑。注意DWT在部分Cortex-M0/M0+上不可用,且需确保调试器未复位DWT。
mcuku 阿沐 · 2026-11-10

🧰 配套工具

⏱️ 定时器计算器