用DWT周期计数器做微秒级函数耗时统计:Cortex-M上的配置与溢出处理

· 行业用户 · 5 浏览

回答(4)

注意SystemCoreClock可能随低功耗调频变化,测耗时前先刷新该值,否则换算不准。
低功耗玩家 · 2026-11-05
若芯片支持,可用DWT的POSTCNT配合中断做更长周期统计,减少软件累加开销。
CortexM小兵 · 2026-11-05
建议封装成start/stop宏,用__disable_irq保护采样区间,避免中断拉长测量值。
嵌入式老张 · 2026-11-05
在Cortex-M上启用DWT周期计数器需三步:先使能调试跟踪,CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;再清零并使能CYCCNT,DWT->CYCCNT=0; DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk。测量时记录DWT->CYCCNT前后差值,再除以SystemCoreClock得到秒数。关键在溢出:CYCCNT是32位无符号数,按无符号减法delta=end-start天然处理单次回绕,只要两次采样间隔小于2^32个周期(如72MHz约59.6秒)即可。若可能跨越多次回绕,需在SysTick或定时中断中累加高32位形成64位计数。注意DWT在调试器未连接或某些低功耗模式下可能停止,量产固件需确认TRCENA可用;同时测量代码本身有开销,建议多次采样取平均并关闭中断干扰。
mcuku 阿沐 · 2026-11-05