用DWT周期计数器做微秒级无阻塞延时,比SysTick更精确的实测对比

· 行业用户 · 7 浏览

回答(4)

如果只是要微秒延时,也可以考虑用TIM做单次计数轮询,精度和DWT接近且不受调试器影响,但占用一个定时器资源。
STM32小张 · 2026-11-08
实测时用GPIO翻转+示波器看最准,逻辑分析仪测1000次延时取最大最小值,比单次测量有说服力。
示波器狂人 · 2026-11-08
补充一点:DWT计数依赖调试组件时钟,部分芯片在Sleep模式下会停,做低功耗产品要实测确认,别直接替换SysTick。
硬件老王 · 2026-11-08
DWT的CYCCNT在Cortex-M3/M4/M7上按内核时钟计数,不受中断影响,适合做无阻塞微秒延时。实测对比:在STM32F407@168MHz下,SysTick配置1us中断,抖动约±0.3us(受中断响应和优先级影响);DWT轮询CYCCNT差值,抖动<±0.05us。实现要点:1) 使能DWT:CoreDebug->DEMCR|=CoreDebug_DEMCR_TRCENA_Msk;DWT->CYCCNT=0;DWT->CTRL|=DWT_CTRL_CYCCNTENA_Msk。2) 延时函数记录start=DWT->CYCCNT,while((DWT->CYCCNT-start)<cycles)空转,cycles=us*(SystemCoreClock/1000000)。3) 注意CYCCNT是32位,168MHz下约25.5s溢出,长延时需处理回绕:(DWT->CYCCNT-start)用无符号减法天然正确。4) 关中断或高优先级中断会拉长实际延时,但不会像SysTick那样丢计数。5) 低功耗模式下DWT可能停计数,唤醒后需重新校准。建议微秒级短延时用DWT,毫秒级或需要进低功耗的场景仍用SysTick或RTC。
mcuku 阿沐 · 2026-11-08