Forum: Mikrocontroller und Digitale Elektronik STM32 UART DMA TX


von Bert S. (kautschuck)


Lesenswert?

Hi,

Ich habe bereits einen RX DMA UART Treiber implementiert, wo ich einen 
Ringbuffer verwende und dann mit UART idle Interrupt den start und stop 
Pointer der Daten neu setzte. Das funktioniert hervorragend und ich 
möchte nun etwas ähnliches für den TX DMA UART machen, jedoch sehe ich 
hier nicht wirklich, wie man das anstellen soll.

In den HAL Libraries (Das wird hier nicht gerne gehört und ich kann es 
gut nachvollziehen, da die sau langsam sind) gibt es ja die Funktion 
HAL_UART_Transmit_DMA(), welche die Daten schon zuverlässig über den DMA 
überträgt. Muss ich, damit ich den TX sauber handeln kann, die Daten in 
einen eigenen Ringbuffer schreiben und dann auf den DMA_TX_DONE 
Interrupt warten und dann die neuen Daten wieder schreiben oder wie 
würdet ihr das machen?

von Andreas Müller (Gast)


Lesenswert?

Bert S. schrieb:
> Muss ich, damit ich den TX sauber handeln kann, die Daten in
> einen eigenen Ringbuffer schreiben und dann auf den DMA_TX_DONE
> Interrupt warten und dann die neuen Daten wieder schreiben

Wenn Du das so machst, brauchst Du keinen Ringbuffer.

von Bert S. (kautschuck)


Lesenswert?

Andreas Müller schrieb:
>> Muss ich, damit ich den TX sauber handeln kann, die Daten in
>> einen eigenen Ringbuffer schreiben und dann auf den DMA_TX_DONE
>> Interrupt warten und dann die neuen Daten wieder schreiben
>
> Wenn Du das so machst, brauchst Du keinen Ringbuffer.

Ich würde die Daten zum Senden in einen Ringbuffer schieben, dann nach 
einem TX Done Interrupt die neuen Daten mit HAL_UART_Transmit_DMA() 
schicken. Wie würdest du es machen?

von Stefan F. (Gast)


Lesenswert?

Ich würde zwei Puffer immer abwechselnd verwenden.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Das hatte doch letztens hier schon jemand so gebaut:
Beitrag "Re: STM32: Sendepuffer für USART"
Nachdm er fertig war hat er freundlicherweise den Code veröffentlicht.

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.