2017-02-15 3 views
1

Ich möchte messen, wie lange eine einzelne Funktion auf STM32 dauert. Das einzige, was ich finden konnte, ist SysTick_Handler. Das ist jedoch eine periodische Unterbrechung, aber was ich brauche, ist Zeitintervall erhalten wie:Wie bekomme ich Zeitintervalle auf STM32?

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

Ich habe versucht C clock(), aber es hat nicht funktioniert und immer -1 zurück. Wie kann ich es schaffen?

+0

Inkrementieren Sie eine Variable im 'SysTick_Handler' und fragen Sie diese Variable ab. –

+0

@BenceKaulics Ist das die einzige Lösung? Es scheint wie ein Workaround. –

+0

Sie müssen einen Timer auf beide Arten einrichten und verfolgen. Am einfachsten ist es, den System-Tick und eine einfache Variable zu verwenden. Die offizielle HAL-Bibliothek von ST macht es auf die gleiche Weise, Beispiel: [stm32F0xx_hal.c] (https://github.com/wemos/Motor_Shield_Firmware/blob/master/Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal.c) –

Antwort

5

Aktivieren Sie zuerst den Zykluszähler einmal beim Start:

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

dann können Sie seinen Wert zugreifen:

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

Es zählt die verstrichene CPU-Zyklen, müssen Sie es mit der teilen CPU-Taktfrequenz, um einen Wert in Sekunden zu erhalten.

Da es sich um einen 32-Bit-Wert handelt, kann es bei höheren Taktfrequenzen ziemlich schnell überlaufen, z. B. in 19,88 Sekunden bei 216 MHz.

+0

Sehr nützliche Antwort . ;-) –