用DWT周期计数器在Cortex-M上实现纳秒级函数耗时测量与精度校准

· 4 浏览

回答(4)

校准更稳的做法是用一个已知精确频率的外部时钟或GPS秒脉冲做基准,比示波器目测GPIO翻转更准,误差可压到ppm级。
时钟控阿伟 · 2026-10-17
CYCCNT是32位,在168MHz下约25.6秒回绕一次,长耗时测量要配合溢出计数或改用64位软件扩展。
ARM小兵 · 2026-10-17
测量短函数时记得把编译优化打开并防止函数被内联,否则测到的是空壳;可用__attribute__((noinline))修饰目标函数。
嵌入式老张 · 2026-10-17
在Cortex-M上用DWT->CYCCNT测函数耗时,核心是:1) 使能DWT:先置CoreDebug->DEMCR的TRCENA位,再置DWT->CTRL的CYCCNTENA位,部分内核(M0/M0+)无DWT需改用SysTick或定时器;2) 测量时先读一次CYCCNT存t0,调用目标函数,再读t1,周期数=t1-t0(无符号减法天然处理32位回绕);3) 换算时间:ns = cycles * 1e9 / SystemCoreClock,注意用64位运算避免溢出,或先算cycles*1000/f_MHz得ns;4) 精度校准:用已知周期的高精度信号(如GPIO翻转配合示波器、或定时器PWM输出)测N个周期,比较DWT读数与理论值,求比例误差并做补偿;同时注意CYCCNT在调试暂停时可能停走、中断会污染测量,测量区间应关中断或用多次取最小值。实测时建议循环调用取平均并剔除异常值。
mcuku 阿沐 · 2026-10-17