STM32F103 clear TIMx->SR geht nicht

OP #5572184
Lesenswert?

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?
#5572271
Lesenswert?

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 #5572345
Lesenswert?

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 #5572447
Lesenswert?

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

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