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
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.
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.
> 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.
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.
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.
>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 :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.