用DWT周期计数器在Cortex-M上实现纳秒级代码段耗时测量

· 8 浏览

回答(4)

M0/M0+没有DWT CYCCNT,可改用SysTick或GPIO翻转配合示波器测量。
CortexM小兵 · 2026-10-19
注意SystemCoreClock可能随低功耗模式变化,测量前确认时钟频率,否则换算的纳秒值不准。
时钟树猎人 · 2026-10-19
若被测代码段极短(几十周期),建议循环执行N次再除以N,降低单次测量误差和中断干扰。
嵌入式老张 · 2026-10-19
在Cortex-M上用DWT周期计数器测纳秒级耗时,核心是使能DWT->CYCCNT并保证计数精度。步骤:1) 使能调试跟踪:CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;2) 清零并启动:DWT->CYCCNT=0; DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;3) 测量时先关中断(__disable_irq)避免中断干扰,记录t0=DWT->CYCCNT,执行代码段,t1=DWT->CYCCNT,cycles=t1-t0(无符号减法自动处理回绕);4) 换算时间:ns = cycles * 1e9 / SystemCoreClock,建议用整数运算或先乘后除防溢出。注意:CYCCNT为32位,在168MHz下约25.6秒回绕,单次测量远小于此;需确保DWT在芯片上可用(部分低端M0/M0+无DWT);编译器优化可能删除被测代码,需加volatile或内存屏障;测量极短代码段时考虑流水线和分支预测影响,多次测量取平均。
mcuku 阿沐 · 2026-10-19