TIM9_SR Interrupt-Flags beim STM32F4

Gast #2883190
Lesenswert?

Hier
Beitrag "ARM: kompliziert?"
wurde über die Vorzüge eines STM32F4 diskutiert, wobei das Problem der 
atomaren Befehle angesprochen wurde. Da diese im Gegensatz zu anderen 
µCs beim STM nicht vorhanden sind, können sich Probleme bei der 
Interruptverarbeitung ergeben.

Aktuell möchte ich beim Timer9 den Überlauf, sowie beide Capture-Flags 
per Interrupt auswerten. Die Bits CC2IF, CC1IF und UIF im 
TIM9_SR-Register werden durch das zugehörige Ereignis gesetzt und müssen 
per Software (in der Interruptroutine) auf '0' gesetzt werden.

UIF löscht man entsprechend mit TIM9->SR &= 0xfffe, was durch die 
Befehle Lesen, Maskieren, Zurückschreiben nicht atomar erledigt wird.
Wird nun währenddessen ein Capture-Flag gesetzt, wird es 
'großzügigerweise' gleich mit gelöscht: das ist schlecht!

Habe ich etwas übersehen oder wie kann eine zuverlässige Auswertung der 
Flags aussehen?
Gast #2883208
Lesenswert?

Danke, es war ein langer Tag heute :-)

Ich bin wohl auch schon zu verwöhnt. Als Renesas RX-Fan hat mich 
'gewurmt', dass nicht zu jedem Bit ein separater Vektor existiert und 
das Int-Flag automatisch gelöscht wird.
Gast #2883234
Lesenswert?

A. K. schrieb:
> Wieviel Vektoren hat denn so ein RX? Da kommen bei komplexeren Devices
> ja aberhunderte von Vektoren zusammen.

Die Tabelle hat 256 Einträge, wovon z. B. beim RX62 rund 200 genutzt 
werden.

A. K. schrieb:
> 1 schreiben ist neutral

Im TIMx_SR gibt es reservierte Bits, die '0' sind und nicht verändert 
werden sollen. Das hat mich wohl irritiert und zur Maske greifen lassen.
Gast #2883255
Lesenswert?

Pedanten, für die das Datenblatt ein heiliges Buch darstellt, müssen wie 
folgt formulieren:

TIM9->SR = TIM_SR_CC2OF | TIM_SR_CC1OF | TIM_SR_TIF | TIM_SR_CC2IF | 
TIM_SR_CC1IF;

UIF fehlt und wird gelöscht; alles sehr geschwätzig :-)
Gast #2884065
Lesenswert?

A. K. schrieb:
> Jo, da wär der Typ rc_w1 sinnvoller

Ja, beim AVR und RX ist das so.
Andererseits scheint "TIM9->SR = ~TIM_SR_UIF;" nicht schädlich zu sein. 
Die oberen Bits werden vom Prozessor wohl ignoriert.

Bei der praktischen Arbeit fällt mir der einzige Interrupt-Vektor für T9 
negativ auf. Ich möchte hochfrequente Capture-Ereignisse sehr schnell 
und T9-Überläufe (ca. alle 0,4ms) gemächlich abarbeiten.
Beim RX hätte ich separate Vektoren, die zudem eine eigene Priorität 
bekommen können. Beim STM32 muß alles in einer einzigen Routine 
gehandhabt werden, was die Ausführung bremst. Mal sehen, wie schnell es 
am Ende laufen wird.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren