stm32f4 dma m2m

Stm32f4 dma m2m

我正在使用 STM32F407VG 探索板,但我遇到了 DMA 内存到内存传输的问题。我想通过编写 copy_dma() 函数使用 DMA 将 32 字节的数据从内存中的一个位置复制到另一个位置。在 while 循环中,我正在检查传输完成标志,但 DMA 从未 returns 它。我想问一下我哪里弄错了?也许配置中的某些地方是错误的。我正在使用标准外设库。这是我的代码。

#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);
}

在应用笔记中 "Using the STM32F2 and STM32F4 DMA controller"(http://stm32.eefocus.com/download/index.php?act=down&id=6312) 提到: "Memory to memory (only DMA2 is able to do such transfer, in this mode, the circular and direct modes are not allowed.)" 所以,尝试使用 DMA2.

除了 Mariusz Górka 的雨篷:

使用 DMA 时,您需要知道您使用的是哪个内存区域。 stm32f4 有一个称为核心耦合内存 (CCM) 的内存部分。 DMA 无权访问该区域。

检查您的地图文件并确保您的缓冲区不在区域 0x10000000 - 0x1000FFFF 中。