Stm32G4: Timer, Dma, Usart

OP #7557384
Lesenswert?
• ▲
▼

Hallo zusammen,

ich verwende einen Stm32G431, mit dem ich über einen der USARTs ein Paket (16-32 Byte) per DMA sende. Der Timer liefert einen Interrupt (alle 5ms), die ISR setzt im wesentlichen die DMA-Parameter wie den Puffer, aus dem die Daten kommen. Es gibt zwei Puffer, weil die Daten zu einem beliebigen Zeitpunkt vom restlichen Code geändert werden kann. Am Ende des DMA-Transfers gibt es wieder einen Interrupt. Funktioniert soweit.

Ich frage mich, ob man nicht auf den Interrupt des Timers verzichten kann.

Dann müsste der Timer den Event liefern, damit der DMA-Transfer beginnt. Anschließend muss dann der USART die weiteren Transfers initiieren. Der Interrupt am Ende des DMA-Transfers sollte bleiben.

Das würde ja bedeuten, dass ein DMA-Channel mit mehreren unterschiedlichen Input-Events verbunden wird.

Vielleicht hat ja jemand einen Tipp dazu.

#7557537
Lesenswert?
• ▲
▼

Die simpelste Lösung wäre, dem Timer einen extra DMA-Kanal zu spendieren, mit dem lediglich ein Word vom RAM zum DMA-Controller oder zum UART transferiert wird, nämlich zum Control-Reg. mit gesetztem Enable-Bit. Sprich: DMA-Kanal (für Daten) und UART werden komplett initialisiert, sobald die Sendedaten bereit liegen - bis auf irgendeines(!) der Enable-Bits.

Ansonsten könnte man den DMAMUX damit beschäftigen, s. AN5224, da gibt's Sync und Event.

Aber beides scheint mir übertrieben kompliziert. Wo ist das Problem beim Interrupt? Höchstens einmal alle 5ms kann doch kaum ein Problem sein. Und: Wie schon oben gesagt, kann man den Transfer ja schon vorher komplett vorbereiten, es bleibt beim Interrupt da wirklich nur ein einziges Register zu schreiben. Um ein RMW zu vermeiden, kann man den Inhalt (mit gesetztem Enable-Bit) auch schon als Konstante vorhalten, es bleibt dann ein einziger Schreibzugriff auf DMA-Controller oder UART.

Wenn der Jitter damit zu groß sein sollte, alternativ Timer-DMA, um das erste Byte in den UART-FIFO zu schreiben (oder gleich FIFO voll machen), und der Timer- oder DMA-Interrupt, um DMA für den Rest des Paketes zu aktivieren.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.