Forum: Mikrocontroller und Digitale Elektronik STM32F4 DMA MemToMem


von Reginald L. (Firma: HEGRO GmbH) (reggie)


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

von Reginald L. (Firma: HEGRO GmbH) (reggie)


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
von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

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

von Horst (Gast)


Lesenswert?

Glückwunsch zum erfolgreichen Selbstgespräch :)

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Ja, ist nicht das erste mal.

Und es hat geholfen :D

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.