2016-04-16 10 views
2

Ich möchte eine Stoppuhr von Embedded C auf ST STM32F407VG programmieren. Ich weiß, wie ich ein Uhrprogramm schreiben sollte, um ein Hundertstel von Sekunden zu machen, aber ich weiß, dass es nicht genau sein wird, wenn ich eine Verzögerung von 10ms verwende. was soll ichgenaue Stoppuhr von Embedded C

+2

'Bis zu 17 Timer: bis zu zwölf 16-Bit- und zwei 32-Bit-Timer bis zu 168 MHz mit jeweils bis zu 4 IC/OC/PWM oder Impulszähler und Quadratur (inkremental) Encoder-Eingang' Ich bin sicher, dass Sie besser als 10ms verwalten können .... –

+1

Warum wissen Sie, dass es nicht genau sein wird? Es hängt ganz davon ab, wie Sie die Verzögerung implementieren. Das Gerät verfügt über Hardware-Timer, die genau so genau wie Ihre Uhrquelle sind. – Clifford

Antwort

5

tun Während die STM32 mit einer Reihe von Hardware-Timer ausgestattet ist, alle Cortex-M-Geräte haben einen gemeinsamen SysTick Timer, so die einfachste und tragbare Methode ist, dass zu verwenden.

Die folgende erstellt eine 1 Millisekunde Periode freilaufende Zähler msTicks:

#include "stm32f4xx.h" 
#include <stdint.h> 

static volatile uint32_t msTicks = 0; // Milliseconds 

int main(void) 
{ 
    SysTick_Config(SystemCoreClock/1000) ; // 1ms interrupt 

    for(;;) 
    { 
     ... // your code here 
    } 
} 

// SYSTICK interrupt handler 
void SysTick_Handler(void) 
{ 
    msTicks++ ; 
} 

Dann können Sie Ihre Stoppuhr somit mit zwei Funktionen realisiert werden:

static uint32_t start_time ; 
void start(void) 
{ 
    start_time = msTicks ; 
} 

uint32_t getMillisecondsSinceStart(void) 
{ 
    return msTicks - start_time ; 
} 

Zum Beispiel:

bool running = false ; // needs <stdbool.h> included 
uint32_t time_millisec = 0 ; 

for(;;) 
{ 
    if(startButtonPressed()) 
    { 
     running = true ; 
     start() ; 
    } 

    if(stopButtonPressed()) 
    { 
     running = false ; 
    } 

    if(running) 
    { 
     time_millisec = getMillisecondsSinceStart() ; 
    } 

    displayTime(time_millisec) ; 
} 

Die Genauigkeit hängt vollständig von dem ab, was den c antreibt Erz Uhr - normalerweise ein externer Kristall oder Oszillator. Der interne RC-Oszillator wird weniger präzise sein - er ist werksseitig auf +/- 1% getrimmt. Ihr bestimmter Teil hat auch einen 32KHz RC-Oszillator zum Ansteuern der RTC, der kalibriert werden kann, der aber nicht zum Antreiben der Kernuhr (Systick) verwendet werden kann und weniger portabel, weniger genau und komplexer als die oben beschriebene Methode wäre.