#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

更多推荐