STM32F103 clear TIMx->SR geht nicht

OP #5572184
Nabend miteinander,

ich habe hier ein (in meinen Augen kurioses) Problem, das ich nicht 
gelöst bekomme.

Ich habe einen STM32F103 und möchte verschiedene Timer Interrupts 
nutzen. Da es aber nur eine ISR für diese Interrupts gibt muss ich in 
der ISR über TIMx->SR abfragen, was den Interrupt ausgelöst hat. Dabei 
werden mir aber immer falsche Events angezeigt, da ich das Status 
Register nicht resetten kann.

Hier mal eine knappte Konfiguration für Timer 2
1
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
2
TIM2->PSC=72;
3

4
TIM2->CR1=TIM_CR1_CEN;
5
//Nach dem aktivieren von Timer 2
6
// werden in TIMx->SR die Bits UIF, 
7
// CC1IF, CC2IF, CC3IF und CC4IF gesetzt
8

9
TIM2->SR=0;
10
//Das resetten der gesetzten Bits
11
// funktioniert so leider nicht,
12
// die entsprechenden Bits bleiben High.

Wieso kann ich das Status Register nicht resetten?
Studiere mal das Kapitel über Timer im Reference Manual des F103. 
Insbesondere den Abschnitt zu Time-Base Unit. Dort ist auch noch ein ARR 
Register erwähnt...

Überarbeite deinen obigen Code anschließend nochmal. Konkret: 
Initialisiere deinen Timer vollständig und nicht nur halb. Dann sollte 
es tun. Timer in Betrieb nehmen ist kein Hexenwerk. Gibt auch unzählige 
Beispiele im Netz dazu.
OP
TIMx->ARR wird beim setzen von RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; mit 
0xFFFF initialisiert (sagt zumindest mein Debugger).

Das Manual sagt dazu:
In upcounting mode, the counter counts from 0 to the auto-reload value 
(content of the
TIMx_ARR register), then restarts from 0 and generates a counter 
overflow event.

Also alles so wie es soll.
Aber ich glaube das Problem gefunden zu haben. Scheint am Prescaler zu 
liegen. Wenn ich den auf 0xFFFF setze dann zeigt mir der Debugger auch, 
dass TIMx->SR auf null gesetzt wird. Wenn der Prescaler auf 72 steht ist 
das Register einfach schon wieder neu gesetzt worden.
Gast
Auch wichtig

  TIM2->PSC =  24 - 1;
  TIM2->ARR = 0xFFFF;
  TIM2->EGR = TIM_EGR_UG;  // Update Event generieren

  TIM2->CR1 = TIM_CR1_CEN;

Manche Register werden erst bei einem Update Event geladen. Daher am 
besten ein Update Event erzeugen, damit der Timer direkt beim start 
korrekt losläuft

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 8 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.