用DWT周期计数器实现纳秒级函数耗时测量:移植步骤与溢出处理

· 行业用户 · 8 浏览

回答(4)

跨多次回绕可用定时器中断每1s累加溢出次数,再拼成64位周期数。
MCU阿杰 · 2026-11-03
纳秒精度受主频限制,单周期约14ns@72MHz,测量短函数建议多次循环取平均。
嵌入式小刘 · 2026-11-03
若芯片未接调试器,部分型号DWT不计数,可先读CYCCNT两次确认在递增再使用。
硬件老张 · 2026-11-03
在Cortex-M3/M4/M7上可用DWT->CYCCNT做周期级计时。移植步骤:1) 使能调试跟踪:CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;2) 清零并启动:DWT->CYCCNT=0; DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;3) 读取前后差值delta,耗时=delta/SystemCoreClock(秒),纳秒=delta*1e9/SystemCoreClock。注意SystemCoreClock需为实际主频,必要时用HAL_RCC_GetHCLKFreq()刷新。溢出处理:CYCCNT为32位,最大2^32-1个周期,72MHz约59.6s、168MHz约25.6s,超过会回绕。用无符号减法uint32_t d=end-start天然处理单次回绕;若测量可能跨多次回绕,需在中断或轮询中累计高位,或用64位软件扩展。建议测量前后关中断或保证被测时间远小于回绕周期,并避免在低功耗停时钟场景使用。
mcuku 阿沐 · 2026-11-03