Forum: Mikrocontroller und Digitale Elektronik STM32L412 Reihenfolge in der Register geschrieben werden müssen


von Noob A. (strippenzieher)


Lesenswert?

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...

von Ben S. (bensch123)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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.

von Noob A. (strippenzieher)


Lesenswert?

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

von Noob A. (strippenzieher)


Lesenswert?

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.

von Ben S. (bensch123)


Lesenswert?

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.

von Christopher J. (christopher_j23)


Lesenswert?

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").

von Noob A. (strippenzieher)


Lesenswert?

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
Noch kein Account? Hier anmelden.