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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren