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?
Gast
#5860464
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.
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?
Gast
#5860471
Ich würde zwei Puffer immer abwechselnd verwenden.
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.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.