你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【STM32H503评测】3.DMA之Flash到RAM

[复制链接]
jundao721 发布时间:2023-9-10 19:31
      最近做数据传输要用到DMA,通过验证测试并分析官方的Demo,移植到自己的代码中,通过学习为我所用。  官方提供的Demo里有FlashToRAM的例程,先从这个例程下手。通过阅读手册可以知道,H503有2个DMA,感觉能扩展应用还挺多的,如图1所示:
       t31.JPG
     图1
     简单分析一下代码,先从初始化部分开始,这部分做了部分注释,如下所示:

  1. handle_GPDMA1_Channel1.Instance = GPDMA1_Channel1;  //通道号
  2.   handle_GPDMA1_Channel1.Init.Request = DMA_REQUEST_SW; //请求来源,软件触发
  3.   handle_GPDMA1_Channel1.Init.BlkHWRequest = DMA_BREQ_SINGLE_BURST;//硬件请求类型,单次触发模式
  4.   handle_GPDMA1_Channel1.Init.Direction = DMA_MEMORY_TO_MEMORY; //传输方向,内存到内存
  5.   handle_GPDMA1_Channel1.Init.SrcInc = DMA_SINC_INCREMENTED;  // 源地址增量模式
  6.   handle_GPDMA1_Channel1.Init.DestInc = DMA_DINC_INCREMENTED;  //目标地址增量模式
  7.   handle_GPDMA1_Channel1.Init.SrcDataWidth = DMA_SRC_DATAWIDTH_WORD; // 数据源的宽度,以字为单位
  8.   handle_GPDMA1_Channel1.Init.DestDataWidth = DMA_DEST_DATAWIDTH_WORD; //
  9.   handle_GPDMA1_Channel1.Init.Priority = DMA_LOW_PRIORITY_HIGH_WEIGHT; // DMA的优先级,低优先级高权重
  10.   handle_GPDMA1_Channel1.Init.SrcBurstLength = 1; //Burst长度以数据单位表示
  11.   handle_GPDMA1_Channel1.Init.DestBurstLength = 1; //
  12.   handle_GPDMA1_Channel1.Init.TransferAllocatedPort = DMA_SRC_ALLOCATED_PORT0|DMA_DEST_ALLOCATED_PORT0; //分配给DMA传输的源和目标端口,都分配到PORT0
  13.   handle_GPDMA1_Channel1.Init.TransferEventMode = DMA_TCEM_BLOCK_TRANSFER; //传输事件的模式为Block块传输模式
  14.   handle_GPDMA1_Channel1.Init.Mode = DMA_NORMAL; //工作模式为正常模式
复制代码

     然后就是主函数,先定义了两个callback函数,一个用于发送完成,一个用于发送错误。传输完成,中断响应后调用回调函数。

  1. HAL_DMA_RegisterCallback(&handle_GPDMA1_Channel1, HAL_DMA_XFER_CPLT_CB_ID, TransferComplete);
  2.   HAL_DMA_RegisterCallback(&handle_GPDMA1_Channel1, HAL_DMA_XFER_ERROR_CB_ID, TransferError);
复制代码
通过两个变量标志位的状态,来判断是否完成和是否继续进行,并有两个回调函数来完成,如下:
  1. static void TransferComplete(DMA_HandleTypeDef *handle_GPDMA1_Channel1)
  2. {
  3.   transferCompleteDetected = 1;
  4. }
复制代码
  1. static void TransferError(DMA_HandleTypeDef *handle_GPDMA1_Channel1)
  2. {
  3.   transferErrorDetected = 1;
  4. }
复制代码
  其实官方的注释中写的也是比较详细的。然后就是配置源和目的地址,启动传输,如下:
  1. if (HAL_DMA_Start_IT(&handle_GPDMA1_Channel1, (uint32_t)&aSRC_Const_Buffer, (uint32_t)&aDST_Buffer, (BUFFER_SIZE * 4U)) != HAL_OK)
  2.   {
  3.     /* Transfer Error */
  4.     Error_Handler();
  5.   }
复制代码
其他部分可以参考源程序,测试结果如图2所示:
t32.JPG
图2
软件部分相对要简单一点,主要是通过测试和分析,理解和了解DMA的使用,为后续工作方便调用准备。
收藏 评论2 发布时间:2023-9-10 19:31

举报

2个回答
dhvf1 回答时间:2023-9-11 08:48:02
2个DMA不得看看整个什么玩玩
jundao721 回答时间:2023-9-12 14:13:49

dhvf1 发表于 2023-9-11 08:48
2个DMA不得看看整个什么玩玩

必须得整,得深入挖掘。

所属标签

ST中文论坛活动

即日起开启活动话题入口,之后的活动统一都放在此处,欢迎大家的加入!


最新内容

相似分享

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版