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

Posted

技术标签:

【中文标题】如何在STM32上获得时间间隔?【英文标题】:How to get time intervals on STM32? 【发布时间】:2017-07-03 22:07:25 【问题描述】:

我想测量一个函数在 STM32 上需要多长时间。我唯一能找到的是SysTick_Handler。但是,这是一个周期性中断,但我需要的是获取时间间隔,例如:

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

我已经尝试过 C clock(),但它不起作用并且总是返回 -1。我怎样才能做到?

【问题讨论】:

SysTick_Handler 中增加一个变量并查询该变量。 @BenceKaulics 这是唯一的解决方案吗?这似乎是一种解决方法。 您必须以任何一种方式设置一个计时器并跟踪它。最容易使用的 sys 刻度和一个简单的变量。 ST 的官方 HAL 库也是这样做的,例如:stm32F0xx_hal.c 【参考方案1】:

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

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】:

如果您有可用的 HAL,请尝试;

int millis = HAL_GetTick();

【讨论】:

以上是关于如何在STM32上获得时间间隔?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Linux PC 上运行 stm32 单元测试?

如何让 printf 在 STM32F103 上工作?

理论上如何在STM32F3中实现最大采样率?

如何在 stm32f107 芯片上禁用/启用中断?

在STM32板上运行后如何更改UART波特率?

如何在 STM32 微控制器上的两个程序之间共享单段闪存