Hallo, ich lerne gerade den STM32L412 kennen und spiele ein wenig mit den Timern rum. Zuerst hab ich alles über CubeIDE konfiguriert, wollte das dann aber auch "zu Fuss" ausprobieren. Um den Einstieg zu erleichtern erstmal nur ein Timer, der Rest noch per IDE. Der erste Fallstrick ist dann aber schon die Reihenfolge in der das gemacht werden muss. Ich hab die Register der Reihe nach wie im Datenblatt aufgeführt, was dazu geführt hat dass Timer 2 (der eigentlich von extern getriggert und dann einen einzelnen 2ms-Puls ausgeben soll) zwar loslief, aber erstmal ewig lang hochzählte bis er überlief und dann in der 2. Runde beim eingestellten Auto-reload-Wert aufhörte. Erst als ich Prescaler und Auto-reload-Wert als erstes definiert habe ging es wie gedacht. Aus dem Reference-manual habe ich das so nicht rausgelesen oder nicht gefunden. Beim ARR steht zwar das bis da ein Wert ungleich 0 drinsteht der Timer blockiert ist, aber so ein Verhalten hab ich nicht erwartet. Kann mir jemand auf die Sprünge helfen wie man sowas in erfahrung bringt - und nicht durch stumpfes kopieren der IDE-Initialisation. Das klappt dann zwar, aber manist kein Deut schlauer. Ich denke dass rächt sich später falls Probleme auftauchen...
Ein neuer Prescaler wird beispielsweise erst beim Überlauf übernommen. Alle Register haben Startwerte. Überlege genau, was die Startwerte bedeuten und bewirken! Beschreibe doch mal genau was dein Timer machen soll. Vielleicht kann man dann einen kleinen Beispielcode schreiben.
Bob A. schrieb: > Aus dem Reference-manual habe ich das so nicht rausgelesen oder nicht > gefunden. Sachen, die logisch sind, muß man nicht unbedingt ins Manual schreiben. Es ist eigentlich für jede Peripherie gleich: Zuerst wird sie disabled bzw. angehalten. Dann erfolgen alle Initialisationen. Und zuletzt wird sie enabled bzw. gestartet. Manche Register haben auch verschiedene Bedeutungen ja nach Funktion. Dann muß die Funktion zuerst ausgewählt werden. Z.B. wird bei den AVR-Timern das Capture-Register auch als Top-Wert benutzt. Bei seriellen Interfaces ist es auch oft so, daß ein Disable erst nach Ende eines Transfers greift, d.h. man muß auf das entsprechende Bit pollen.
Hi Ben, Folgendes möchte ich erreichen: bei einer positiven Flanke am Eingangspin "E" soll ein 2ms-Puls an Ausganspin "A1" ausgegeben werden. Zeitgleich mit dem Pulsende soll eine zweiter Puls an einem anderen Ausgangspin "A2" beginnen. Dieser 2. Puls endet mit einer negativen Flanke am Eingangspin "E". Systemtakt sind 80MHz von der PLL Dazu habe ich vor Timer 2 mit Prescaler 79 und ARR 1999 im one-pulse Modus mit invertierter Polarität laufen zu lassen. CCR 1 wüde ein kleines delay zwischen Flanke an "E" und Flanke an "A1" bewirken, weniger geht aber nicht. Deswegen fast-mode damit der Timer gleich OCREF setzt und die 2ms präzise eingehalten werden. Beim update-event wird ein interrupt abgesetzt in dessen ISR dann "A2" gesetzt wird. Für "E" ist weiterhin ein interrupt an der fallenden Flanke definiert der dann "A2" zurücksetzt. Alles ohne eine Zeile application-code bisher
Ich denke ich habe eine entscheidende Stell im RM gefunden:
1 | As the preload registers are transferred to the shadow registers only when an update event |
2 | occurs, before starting the counter, you have to initialize all the registers by setting the UG |
3 | bit in the TIMx_EGR register. |
Bob A. schrieb: > Ich denke ich habe eine entscheidende Stell im RM gefunden: Wie ich bereits sagte: Nur bei einem Überlauf wird der Prescaler übernommen.
Ben S. schrieb: > Bob A. schrieb: >> Ich denke ich habe eine entscheidende Stell im RM gefunden: > > Wie ich bereits sagte: Nur bei einem Überlauf wird der Prescaler > übernommen. Naja, jedenfalls so lange der Timer läuft. Das macht ja auch prinzipiell Sinn, den erst vollständig zu konfigurieren und dann zu starten. Für das ARR-Register kann man das Verhalten über das ARPE-Bit im Control-Register einstellen, d.h. entweder Änderung sofort ("unbuffered") oder eben erst nach dem nächsten Update-Event ("buffered").
Christopher J. schrieb:Für das > ARR-Register kann man das Verhalten über das ARPE-Bit im > Control-Register einstellen Allerdings soll man ARPE beim PWM 1 Modus aktivieren (zumindest beim L412), da hat man die Wahl dann nicht mehr...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.