DMA Memory to Memory
DMA Memory to Memory的示例工程用于实现DMA方式将数据从一块内存搬运到另一块内存。
DMA Memory to Memory示例的源代码和工程文件位于SDK_Folder\projects\peripheral\dma\dma_memory_to_memory,其中工程文件在文件夹Keil_5下。
代码理解
示例工程流程图如图 35所示:
- 配置DMA模块。
g_dma_handle.channel = DMA_Channel0; g_dma_handle.init.direction = DMA_MEMORY_TO_MEMORY; g_dma_handle.init.src_increment = DMA_SRC_INCREMENT; g_dma_handle.init.dst_increment = DMA_DST_INCREMENT; g_dma_handle.init.src_data_alignment = DMA_SDATAALIGN_BYTE; g_dma_handle.init.dst_data_alignment = DMA_DDATAALIGN_BYTE; g_dma_handle.init.mode = DMA_NORMAL; g_dma_handle.init.priority = DMA_PRIORITY_LOW; hal_dma_init(&g_dma_handle);- Channel:DMA通道选择,可选择DMA_Channel0 ~ DMA_Channel7。
- direction:DMA数据传输方向,可选择DMA_MEMORY_TO_MEMORY、DMA_MEMORY_TO_PERIPH、DMA_PERIPH_TO_MEMORY、
DMA_PERIPH_TO_PERIPH。
- src_increment:源地址寄存器更新方式,可选择DMA_SRC_INCREMENT、DMA_SRC_DECREMENT、DMA_SRC_NO_CHANGE。
- dst_increment:目的地址寄存器更新方式,可选择DMA_DST_INCREMENT、DMA_DST_DECREMENT、DMA_DST_NO_CHANGE。
- src_data_alignment:源数据宽度,可选择DMA_SDATAALIGN_BYTE、DMA_SDATAALIGN_HALFWORD、DMA_SDATAALIGN_WORD。
- dst_data_alignment:目标数据宽度,可选择DMA_DDATAALIGN_BYTE、DMA_DDATAALIGN_HALFWORD、DMA_DDATAALIGN_WORD。
- mode:DMA的操作模式,可选择DMA_NORMAL、DMA_CIRCULAR。
- priority:DMA通道的软件优先级,可选择DMA_PRIORITY_LOW、DMA_PRIORITY_MEDIUM、DMA_PRIORITY_HIGH。
- 调用阻塞接口hal_dma_start()开始传输数据,调用阻塞接口hal_dma_poll_for_transfer()完成数据的收发。代码如下:
hal_dma_start(&g_dma_handle, (uint32_t)&g_src_data, (uint32_t)&g_dst_data, DMA_DATA_LEN); hal_dma_poll_for_transfer(&g_dma_handle, 10); - 调用hal_dma_start_it()以中断方式开始传输数据。传输结果通过dma_tfr_callback(),dma_blk_callback(),dma_err_callback(),dma_abort_callback()用户接口返回,用户可在上述函数内自定义可执行操作。代码如下:
void dma_tfr_callback(struct _dma_handle * hdma) { g_tfr_flag = 1; // printf("tfr interrupt\r\n"); } void dma_blk_callback(struct _dma_handle * hdma) { g_blk_flag = 1; // printf("blk interrupt\r\n"); } void dma_err_callback(struct _dma_handle * hdma) { g_err_flag = 1; // printf("err interrupt\r\n"); } void dma_abort_callback(struct _dma_handle * hdma) { g_abt_flag = 1; // printf("abort interrupt\r\n"); } hal_dma_start(&g_dma_handle, (uint32_t)&g_src_data, (uint32_t)&g_dst_data, DMA_DATA_LEN);
测试验证
- 用GProgrammer下载dma_memory_to_memory.bin至开发板。
- 将开发板串口连接至PC端,打开并配置GRUart。
- 在GRUart的Receive Data窗口中将会显示DMA搬运数据后数据对比结果。