2017-02-15 473 views
1

我想测量单个函数在STM32上花费多长时间。我唯一能找到的就是SysTick_Handler。然而,这是一个周期性的中断,但我需要的是得到这样的时间间隔:如何在STM32上获取时间间隔?

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

我试过çclock(),但它没有工作,总是返回-1。我怎么做到的?

+0

增加'SysTick_Handler'中的变量并查询该变量。 –

+0

@BenceKaulics是唯一的解决方案吗?这似乎是一种解决方法。 –

+0

您必须以任一方式设置一个计时器并记录它。最简单的使用sys tick和一个简单的变量。 ST的官方HAL库也采用相同的方式,例如:[stm32F0xx_hal.c](https://github.com/wemos/Motor_Shield_Firmware/blob/master/Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal.c) –

回答

5

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

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秒。

+0

非常有用的答案。 ;-) –