mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32F4 DMA MemToMem


Autor: Reginald L. (Firma: HS Ulm) (reggie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Howdyho!

Habe folgenden Code, der mir 3 Bytes vom SRAM in den SDRAM kopieren 
soll:
void Init()
{
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
  Core::Delay(1);
  DMA_InitTypeDef h_dma_tx;
  h_dma_tx.DMA_BufferSize = 0;
  h_dma_tx.DMA_FIFOMode = DMA_FIFOMode_Disable;
  h_dma_tx.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
  h_dma_tx.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  h_dma_tx.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  h_dma_tx.DMA_MemoryInc = DMA_MemoryInc_Enable;
  h_dma_tx.DMA_Memory0BaseAddr = 0;
  h_dma_tx.DMA_Mode = DMA_Mode_Normal;
  h_dma_tx.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  h_dma_tx.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  h_dma_tx.DMA_PeripheralInc = DMA_PeripheralInc_Enable;
  h_dma_tx.DMA_PeripheralBaseAddr = (uint32_t)&GUI::Resource::RGB::dmargbmem;
  h_dma_tx.DMA_Priority = DMA_Priority_High;   ////
  h_dma_tx.DMA_Channel = DMA_Channel_0;
  h_dma_tx.DMA_DIR = DMA_DIR_MemoryToMemory;
  DMA_Init(DMA2_Stream0, &h_dma_tx);
}


void CopyNow(void irgendwelcheskruschtdasmitgeht)
{
  while ((DMA2_Stream0->CR & 0x1) != 0);
  DMA2->LISR = 0xFFFFFFFF;
  DMA2_Stream0->NDTR = 3;
  DMA2_Stream0->M0AR = (uint32_t)(framebuffer + (3 * (xPos + (TFT_PHYSICAL_WIDTH * yPos))));
  DMA2_Stream0->CR |= (uint32_t)DMA_SxCR_EN;
}
Der Transfer wird genau einmal ausgeführt, danach lassen sich mit 
DMA2->LISR die Flags nicht löschen. CR EN-Bit setzen bringt auch nichts. 
Dem Sheet entnehme ich, dass der FIFO sofort nach CR EN gefüllt wird. 
Ich habe es also auch mit FIFO enabled und 4 Bytes probiert, ohne 
Erfolg, gleiches Ergebnis. Leider steht dort nicht drin ob FIFO zwingend 
ist oder nicht. Nichtsdestotrotz, wie gesagt, gleiches Ergebnis mit FIFO 
und 4 Bytes.
Die Funktion als solches wird ganz normal angesprungen, auch die 
Übergabeparameter stimmen. Habe sie nur zweckentfremdet von 
CPU-Transfers hin zu DMA-Transfers.
Wahrscheinlich übersehe ich nur ne Kleinigkeit, mache das ja nicht zum 
ersten mal, wobei ich das Problem schon ein paar mal hatte. Leider 
erinnere ich mich nicht mehr an die Lösung :>

Vielen Dank schonmal!
Grüße
Reggie

Autor: Reginald L. (Firma: HS Ulm) (reggie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe soeben noch einfach mal zur Probe die ISR aktiviert. Diese wird 
auch nach der ersten Übertragung nicht angelaufen. Weshalb ich vermute, 
dass der DMA meint, er sei noch nicht fertig.

EDIT: Wird doch angefahren, hatte anstatt DMA_IT_TC, DMA_IT_TCIF0 drin 
-.-. ST - O/&)(/&)/())"=(/%"&%"&!

: Bearbeitet durch User
Autor: Reginald L. (Firma: HS Ulm) (reggie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ich Trottel :D
Jetzt weiß ich wieder was es war:
Die Flags werden nicht im LISR sondern im LIFCR Register gelöscht!

Autor: Horst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Glückwunsch zum erfolgreichen Selbstgespräch :)

Autor: Reginald L. (Firma: HS Ulm) (reggie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, ist nicht das erste mal.

Und es hat geholfen :D

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.