www.mikrocontroller.net

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


Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für eure Tipps!

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.