在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