1. 单片机代码运行时间测量的必要性在嵌入式系统开发中精确测量代码执行时间是每个工程师必备的技能。无论是优化性能、调试时序问题还是验证实时性要求都需要准确知道关键代码段的执行时长。我见过太多项目因为忽略了这个基础工作导致后期出现各种难以排查的时序问题。以STM32为例常见的需求场景包括验证延时函数的准确性如us级、ms级延时测量中断服务程序的执行时间评估关键算法如PID控制、滤波算法的耗时检查while循环周期是否满足设计要求2. 示波器测量法详解2.1 硬件准备与接线方案示波器法是最直观的测量方式只需要一个GPIO引脚和一台数字示波器。我推荐使用以下配置选择PB0作为测试引脚其他可用GPIO也可使用10:1探头带宽≥100MHz示波器时基设置为合适范围us级测量建议1us/div接线时要注意探头地线尽量短就近接开发板GND避免使用长飞线防止引入干扰如果测量高频信号建议使用同轴电缆连接2.2 代码实现要点核心思路是在被测代码段前后翻转GPIO电平// 在gpio.h中定义控制宏 #define MEASURE_START() GPIO_SetBits(GPIOB, GPIO_Pin_0) #define MEASURE_STOP() GPIO_ResetBits(GPIOB, GPIO_Pin_0) // 测量示例 MEASURE_START(); Delay_us(100); // 被测代码 MEASURE_STOP();关键配置细节GPIO必须配置为推挽输出模式输出速度设为最高50MHz避免在中断中测量除非专门测量ISR时间测量前先初始化GPIO和相应时钟2.3 示波器操作技巧实测时我发现几个实用技巧使用单次触发模式捕捉瞬态信号打开测量统计功能获取平均值合理设置触发电平建议1.6V开启峰值检测功能捕捉异常情况典型问题排查如果波形畸变检查GPIO配置是否正确测量结果波动大时关闭其他中断源出现重影可能是示波器采样率不足3. 定时器测量法实现3.1 系统滴答定时器方案SysTick是Cortex-M内核自带的24位定时器非常适合做高精度时间测量uint32_t start, end; start SysTick-VAL; // 被测代码 end SysTick-VAL; uint32_t cycles (start end) ? (start - end) : (start (SysTick-LOAD 1) - end); float us (float)cycles / SystemCoreClock * 1e6;注意事项测量前确保SysTick已配置且未启用中断24位计数器会回绕需要处理溢出情况测量误差主要来自读取VAL寄存器的延迟3.2 通用定时器实现以TIM2为例的完整实现void TIM2_Init(void) { TIM_TimeBaseInitTypeDef TIM_InitStruct; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_InitStruct.TIM_Prescaler 0; TIM_InitStruct.TIM_CounterMode TIM_CounterMode_Up; TIM_InitStruct.TIM_Period 0xFFFFFFFF; TIM_InitStruct.TIM_ClockDivision 0; TIM_TimeBaseInit(TIM2, TIM_InitStruct); TIM_Cmd(TIM2, ENABLE); } uint32_t measure_time(void (*func)(void)) { TIM2-CNT 0; func(); return TIM2-CNT; }使用技巧选择未被使用的定时器TIM3/TIM4也可32位定时器可测量更长时间注意APB时钟分频对定时器时钟的影响4. 两种方法对比与选择建议4.1 精度对比方法理论精度实际精度最大测量时长示波器1ns级±50ns1s级SysTick14ns±100ns1.67ms通用定时器14ns±100ns59.65s4.2 适用场景根据我的项目经验快速验证优先选择示波器法长期监测使用定时器串口输出中断测量只能用定时器法低功耗场景SysTick最省电4.3 常见误区新手容易犯的错误忽略指令流水线对测量的影响未考虑编译器优化导致的代码重排测量短于100ns的代码段时方法不当在多任务环境中未隔离测量环境5. 高级技巧与优化建议5.1 最小化测量干扰为了获得准确结果关闭无关中断禁用看门狗测量前执行几次预热使用__ASM volatile( ::: memory)防止优化5.2 自动化测量方案对于需要频繁测量的项目我开发了这套自动化流程通过SWD接口读取定时器值脚本自动控制测量过程生成CSV报告和时序图建立性能基准数据库5.3 特殊场景处理测量中断处理时间时在中断入口和出口翻转GPIO使用硬件触发捕捉第一个脉冲注意保存/恢复现场的时间开销测量DMA传输时间利用传输完成中断或者监控DMA标志位配合GPIO和示波器观察在实际项目中我会根据具体需求组合使用这些方法。比如最近在电机控制项目中就同时使用了示波器法测量PWM响应时间又用定时器法统计整个控制循环的耗时。