能够计时某段stm32f429单片机程序运行时间的程序,开始计时函数和结束计时函数,结束时通过printf输出运行时间。
使用DWT (Data Watchpoint and Trace)单元来实现高精度计时,这是Cortex-M4核心的一个功能:
要使用这段代码需要注意:
-
需要确保你的工程中已经正确配置了串口打印功能(重定向了printf)
-
如果你的系统时钟不是180MHz,需要修改endTimer()中的除数
-
计时精度取决于CPU频率,180MHz时精度约为5.56ns
-
计时器是32位的,在180MHz时大约能测量最大23.8秒
- 最大时间 = (2^32) / 180,000,000 ≈ 23.8秒
-
如果需要测量更长时间,可以修改代码使用64位变量存储时间
#include "stm32f4xx.h"
#include <stdio.h>
// 初始化DWT
void DWT_Init(void)
{
// 使能DWT外设
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
// 清空DWT CYCCNT计数器
DWT->CYCCNT = 0;
// 使能CPU周期计数器
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
}
// 获取当前CPU计数值
uint32_t getDwtCnt(void)
{
return DWT->CYCCNT;
}
// 开始计时
uint32_t startTime = 0;
void startTimer(void)
{
startTime = getDwtCnt();
}
// 结束计时并打印运行时间
void endTimer(void)
{
uint32_t endTime = getDwtCnt();
uint32_t cycles = endTime - startTime;
// 假设系统时钟为180MHz
float timeUs = (float)cycles / 180.0f; // 微秒
float timeMs = timeUs / 1000.0f; // 毫秒
printf("Runtime: %.2f us (%.2f ms)\r\n", timeUs, timeMs);
}