Stm32f4 dma m2m

Stm32f4 dma m2m,dma,stm32f4discovery,m2m,stm32f4,Dma,Stm32f4discovery,M2m,Stm32f4,我使用的是STM32F407VG发现板,我遇到了DMA内存到内存传输的问题。我想通过写入copy\u DMA()函数,使用DMA将32字节的数据从内存中的一个位置复制到另一个位置。在while循环中,我正在检查传输完成标志,但DMA从未返回它。我想问我在哪里犯错?也许配置中有问题。我用的是标准外设库。这是我的密码 #include "stm32f4xx.h" #define BUFFER_SIZE 32 uint8_t src_buffer[BUFFER_SIZE]; uint8_t dst

我使用的是STM32F407VG发现板,我遇到了DMA内存到内存传输的问题。我想通过写入
copy\u DMA()
函数,使用DMA将32字节的数据从内存中的一个位置复制到另一个位置。在while循环中,我正在检查传输完成标志,但DMA从未返回它。我想问我在哪里犯错?也许配置中有问题。我用的是标准外设库。这是我的密码

#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);
}
#包括“stm32f4xx.h”
#定义缓冲区大小32
uint8_t src_buffer[缓冲区大小];
uint8_t dst_缓冲区[缓冲区大小];
无效副本(无效);
内部主(空)
{
RCC_AHB1PeriphLockCmd(RCC_AHB1Periph_DMA1,启用);
int i;
DMA_InitTypeDef DMA;
DMA_脱硝剂(DMA1_-4);
DMA_StructInit(&DMA);
dma.dma_Channel=dma_Channel_1;
dma.dma_peripheraldbaseaddr=(uint32_t)src_缓冲区;
dma.dma_peripheraldinc=dma_peripheraldinc_Enable;
dma.dma_Memory0BaseAddr=(uint32_t)dst_缓冲区;
dma.dma_MemoryInc=dma_MemoryInc_Enable;
dma.dma_BufferSize=缓冲区大小;
dma.dma_DIR=dma_DIR_memory内存;
dma.dma_FIFOMode=dma_FIFOMode_Disable;
dma.dma_MemoryBurst=dma_MemoryBurst_Single;
dma.dma_MemoryDataSize=dma_MemoryDataSize_字节;
dma.dma_PeripheralBurst=dma_PeripheralBurst_Single;
dma.dma_peripheraldasize=dma_peripheraldasize_字节;
dma.dma_Mode=dma_Mode_Normal;
dma.dma_Priority=dma_Priority_High;
DMA_Init(DMA1_流4和DMA);
对于(i=0;i
应用程序注释“使用STM32F2和STM32F4 DMA控制器”() 提到: “内存到内存(只有DMA2能够进行这种传输,在此模式下,不允许循环和直接模式)。”
因此,除了Mariusz Górka的awnser之外,尝试使用DMA2.

使用DMA时,您需要知道正在使用的内存区域。stm32f4有一个称为核心耦合存储器(CCM)的存储器部分。DMA无法访问此区域

检查映射文件并确保缓冲区不在0x10000000-0x1000FFFF区域内