STM32L0 Low-Power-UART-Empfänger liest nach dem Aufwachen der MCU die falschen Daten bei hoher Baudrate

Ich verwende für mein Projekt eine STM32L0- MCU. Die MCU verfügt über einen Low-Power-Timer (LPTIM) zum Aufwecken der MCU aus dem Stop-Modus und einen Low-Power-UART (LPUART) zum Aufwecken der MCU aus dem Stop-Modus und zum Empfangen/Senden von Daten.

Mein Problem ist: - Wenn ich die MCU im Betriebsmodus bleiben lasse, funktioniert LPUART bei einer Baudrate über 256000 einwandfrei. - Wenn ich die MCU so einstelle, dass sie in den Stoppmodus wechselt, wird die MCU aufgeweckt, wenn sie etwas von LPUART-Rx empfängt Lesen Sie die empfangenen Sequenzdaten weiter. Für diese Einrichtung funktioniert es gut, wenn die UART-Baudrate niedriger als 56000 ist. Wenn die Baudrate jedoch höher ist (z. B. bei 115200), liest LPUART die falschen Daten. Ich bin mir bewusst, dass in diesem Setup das erste übertragene Byte verloren geht, aber die anderen korrekt gelesen werden sollten.

Ich habe es mit mehreren verschiedenen gesendeten Daten mit unterschiedlichen Längen versucht, aber die empfangenen Daten sind immer falsch. (Funktioniert gut, wenn die Baudrate jedoch 56000 beträgt).

Gibt es keine Einschränkungen bezüglich der BAUD-Rate des Low-Power-UART? Könntest du ein Referenzhandbuch verlinken?
Hallo, ja, es gibt eine Grenze für Low-Power-UART, aber nur bei Verwendung von LSI/LSE. In meinem Fall, wenn LPUART etwas empfängt, wird DSP geweckt und verwendet HSI-Takt. Und auch im Run-Modus hat LPUART kein Problem mit hohen Baudraten (zumindest bis zu 256000, wie ich getestet habe). Hier das Referenzhandbuch: st.com/content/ccc/resource/technical/document/reference_manual/…
Was ist Ihre Uhrenkonfiguration bezüglich des LPUART?

Antworten (1)

Wakeup aus dem Stop-Modus mit LPUART

Der LPUART ist in der Lage, die MCU aus dem Stop-Modus aufzuwecken, wenn das UESM-Bit gesetzt ist und der LPUART-Takt auf HSI oder LSE eingestellt ist (siehe Abschnitt Reset und Taktsteuerung (RCC).

  • LPUART-Quellentakt ist HSI
    Wenn während des Stoppmodus der HSI-Takt ausgeschaltet ist, wenn eine fallende Flanke auf der LPUART-Empfangsleitung erkannt wird, fordert die LPUART-Schnittstelle das Einschalten des HSI-Takts an. Der HSI-Takt wird dann für den Rahmenempfang verwendet.

    • Wenn das Wakeup-Ereignis bestätigt wird, wacht die MCU aus dem Energiesparmodus auf und der Datenempfang geht normal weiter.
    • Wenn das Aufweckereignis nicht verifiziert wird, wird die HSI-Uhr wieder ausgeschaltet, die MCU wird nicht aufgeweckt und bleibt im Energiesparmodus und die Taktanforderung wird freigegeben.

Wenn der LPUART beginnt, Daten zu empfangen, werden die Uhren nicht sofort aktiv. HSI16 (interner 16-MHz-Hochgeschwindigkeits-RC-Oszillator) benötigt typischerweise 3,7 μs zum Starten.*

Sie können die Startzeit des HSI16 eliminieren, indem Sie es im Stoppmodus laufen lassen, wenn Sie dies wirklich benötigen. Sobald der HSI16 verfügbar ist, muss der LPUART selbst aktiviert werden, was ebenfalls bis zu 12 μs* dauert:

*Das Referenzhandbuch erwähnt keine Startzeiten, da sie für jedes einzelne Teil spezifisch sind. Die tatsächlichen Werte finden Sie im Datenblatt, der Wert hier ist für den STM32L051x6/8 und hier nur zur Veranschaulichung aufgeführt.

Bei 56 kBaud beträgt die Übertragungsperiode eines Bits 17,86 μs, was kaum lang genug ist (immer noch wahrscheinlich außerhalb der Spezifikation), damit der LPUART aufwacht, bevor das nächste Bit ankommt und alles aus dem Takt gerät. Deshalb können Sie die Baudrate nicht erhöhen.

Siehe "Bestimmen der maximalen LPUART-Baudrate, die ein korrektes Aufwachen aus dem Stoppmodus ermöglicht, wenn die LPUART-Taktquelle die HSI-Uhr ist" (Seite 734, Referenzhandbuch )

Ich denke, man sollte die Beispielrechnung im Idealfall aus dem Handbuch kopieren.
@BenceKaulics OP hat nicht bekannt gegeben, welcher spezifische Chip verwendet wird, daher kann ich die eigentliche Berechnung nicht durchführen. Ich habe auf den entsprechenden Teil des Referenzhandbuchs verwiesen . Wenn dies nicht ausreicht, können Sie meine Antwort gerne verbessern.
Nur so als Beispiel.