www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LPC2378: memory-to-memory DMA transfers?


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,
ich wollte mal memory-to-memory DMA ausprobieren:
#pragma data_alignment=4
static DWORD p[1000]; //*p = (DWORD*)0x7fe00000; //p[1000];
#pragma data_alignment=4
static DWORD q[1000]; //*q = (DWORD*)0x7fe00000; //q[1000];

void test_dma (void)
{
  DWORD s;
  
  MAMCR = 0;  // muss wohl nicht sein...

  for (s=0; s<1000; s++)
    p[s] = s;
  
  PCONP |= (1 << 29);  // Enable GPDMA clock 

  // clear all interrupts 
  GPDMA_INT_TCCLR = 0x03;
  GPDMA_INT_ERR_CLR = 0x03;
  
  GPDMA_CH0_SRC = (DWORD)p;   // Src pointer
  GPDMA_CH0_DEST = (DWORD)q;  // Dest. pointer

  GPDMA_CH0_CTRL = ((1000/4) & 0x0FFF) |  // size
                    (1 << 12) |           // 4 bytes burst 
                    (1 << 15) |           // 4 bytes burst
                    (2 << 18) |           // 32 bits
                    (2 << 21) |           // 32 bits
                    (1 << 26) |           // source ptr increment
                    (1 << 27);            // dest. ptr increment

  GPDMA_CONFIG = 0x01;  // Enable DMA channels, little endian 
  //while ( !(GPDMA_CONFIG & 0x01) );    
  
  GPDMA_CH0_CFG = 1; // Start

  debug_printf ("%d %d %d\n", p[0], p[1], p[2]);
  // Wait...
  for (s=0; s<0x800000; s++);
  //while (!(GPDMA_CH0_CFG & (1<<17)));
  //while (GPDMA_CH0_CFG & (1<<17));
  debug_printf ("%d %d %d\n", q[0], q[1], q[2]);
}
aber irgendwie tuts das nicht. kann mir jemand sagen, was ich falsch 
mache?
danke... :-)

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
äääh, sorry, die fehlerbeschreibung: es findet keine übertragung statt, 
das 'destination' array bleibt unverändert.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
so scheint es zu gehen:
#define TSIZE 1000

#pragma data_alignment=4
static DWORD *p = (DWORD*)0x7FD00000; //p[TSIZE];
#pragma data_alignment=4
static DWORD *q = (DWORD*)0x7FD01000; //q[TSIZE];

void test_dma (void)
{
  DWORD s;

  MAMCR = 0;  // muss wohl nicht sein...

  for (s=0; s<TSIZE; s++)
  {
    p[s] = s;
    q[s] = 0;
  }

  debug_printf ("%d %d %d\n", p[0], p[1], p[2]);

  PCONP |= (1 << 29);  // Enable GPDMA clock

  // clear all interrupts
  GPDMA_INT_TCCLR = 0x03;
  GPDMA_INT_ERR_CLR = 0x03;

  GPDMA_CH0_SRC = (DWORD)p;   // Src pointer
  GPDMA_CH0_DEST = (DWORD)q;  // Dest. pointer

  GPDMA_CH0_CTRL = ((TSIZE) & 0x0FFF) |  // size
                    (4 << 12) |           // 32 bytes burst
                    (4 << 15) |           // 32 bytes burst
                    (2 << 18) |           // 32 bits
                    (2 << 21) |           // 32 bits
                    (1 << 26) |           // source ptr increment
                    (1 << 27);            // dest. ptr increment

  GPDMA_CONFIG = 0x01;  // Enable DMA channels, little endian

  GPDMA_CH0_CFG = 1; // Start

  // Wait...
  //for (s=0; s<0x800000; s++);

  //while (!(GPDMA_CH0_CFG & (1<<17)));
  while (GPDMA_CH0_CFG & (1<<17));

  debug_printf ("%d %d %d\n", q[TSIZE-3], q[TSIZE-2], q[TSIZE-1]);
}

...wenn sich ziel und startadresse im USB RAM befinden.
warum nur geht es nicht mit dem 'normalen' RAM?

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.