1
votes

I'm using STM32F407VG Discovery Board and I've issue with DMA memory to memory transfer. I want to copy 32 bytes of data from one place in memory to other using DMA by writing copy_dma() function. In while loop i'm checking Transfer Complete flag but DMA never returns it. I want to ask where i'm making mistake? Maybe something in configuration is wrong. I'm using Standart Peripheral Libraries. Here's my code.

#include "stm32f4xx.h"
#define BUFFER_SIZE 32


uint8_t src_buffer[BUFFER_SIZE];
uint8_t dst_buffer[BUFFER_SIZE];

void copy_dma(void);

int main(void)
{
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);

    int i;
    DMA_InitTypeDef dma;

    DMA_DeInit(DMA1_Stream4);
    DMA_StructInit(&dma);
    dma.DMA_Channel = DMA_Channel_1;
    dma.DMA_PeripheralBaseAddr = (uint32_t)src_buffer;
    dma.DMA_PeripheralInc = DMA_PeripheralInc_Enable;
    dma.DMA_Memory0BaseAddr = (uint32_t)dst_buffer;
    dma.DMA_MemoryInc = DMA_MemoryInc_Enable;
    dma.DMA_BufferSize = BUFFER_SIZE;
    dma.DMA_DIR = DMA_DIR_MemoryToMemory;
    dma.DMA_FIFOMode = DMA_FIFOMode_Disable;
    dma.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    dma.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    dma.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    dma.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    dma.DMA_Mode = DMA_Mode_Normal;
    dma.DMA_Priority = DMA_Priority_High;


    DMA_Init(DMA1_Stream4, &dma);

    for (i = 0; i < BUFFER_SIZE; i++) {
        src_buffer[i] = 100 + i;
    }

    copy_dma();
    while(1) {

    }

}

void copy_dma(void) {
    DMA_Cmd(DMA1_Stream4, ENABLE);
    while (DMA_GetFlagStatus(DMA1_Stream4, DMA_FLAG_TCIF4) == RESET);
}
2

2 Answers

2
votes

In app note "Using the STM32F2 and STM32F4 DMA controller"(http://stm32.eefocus.com/download/index.php?act=down&id=6312) is mentioned: "Memory to memory (only DMA2 is able to do such transfer, in this mode, the circular and direct modes are not allowed.)" So, try to use DMA2.

1
votes

In addition to Mariusz Górka's awnser:

When using the DMA you need to know which memory region you are using. The stm32f4 has a memory section called Core Coupled Memory (CCM). The DMA does not have access to this region.

Check your map file and make sure your buffers are not in the region 0x10000000 - 0x1000FFFF.