Stm32f4 dma m2m

时间:2018-01-29 22:11:08

标签: dma stm32f4discovery m2m stm32f4

我正在使用STM32F407VG发现板,我发布了DMA内存到内存传输。我想通过编写copy_dma()函数将32字节的数据从内存中的一个位置复制到另一个位置使用DMA。在while循环中,我正在检查传输完成标志,但DMA永远不会返回它。我想问一下我在哪里弄错了?也许配置中的某些东西是错的。我正在使用Standart Peripheral Libraries。这是我的代码。

#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 个答案:

答案 0 :(得分:1)

在应用笔记“使用STM32F2和STM32F4 DMA控制器”(http://stm32.eefocus.com/download/index.php?act=down&id=6312) 提到: “存储器到存储器(只有DMA2才能进行这种传输,在这种模式下,不允许使用循环和直接模式。)” 所以,尝试使用DMA2。

答案 1 :(得分:0)

除了MariuszGórka的遮阳篷:

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

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