Forum: Mikrocontroller und Digitale Elektronik Stm32G4: Timer, Dma, Usart


von Randy B. (rbrecker)


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.

von Andreas B. (abm)


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.

von Harry L. (mysth)


Lesenswert?

broken by design

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.