如何在STM32上获取时间间隔?

5

我想测试STM32上单个函数的运行时间。我能找到的唯一东西是 SysTick_Handler 。然而,那是一个定期的中断,而我需要获取时间间隔,例如:

long t1 = mcu_clock();
sleep(20);
long t2 = mcu_clock();
long diff = (t2 - t1);

我尝试使用 C 的 clock() 函数,但它无法正常工作并且总是返回 -1。 我该怎么做呢?


SysTick_Handler 中递增一个变量并查询该变量。 - Bence Kaulics
@BenceKaulics 这是唯一的解决方案吗?它看起来像一个权宜之计。 - Kevin Dong
你需要以任何方式设置一个计时器并跟踪它。最简单的方法是使用系统滴答和一个简单的变量。ST的官方HAL库也是这样做的,例如:stm32F0xx_hal.c - Bence Kaulics
2个回答

15

首先,在启动时启用循环计数器:

CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
DWT->CYCCNT = 0;
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;

然后,您可以访问其值:

unsigned long t1 = DWT->CYCCNT;
/* do something */
unsigned long t2 = DWT->CYCCNT;
unsigned long diff = t2 - t1;

它计算了经过的CPU周期,您需要将它除以CPU时钟频率以获得秒为单位的值。

由于它是一个32位的值,在更高的时钟频率下它可能会很快溢出,例如在216 MHz下约19.88秒。


2
非常有用的答案。;-) - Kevin Dong
1
什么是DWT?我找不到相关的参考资料。 - Eduardo Reis

4
如果您有HAL可用,尝试执行以下操作;
int millis = HAL_GetTick();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接