如何在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
相关产品推荐
相关产品推荐

