stm32f103c8t6 DWT 时间戳(用来计算软件代码执行时间)
·
#define DWT_CTRL (*(volatile uint32_t *)0xE0001000)
#define DWT_CYCCNT (*(volatile uint32_t *)0xE0001004)
#define DEMCR (*(volatile uint32_t *)0xE000EDFC)
#define TRCENA (1 << 24)
#define CYCCNTENA (1 << 0)
// 初始化 DWT 计数器
void DWT_Init(void)
{
// 启用 TRC (Trace)
DEMCR |= TRCENA;
// 清零循环计数器
DWT_CYCCNT = 0;
// 启用循环计数器
DWT_CTRL |= CYCCNTENA;
}
uint32_t DWT_GetCycles(void)
{
return DWT_CYCCNT;
}
int main()
{
CPU_TS start_ts, end_ts, delta_ts;
start_ts = DWT_GetCycles();
OSTimeDlyHMSM(0, 0, 0, 500,
OS_OPT_TIME_HMSM_STRICT,
&err);
//end_ts = CPU_TS_Get32();
end_ts = DWT_GetCycles();
delta_ts = end_ts - start_ts; // 32位无符号减法自动处理溢出(只要间隔不超过59秒)
// 转换为微秒 (假设 SystemCoreClock 是 72000000)
time_us = delta_ts / 72;
printf("00011110time0 = %u\n",time_us);
}
以上代码是在72M时钟下计算的,最长统计时长约为60s
时钟频率 36MHz:最长计时 ≈ 120s
时钟频率 48MHz:最长计时 ≈ 90s
时钟频率 64MHz:最长计时 ≈ 67s
更多推荐



所有评论(0)