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