Kevin Dong
Kevin Dong

Reputation: 5369

How to get time intervals on STM32?

I want to measure how long does a single function take on STM32. The only thing I could find is SysTick_Handler. However, that is an periodic interrupt, but what I need is get time interval like:

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

I've tried C clock(), but it didn't work and always return -1. How can I make it?

Upvotes: 6

Views: 20316

Answers (2)

SolwiseMD
SolwiseMD

Reputation: 79

If you've got HAL available try;

int millis = HAL_GetTick();

Upvotes: 5

First, enable the cycle counter once at startup:

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

then, you can access its value:

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

It counts the elapsed cpu cycles, you have to divide it with the cpu clock frequency to get a value in seconds.

As it's a 32 bit value, it can overflow quite fast at higher clock frequencies, e.g in 19.88 seconds at 216 MHz.

Upvotes: 17

Related Questions