DMA内存到内存模式

控制/MCU

1816人已加入

描述

  DMA 通道可以在不被外设请求触发的情况下运行。这种模式称为内存到内存模式,由软件启动。

  它允许在没有硬件请求的情况下从一个地址位置传输到另一个地址位置。配置并启用通道后,传输将立即开始。

  

 

微控制器

 

 

  内存到内存模式不得用于循环模式。

  3.1 DMA工艺工作流程总结

  主程序开始时,调用HAL_DMA_Init()复位所有外设,初始化flash接口和systick。

  HAL_DMA_Start() 在配置源地址和目标地址以及要传输的数据长度后启动 DMA 传输。

  HAL_DMA_PollForTransfer() 轮询当前传输的结束。在这种情况下,用户可以根据自己的应用配置固定超时。

  

 

微控制器

 

  传输完成后,建议处理返回值以确保程序按预期运行。

  HAL_OK:DMA 传输成功完成,数据无误传输到目的地。

  HAL_ERROR:DMA 传输期间发生错误。您可以使用 HAL_DMA_GetError 了解详细信息。

  HAL_BUSY:DMA 传输正在进行中,用户只能中止传输

  3.2 DMA M2M 配置

  在 STM32CubeMX 中,点击时钟配置。您的时钟设置应如下所示:

  

 

微控制器

 

  现在,单击Pinout & Configuration 》 DMA 》 DMA1 Button Add。

  

 

微控制器

 

  配置DMA如下:

  MEMTOMEM DMA 请求:DMA1 通道 1

  正常模式

  递增源地址和目标地址

  字节数据宽度

  

 

微控制器

 

  在系统视图中检查系统 DMA:

  

 

微控制器

 

  按Ctrl + S生成代码:

  使用 Project Explorer打开main.c : myproject / Src / main.c。

  创建两个缓冲区:第一个用于源数据,第二个作为目标缓冲区。

  

  在标签/* USER CODE BEGIN 0 */和/* USER CODE END 0 */之间插入您的代码

  /* 用户代码开始 0 */

  uint8_t Buffer_Src [] = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 };

  uint8_t Buffer_Dest [ 10 ];

  /* 用户代码结束 0 */

 

  在标签/* USER CODE BEGIN 2 */和/* USER CODE END 2 */之间插入您的代码

  /* 用户代码开始 2 */

  HAL_DMA_Start ( & hdma_memtomem_dma1_channel1 , ( uint32_t ) ( Buffer_Src ), ( uint32_t ) ( Buffer_Dest ), 10 );

  while ( HAL_DMA_PollForTransfer ( & hdma_memtomem_dma1_channel1 , HAL_DMA_FULL_TRANSFER , 100 ) != HAL_OK )

  {

  __NOP ();

  }

  /* 用户代码结束 2 */

  3.3编译烧录↑

  单击调试按钮逐步运行

微控制器

  点击Resume继续执行

微控制器

  点击Suspend停止执行

微控制器

  将Buffer_Src和Buffer_Dest添加到Expressions中,在 STM32CubeIDE 的右侧,以监控它们的值。源数据已传输到目标缓冲区。 此方法需要轮询传输状态。下面介绍用中断实现内存到内存传输的方法。

  

 

微控制器

 

  

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分