STM32F4 DMA MemToMem

OP (Firma: HEGRO GmbH) #4692299
Lesenswert?
• ▲
▼
Howdyho!

Habe folgenden Code, der mir 3 Bytes vom SRAM in den SDRAM kopieren 
soll:
1
void Init()
2
{
3
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
4
  Core::Delay(1);
5
  DMA_InitTypeDef h_dma_tx;
6
  h_dma_tx.DMA_BufferSize = 0;
7
  h_dma_tx.DMA_FIFOMode = DMA_FIFOMode_Disable;
8
  h_dma_tx.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
9
  h_dma_tx.DMA_MemoryBurst = DMA_MemoryBurst_Single;
10
  h_dma_tx.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
11
  h_dma_tx.DMA_MemoryInc = DMA_MemoryInc_Enable;
12
  h_dma_tx.DMA_Memory0BaseAddr = 0;
13
  h_dma_tx.DMA_Mode = DMA_Mode_Normal;
14
  h_dma_tx.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
15
  h_dma_tx.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
16
  h_dma_tx.DMA_PeripheralInc = DMA_PeripheralInc_Enable;
17
  h_dma_tx.DMA_PeripheralBaseAddr = (uint32_t)&GUI::Resource::RGB::dmargbmem;
18
  h_dma_tx.DMA_Priority = DMA_Priority_High;   ////
19
  h_dma_tx.DMA_Channel = DMA_Channel_0;
20
  h_dma_tx.DMA_DIR = DMA_DIR_MemoryToMemory;
21
  DMA_Init(DMA2_Stream0, &h_dma_tx);
22
}
23

24

25
void CopyNow(void irgendwelcheskruschtdasmitgeht)
26
{
27
  while ((DMA2_Stream0->CR & 0x1) != 0);
28
  DMA2->LISR = 0xFFFFFFFF;
29
  DMA2_Stream0->NDTR = 3;
30
  DMA2_Stream0->M0AR = (uint32_t)(framebuffer + (3 * (xPos + (TFT_PHYSICAL_WIDTH * yPos))));
31
  DMA2_Stream0->CR |= (uint32_t)DMA_SxCR_EN;
32
}
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
OP (Firma: HEGRO GmbH) #4692320
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/&)(/&)/())"=(/%"&%"&!

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.