Gast
#5149530
Hallo, ich habe gerade einen kleinen Hänger beim Verständnis des "Receive Timeout" der STM32, z.B. STM32L073. Wer die RTO-Funktion kennt: Frage im letzten Absatz. Die USART (und auch der LPUART) können nach einer frei definierbaren Zeit (Anzahl von Bitlängen, USART_RTOR) einen "Receive Timeout" detektieren und diesen beispielsweise per Interrupt melden (einschalten mit RTOEN in USART_CR2 und Int freigeben mit RTOIE in USART_CR1). Im RT-Interrupt kann man dann z.B. den DMA ausschalten um den DMA-unterstützten Empfang einer unbekannten Anzahl von Zeichen dann zu beenden (dazu gibt es auch Beispiele im Netz). Ich will den RTO benutzen um im "Transfer Complete" Interrupt des DMA Kanals zwei Ping-Pong Puffer für Nachrichten konstanter, mit bekannter Länge zu alternieren. Die Zeit zwischen zwei Übertragungen ist groß genug um den jeweils zuletzt genutzten Puffer zu verarbeiten. Sollte es aber doch mal zu einem Fehler kommen bzw. initial genau während einer Übertragung der Empfang starten empfange ich natürlich die korrekte Anzahl an Zeichen, jedoch "zusammengesetzt" aus eigentlich zwei Paketen, also nicht 12345 12345 12345 12345 12345 sondern 34512 34512 34512 34512 Mit dem RTO könnte man nach dem Empfang von Byte 5 den Timeout detektieren, den DMA abbrechen, neu mit CNTDR laden und wieder starten. Problem: Sobald ich die RTO-Funktion nutze scheint der DMA permanent deaktiviert zu werden. Natürlich setze ich im RTO-Interrupt das RTOF im USART_ISR zurück. FRAGE: Wenn ich die Reference Manuals richtig verstehe, sollte die RTO-Funktion erst aktivieren können, dann beliebig lang warten können. Erst wenn ein Stop-Bit empfangen wurde zählt die RTO-Funktion los und meldet einen Timeout - wenn ich diesen Timeout quittiere sollte doch bis zum nächsten Stop-Bit Ruhe sein? Danke!