CN / EN
文档反馈
感谢关注汇顶文档,期待您的宝贵建议!
感谢您的反馈,祝您愉快!

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所示:

图 35 DMA Memory to Memory工程流程图
  1. 配置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。
  2. 调用阻塞接口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);
    
  3. 调用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);
    

测试验证

  1. 用GProgrammer下载dma_memory_to_memory.bin至开发板。
  2. 将开发板串口连接至PC端,打开并配置GRUart。
  3. 在GRUart的Receive Data窗口中将会显示DMA搬运数据后数据对比结果。

扫描关注

打开微信,使用“扫一扫”即可关注。