| 最近做数据传输要用到DMA,通过验证测试并分析官方的Demo,移植到自己的代码中,通过学习为我所用。  官方提供的Demo里有FlashToRAM的例程,先从这个例程下手。通过阅读手册可以知道,H503有2个DMA,感觉能扩展应用还挺多的,如图1所示: 
   图1
 简单分析一下代码,先从初始化部分开始,这部分做了部分注释,如下所示:
 
 
 复制代码handle_GPDMA1_Channel1.Instance = GPDMA1_Channel1;  //通道号
  handle_GPDMA1_Channel1.Init.Request = DMA_REQUEST_SW; //请求来源,软件触发
  handle_GPDMA1_Channel1.Init.BlkHWRequest = DMA_BREQ_SINGLE_BURST;//硬件请求类型,单次触发模式
  handle_GPDMA1_Channel1.Init.Direction = DMA_MEMORY_TO_MEMORY; //传输方向,内存到内存
  handle_GPDMA1_Channel1.Init.SrcInc = DMA_SINC_INCREMENTED;  // 源地址增量模式
  handle_GPDMA1_Channel1.Init.DestInc = DMA_DINC_INCREMENTED;  //目标地址增量模式
  handle_GPDMA1_Channel1.Init.SrcDataWidth = DMA_SRC_DATAWIDTH_WORD; // 数据源的宽度,以字为单位
  handle_GPDMA1_Channel1.Init.DestDataWidth = DMA_DEST_DATAWIDTH_WORD; //
  handle_GPDMA1_Channel1.Init.Priority = DMA_LOW_PRIORITY_HIGH_WEIGHT; // DMA的优先级,低优先级高权重
  handle_GPDMA1_Channel1.Init.SrcBurstLength = 1; //Burst长度以数据单位表示
  handle_GPDMA1_Channel1.Init.DestBurstLength = 1; //
  handle_GPDMA1_Channel1.Init.TransferAllocatedPort = DMA_SRC_ALLOCATED_PORT0|DMA_DEST_ALLOCATED_PORT0; //分配给DMA传输的源和目标端口,都分配到PORT0
  handle_GPDMA1_Channel1.Init.TransferEventMode = DMA_TCEM_BLOCK_TRANSFER; //传输事件的模式为Block块传输模式
  handle_GPDMA1_Channel1.Init.Mode = DMA_NORMAL; //工作模式为正常模式
然后就是主函数,先定义了两个callback函数,一个用于发送完成,一个用于发送错误。传输完成,中断响应后调用回调函数。
 
 
 通过两个变量标志位的状态,来判断是否完成和是否继续进行,并有两个回调函数来完成,如下:复制代码 HAL_DMA_RegisterCallback(&handle_GPDMA1_Channel1, HAL_DMA_XFER_CPLT_CB_ID, TransferComplete);
  HAL_DMA_RegisterCallback(&handle_GPDMA1_Channel1, HAL_DMA_XFER_ERROR_CB_ID, TransferError);
复制代码static void TransferComplete(DMA_HandleTypeDef *handle_GPDMA1_Channel1)
{
  transferCompleteDetected = 1;
}
其实官方的注释中写的也是比较详细的。然后就是配置源和目的地址,启动传输,如下:复制代码static void TransferError(DMA_HandleTypeDef *handle_GPDMA1_Channel1)
{
  transferErrorDetected = 1;
}
 其他部分可以参考源程序,测试结果如图2所示:复制代码 if (HAL_DMA_Start_IT(&handle_GPDMA1_Channel1, (uint32_t)&aSRC_Const_Buffer, (uint32_t)&aDST_Buffer, (BUFFER_SIZE * 4U)) != HAL_OK)
  {
    /* Transfer Error */
    Error_Handler();
  }
   图2
 软件部分相对要简单一点,主要是通过测试和分析,理解和了解DMA的使用,为后续工作方便调用准备。
 
 | 
必须得整,得深入挖掘。