Forum: Mikrocontroller und Digitale Elektronik ATXMEGA DMA UART


von Michael D. (sirs)


Lesenswert?

Hallo!

Weil die Ausgabe über UART immer alles kurzzeitig blockiert, will ich 
für meinen Xmega einen DMA einrichten. Der soll erstmal nur die Daten 
rauswerfen auf den UART. Bisher hab ich folgende Funktion zum Senden 
(plus eine Init):
1
void Send_UART(char *data){
2
  uint8_t length = 0x00;
3
  uint8_t Counter = 0x00;
4
  length = strlen(data);
5
  while(Counter < length){
6
    while (!(USARTC0.STATUS & USART_DREIF_bm));
7
    USARTC0.DATA = data[Counter];
8
    Counter++;
9
  }
10
  Counter = 0x00;
11
  while (!( USARTC0.STATUS & USART_DREIF_bm));
12
  USARTC0.DATA = 0x0A;
13
  while (!( USARTC0.STATUS & USART_DREIF_bm));
14
  USARTC0.DATA = 0x0D;
15
}

Wie baue ich den DMA am einfachsten ein?? Gibts irgendwo dazu guten 
Code? Man findet leider wenig dazu. Hab nur 
Beitrag "XMega DMA transfers zu UART" gefunden und der sieht 
etwas sperrig aus mit eigener stdout. Mit einem ADC gehts wohl auch zB 
auf http://blog.world3.net/2011/11/using-the-xmega-dma-controller/

von P. M. (mikro23)


Lesenswert?

Was hindert Dich daran, die Uart"Library" von Peter Fleury mit 
Interrupts und Ringbuffer zu benutzen? Da läuft das Hauptprogramm nahezu 
unbehindert weiter. Für den Xmega müssen nur einige Zeilen angepaßt 
werden.

von Dieter W. (dds5)


Lesenswert?

Michael D. schrieb:
> Weil die Ausgabe über UART immer alles kurzzeitig blockiert...

Kein Wunder.
Wenn man die UART-Ausgabe blockierend schreibt, bleibt natürlich erst 
mal alles andere liegen bzw. stehen.

Dagegen hilft aber schon die Benutzung von Interrupts, DMA ist dafür 
fast Overkill.

von Dieter F. (Gast)


Lesenswert?


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.