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.
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.
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.