STM32F2 Zeitstempel mit ext. Takt erzeugen

OP #3246273
Hallo zusammen,

Ich stehe gerade einmal auf dem Schlauch, vielleicht kann mich jemand in 
die richtige Richtung schubsen:

Ich möchte mit einem STM32F2 einen Zeitstempel in µS generieren, der von 
einem externen Takt kommt. Diesen Wert benötige ich nur unregelmäßig 
(z.B. beim Eintreffen eines Datensatzes auf einer Schnittstelle, 
vielleicht ein paar hundert mal in der Sekunde), die Zeit soll aber 
synchron zum externen 1MHz Signal sein.

Bisherige Idee: Das Signal wird als externer Takt auf einen Zeitgeber 
gegeben, der bis 1.000.000 zählt und dann einen Interrupt auslöst. In 
diesem Interrupt wird eine Variable hoch gezählt, die die Sekunden 
enthält. Das sollte doch machbar sein.
Wenn ich nun diesen Zeitstempel benötige lese ich den aktuellen 
Timerstand aus - bekomme also die µS - und nehme den Sekundenzähler 
dazu.

So, da kommt nun mein Problem ins Spiel: Ich kann die beiden Werte ja 
nicht atomar in einer Operation auslesen. Das bedeutet: Wenn ich erst 
den Timer auslese und danach den Sekundenzähler, dann kann zwischendurch 
ein Timer Interrupt aufgetreten sein und die beiden passen nicht mehr 
zusammen. Andersherum ebenso.
Da war doch mal was mit einen Wert zwei mal auslesen und den anderen 
dann Korrigieren. So ähnlich wie: Timer auslesen, merken, Sekundenzähler 
auslesen, merken, Timer wieder auslesen, ist der nun kleiner als beim 
erstem mal Sekunde eins rauf. Aber was wenn zwischen den ersten beiden 
Schritten der Interrupt kam, dann ist der Sekundenzähler schon um eins 
hoch gegangen.
Da stehe ich nun uns brauche den Schubs. Wie macht man das noch mal 
richtig?

Danke und Gruß
Martin
Gast
>So, da kommt nun mein Problem ins Spiel: Ich kann die beiden Werte ja
>nicht atomar in einer Operation auslesen.

Gib deinem Interrupt die höchste Priorität. Dann ist das kein Problem.
OP
holger schrieb:
>>So, da kommt nun mein Problem ins Spiel: Ich kann die beiden Werte ja
>>nicht atomar in einer Operation auslesen.
>
> Gib deinem Interrupt die höchste Priorität. Dann ist das kein Problem.

Der Interrupt ist nicht das Problem, sondern der Zeitpunkt an dem ich 
den "zeitstempel" brauche.

Gruß Martin
Gast
>Der Interrupt ist nicht das Problem, sondern der Zeitpunkt an dem ich
>den "zeitstempel" brauche.

Dann disable alle Interrupts. Wo ist dein Problem?
Das wird seit hunderten von Jahren schon so gemacht.
Gast
>> Dann disable alle Interrupts. Wo ist dein Problem?
>> Das wird seit hunderten von Jahren schon so gemacht.
>
>Das mir dann vielleicht Takte verloren gehen.

Hä?

disable interrupts
lese us Timer
lese s Timer
enable interrupts

Dein Kram dauert bei einem STM32 gerade mal
4 Maschinenzyklen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.