Forum: Mikrocontroller und Digitale Elektronik Verständnisfrage UART Rx + DMA


von Alex (Gast)


Lesenswert?

Hallo,


ich arbeite gerade Hobby-technisch an einem Projekt, bei dem ein 
Mikrocontroller an den PC gekoppelt ist (USART <=> USB/UART-Wandler <=> 
PC). Ich plane Bitraten im Bereich 1-3 MBit zu nutzen. Die "hohe" 
Datenrate wird eigentlich nur in Richtung PC benötigt, in Richtung 
Controller würde wesentlich weniger ausreichen - allerdings kann man 
einen USART nun mal nur mit einer Baudrate konfigurieren.

Der verwendete Controller bietet DMA für Tx und Rx an. In Senderichtung 
(MC => PC) ist das in meinen Augen ganz einfach: Paket der Größe X 
aufsetzen und warten bis die DMA "fertig" meldet.

In Empfangsrichtung (PC => MC) stehe ich vor dem Problem, dass ich 
definitiv nicht für jedes empfangene Byte einen Interrupt haben möchte, 
dann käme der Controller zu nichts anderem mehr. Wenn ich hier DMA 
nutzen möchte, müsste ich alle Pakete bzgl. der Größe vereinheitlichen 
(bspw. X mal 10 Byte). Die DMA würde ich dann auf 10 Byte konfigurieren. 
Gibts da einen eleganteren Weg, so dass ich nur die wirklich benötigten 
Daten zum Controller schicken muss und nicht noch Dummy-Bytes ... ?


Besten Dank für erhellende Tipps :)

Alex

von Gast (Gast)


Lesenswert?

Rx+DMA ist immer ein bißchen kniffelig. Nimm einen größeren 
Eingangspuffer und laß das Programm in gewissen Abständen nachsehen, 
wieweit der Zeiger für den Puffer gekommen ist.

Bei neueren µCs gibt es DMA mit speziellen Modi, wo beim Erreichen des 
Pufferendes auf einen alternativen Puffer umgeschaltet wird. Oder man 
verwendet einen µC mit UART+FIFO.
Deiner scheint wohl beides nicht zu haben.

von Alex (Gast)


Lesenswert?

An so etwas habe ich auch schon gedacht, ich stelle es mir nur 
race-condition technisch etwas schwierig vor. Bei 3 MBit kommen im 3,3 
µs Takt Bytes rein (wenn auch nur alle Jubeljahre, dann aber ein Burst). 
Ich muss da nochmal genau nachsehen, inwiefern man die DMA zur Laufzeit 
umkonfigurieren kann, ohne das Daten verloren gehen. Also: DMA 
kontrollieren und Zustand sichern, dann DMA umkonfigurieren auf anderen 
Puffer, dann Daten aus erstem Puffer auslesen. Kritisch ist halt die 
Zeit zwischen Lesen des Zustands der DMA und dem Umkonfigurieren.

Nur zur Info: Der Prozessor ist ein STM32F10xxx.

von Gast (Gast)


Lesenswert?

> Kritisch ist halt die
>Zeit zwischen Lesen des Zustands der DMA und dem Umkonfigurieren.

Das glaube ich nicht. Probier es einfach aus.
Den Prozessor kenne ich nicht näher. Vielleicht hat er aber schon ein 
Flag, das gesetzt wird (+Interrupt), wenn der halbe DMA-Transfer 
abgelaufen ist. Damit könnte man rechtzeitig den Puffer umkonfigurieren.

von Gast (Gast)


Lesenswert?

Ich sehe gerade, 'DMA Half Transfer' haben die µCs ja. Vielleicht gibt 
es auch noch einen Repeat-Modus, der am Ende einen Interrupt auslöst und 
wieder bei der Startadresse ohne CPU-Eingriff beginnt. Dann hättest Du 
einen schönen Ringpuffer.

von (prx) A. K. (prx)


Lesenswert?

Gast schrieb:

> Ich sehe gerade, 'DMA Half Transfer' haben die µCs ja. Vielleicht gibt
> es auch noch einen Repeat-Modus, der am Ende einen Interrupt auslöst und
> wieder bei der Startadresse ohne CPU-Eingriff beginnt.

Gibt es. Nennt sich "circular mode". In Verbindung mit dem "half 
transfer interrupt" wird das wasserdicht.

von Gast (Gast)


Lesenswert?

>Nennt sich "circular mode".

Schön! Ich hatte im Datenblatt nach 'repeat' gesucht und nichts 
gefunden.
Dann brauche ich ja nicht meine Renesas-Lieblinge zu empfehlen :-)

von Alex (Gast)


Lesenswert?

Vielen Dank für eure Tipps!

Ich denke mit den Infos bekomme ich eine elegante Lösung 
hinprogrammiert. Man lernt halt nie aus.

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.