我正在使用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);
}
答案 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区域内。