Forum: Mikrocontroller und Digitale Elektronik STM32F103 clear TIMx->SR geht nicht


von A. Z. (donvido)


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?

von Sebastian K. (sek)


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.

von A. Z. (donvido)


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.

von Martin (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.