Hi, Ich kommuniziere über UART zwischen einem STM32 und einem ESP32 uC, wobei der STM32 den DMA sowie den End of Line Interrupt verwendet. Wenn nun beim Starten ein Fehlerframe kommt (TX des ESP32 geht von Low auf High), dann wird mir die HAL_UART_ErrorCallback(); getriggert und von da an wird nur noch die UART Interrupt Routine aufgerufen. Das ganze kann ich unterbinden, wenn ich wie im Anhang den "DMA on RX Error" deaktiviere. Nun möchte ich aber den Fehler catchen und den Fehler zurücksetzen, jedoch weiss ich nicht wie. Was für ein Flag muss ich dafür zurücksetzen?
UART und DMA ist in 99,99999% aller Fälle Bullshit! Sowas macht man Zeichen für Zeichen mit Interrupts.
Stefan ⛄ F. schrieb: > Du hast vergessen, das konkrete STM32 Modell anzugeben. Es handelt sich um den STM32L081CBT6: https://www.st.com/resource/en/reference_manual/rm0377-ultralowpower-stm32l0x1-advanced-armbased-32bit-mcus-stmicroelectronics.pdf
Harry L. schrieb: > Sowas macht man Zeichen für Zeichen mit Interrupts Ich zumindest mache das immer so.
Noch was, der Fehler wird von einem HAL_UART_ERROR_FE (Frame Error) ausgelöst und ab und zu auch noch ein HAL_UART_ERROR_ORE, was auch Sinn macht, wenn man einfach den TX von LOW auf HIGH toggelt.
:
Bearbeitet durch User
Ok, ich glaube ich konnte es fixen. Im Endeffekt kam es zu einer Situation, wo das __HAL_UART_CLEAR_IDLEFLAG zu früh zurückgesetzt wurde. Nun was mich aber interessiert ist, warum ich überhaupt Framing Fehler bekomme bzw. wie ich diese beim Start vermeiden kann. Ist es zu empfehlen, RX und TX des UARTs mit einem Pull-Up hochzuziehen? Wenn ich nämlich mit dem Computer kommuniziere, bekomme ich nie einen Framing Error, mit dem ESP32 beim Flashen immer.
Bert S. schrieb: > Ist es zu > empfehlen, RX und TX des UARTs mit einem Pull-Up hochzuziehen? Irgendwann hatte ich mal wo gelesen, man würde bei "UART"-Schittstellen von MARK und SPACE reden. So ist Z.B. der "idle"-Zustand einer RS232-Schnittstelle gekennzeichnet durch eine "größere Anzahl" von MARKs. Das folgende SPACE kennzeichnet dann die 'start'-Condition. Spannend wird es, wenn man mit BREAKs arbeitet, z.B. um den Beginn eines Datenblocks anzuzeigen. Ein BREAK wird signalisiert, wenn die Datenleitung für "längere Zeit" auf SPACE hängt. Das folgende MARK kennzeichnet dann den Start eines Packets (MAB = "Mark After Break"). Also, RX und TX eines UARTs (UART - Universal Asynchronous Receiver Transmitter) unreflektiert "irgendwo hinzuziehen" ist vielleicht nicht so prickelnd...
Der Ruhezustand sollte jedenfalls HIGH sein, deswegen finde ich Pull-Ups gut.
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.