You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在STM32定时器中断执行时获取代码微秒级运行时间

STM32定时器中断内微秒级计时与IDE测时方法

一、定时器中断中检测代码运行时间(微秒级)

1. 硬件定时器计时法

  • 挑选一个闲置的定时器,将其配置为1MHz计数模式(比如通过APB分频设置,让定时器时钟为1MHz,每计数1次对应1微秒)。
  • 在中断服务函数(ISR)内待测试代码块的开头,读取定时器当前计数值存入start_cnt;在代码块结尾再次读取计数值存入end_cnt。
  • 计算时间差:若end_cnt >= start_cnt,直接用end_cnt - start_cnt得到微秒数;若定时器中途发生溢出,则用(定时器自动重装载值 - start_cnt) + end_cnt + 1计算总时间。
  • 注意事项:该定时器的中断优先级必须低于被测试的中断,避免打断ISR影响计时精度;若处于嵌套中断场景,需临时关闭其他中断或做好上下文保护。

2. DWT内核单元计时法

  • 所有Cortex-M内核的STM32均搭载DWT单元,其中的CYCCNT寄存器可直接计数CPU时钟周期。
  • 先初始化DWT:开启DWT使能位(CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk),清零CYCCNT寄存器(DWT->CYCCNT = 0),最后启动计数(DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk)。
  • 在ISR代码块开头读取DWT->CYCCNT存入start_cycle,结尾读取end_cycle,时间计算公式为:(end_cycle - start_cycle) / CPU主频(单位MHz),结果即为微秒数。
  • 优势:无需占用额外定时器,精度极高;若CPU主频为整数MHz,计算更便捷,比如168MHz主频下,168个周期对应1微秒。

二、STM32 IDE中获取代码执行时间的方法

1. 调试断点计时法

  • 进入IDE调试模式,给待测试代码段的首尾分别设置断点。
  • 启动调试,运行至第一个断点时,记录调试窗口中的时间戳(或直接使用STM32CubeIDE自带的"Execution Time"插件查看实时计时)。
  • 继续运行至第二个断点,再次读取时间戳,两者的差值即为代码执行时间。
  • 注意:调试模式存在额外开销,测量结果会略长于实际运行时间,适合粗略估算。

2. SWO跟踪计时法

  • 配置STM32的SWO引脚,启用ITM(仪器跟踪宏单元)输出功能。
  • 在代码中插入ITM打印语句,输出待测试代码段首尾的DWT_CYCCNT值。
  • 在IDE的"Trace"视图中捕获ITM输出数据,用首尾周期数的差值除以CPU主频,即可得到精准的微秒级时间。
  • 优势:几乎不影响代码实际运行状态,测量精度高,适合需要精准数据的场景。

内容的提问来源于stack exchange,提问作者Min

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 15:17:13