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 中。
我正在使用 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 中。