ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

## 技术笔记:STM32 耗时统计的两把“尺子”

2026/8/6 10:18:02 拓冰建站 浏览量
##  技术笔记:STM32 耗时统计的两把“尺子”

在嵌入式开发中,性能优化离不开对代码执行时间的精准测量。今天记录两种最常用的统计方式:微观的周期计数宏观的毫秒统计

1. 微观精度:DWT 计数器(内核级周期统计)

第一段代码使用了 ARM Cortex-M 内核特有的 DWT (Data Watchpoint and Trace) 计数器。

uint32_t tick_start = DWT->CYCCNT;
// ... 执行代码 ...
uint32_t elapsed_ticks = DWT->CYCCNT - tick_start;
float elapsed_us = (float)elapsed_ticks / SystemCoreClock * 1000000.0f;
  • 原理DWT->CYCCNT 挂在 CPU 时钟上,CPU 每走一个时钟周期(Tick),它就加 1。

  • 优点

  • 极高精度:在 64MHz 频率下,分辨率高达 15.625 纳秒

  • 零额外负载:它是硬件自动累加,不占用中断。

  • 适用场景:测量算法性能、数学运算耗时、驱动时序调试。

  • 注意:64MHz 下,32 位计数器约 67 秒就会溢出,仅适用于短时间测量。


2. 宏观精度:HAL_GetTick (系统级毫秒统计)

STM32 常见的另一种方式是基于 SysTick 定时器产生的毫秒计数。

uint32_t start_ms = HAL_GetTick();
// ... 执行耗时较长的操作 ...
uint32_t elapsed_ms = HAL_GetTick() - start_ms;
  • 原理:通常配置 SysTick 每 1ms 触发一次中断,在中断里给一个全局变量加 1。

  • 优点

  • 简单易用:标准 HAL 库内置,随处可用。

  • 范围大:溢出周期长达 49 天。

  • 适用场景:统计用户操作延时、传感器采样间隔、超时处理(Timeout)。

  • 缺点:精度只有 1ms,无法捕捉代码级的细微波动。


💡 总结与心得

统计方式 核心 API / 寄存器 分辨率 常用单位 特点
DWT DWT->CYCCNT 1 周期 \(us\) / \(ns\) 极精准,适合底层调优
SysTick HAL_GetTick() 1 毫秒 \(ms\) 稳定,适合应用层逻辑

感悟:做算法优化时,一定要用 DWT。有时候一行浮点运算代码多加了一个 (float) 强制转换,在 DWT 的显微镜下,那几十个周期的差距会无所遁形。而对于用户交互,HAL_GetTick 已经绰绰有余。