如何在STM32上获取时间间隔?
How to get time intervals on STM32?
我想在STM32上测一下单个功能耗时多久。我唯一能找到的是SysTick_Handler
。然而,这是一个周期性的中断,但我需要的是获取时间间隔,如:
long t1 = mcu_clock();
sleep(20);
long t2 = mcu_clock();
long diff = (t2 - t1);
我试过 C clock()
,但它没有用,而且总是 return -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 秒内溢出。
如果您有可用的 HAL,请尝试;
int millis = HAL_GetTick();
我想在STM32上测一下单个功能耗时多久。我唯一能找到的是SysTick_Handler
。然而,这是一个周期性的中断,但我需要的是获取时间间隔,如:
long t1 = mcu_clock();
sleep(20);
long t2 = mcu_clock();
long diff = (t2 - t1);
我试过 C clock()
,但它没有用,而且总是 return -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 秒内溢出。
如果您有可用的 HAL,请尝试;
int millis = HAL_GetTick();