当前位置: 首页 > article >正文

使用CUBE_MX实现STM32 DMA 功能(存储器到存储器)

目录

一、使用DMA实现从存储器1发送数据到存储器2中

1.CUBE_MX配置

2.KEIL5配置


一、使用DMA实现从存储器1发送数据到存储器2中

1.CUBE_MX配置

1.在DMA选项中添加MEMORY TO MEMORY

        选择数据宽度,并确保地址递增功能打开。

2.系统时钟72MHz

3.生成代码

2.KEIL5配置

1.打开文件dma.c

#include "dma.h"

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/*----------------------------------------------------------------------------*/
/* Configure DMA                                                              */
/*----------------------------------------------------------------------------*/

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */
DMA_HandleTypeDef hdma_memtomem_dma1_channel1;

/**
  * Enable DMA controller clock
  * Configure DMA for memory to memory transfers
  *   hdma_memtomem_dma1_channel1
  */
void MX_DMA_Init(void)
{

  /* DMA controller clock enable */
  __HAL_RCC_DMA1_CLK_ENABLE();

  /* Configure DMA request hdma_memtomem_dma1_channel1 on DMA1_Channel1 */
  hdma_memtomem_dma1_channel1.Instance = DMA1_Channel1;
  hdma_memtomem_dma1_channel1.Init.Direction = DMA_MEMORY_TO_MEMORY;
  hdma_memtomem_dma1_channel1.Init.PeriphInc = DMA_PINC_ENABLE;
  hdma_memtomem_dma1_channel1.Init.MemInc = DMA_MINC_ENABLE;
  hdma_memtomem_dma1_channel1.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  hdma_memtomem_dma1_channel1.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  hdma_memtomem_dma1_channel1.Init.Mode = DMA_NORMAL;
  hdma_memtomem_dma1_channel1.Init.Priority = DMA_PRIORITY_LOW;
  if (HAL_DMA_Init(&hdma_memtomem_dma1_channel1) != HAL_OK)
  {
    Error_Handler();
  }

}

2.在MX_DMA_Init()函数中加入完成初始化(不要忘记了)

HAL_DMA_Init(&hdma_memtomem_dma1_channel1);

3.打开main.c文件(已经默认调用好了头文件)

4.先定义存储器1

 #define SENDBUFF_SIZE 10   

 const uint32_t aSRC_Const_Buffer[SENDBUFF_SIZE]= 
    {                                                                                           
    0x61626364,0x65666768,0x696A6B6C,0x6D6E6F70,
    0x71727374,0x75767778,0x797A7B7C,0x7D7E7F80
    };

5.再定义储存器2

uint32_t aDST_Buffer[SENDBUFF_SIZE];

6.在main结构体中调用函数

  HAL_StatusTypeDef DMA_status ;
  //DMA_status     反应了传输的状态

  DMA_status = HAL_DMA_Start(&hdma_memtomem_dma1_channel1,(uint32_t)aSRC_Const_Buffer, 
  (uint32_t)aDST_Buffer,SENDBUFF_SIZE);
  //HAL_DMA_Start  开始传送
  //四个参数 1.DMA通道 2.存储器1 3.存储器2 4.传输的数据大小
  //返回参数 传输的状态


  if(DMA_status == HAL_OK)
  {
     //当发送成功以后,执行相应的函数
  }

3.传输数据检测

1.确保DMA数据传输不被打断

	/* 等待DMA传输完成 */
	while(__HAL_DMA_GET_FLAG(&hdma_memtomem_dma1_channel1,DMA_FLAG_TC1)==RESET)
	{

	}
    //两个参数: 1.DMA通道   2.DMA传输标志(后面的数字代表不同的通道)
    //一个返回值: 1.DMA传输标志的对应状态

2.对比两个储存器中数据是否相同

uint8_t Buffercmp(const uint32_t* pBuffer,uint32_t* pBuffer1, uint16_t BufferLength)
{
	/* 数据长度递减 */
	while(BufferLength--)
	{
		/* 判断两个数据源是否对应相等 */
		if(*pBuffer != *pBuffer1)
		{
		  /* 对应数据源不相等马上退出函数,并返回0 */
		  return 0;
		}
		/* 递增两个数据源的地址指针 */
		pBuffer++;
		pBuffer1++;
	}
	/* 完成判断并且对应数据相对 */
	return 1;  
}    

//一个返回值 : 0代表数据不相等,1代表数据相等
//桑格变量:  1.储存器1  2.储存器2  3.数据长度


http://www.kler.cn/news/309693.html

相关文章:

  • Miracast/WifiDisplay开发相关的深入调研分析-android投屏实战开发
  • 字幕编辑用什么软件好?盘点国内外7款视频加字幕软件,简单高效!
  • [SWPU2019]Web11
  • Java文件输入输出及其常用类
  • Nginx反向代理出现502 Bad Gateway问题的解决方案
  • 如何使用 LangChain 的内置工具和工具包:深入探讨与实践指南
  • [Web安全 网络安全]-文件包含漏洞
  • 八股(8)——Spring,SpringBoot
  • 虾皮商品数据api全解析:高效获取,精准运营新利器
  • 记八月十五灵隐寺一游
  • presto/trino native 向量化 大数据计算引擎
  • MySQL之库和表操作
  • Rust 所有权 简介
  • 硬件基础知识
  • 计算机人工智能前沿进展-大语言模型方向-2024-09-13
  • [SIGGRAPH-24] CharacterGen
  • 使用c#制作一个小型桌面程序
  • 彩漩科技亮相第一届人工智能教育应用论坛,入选TOP30榜单,展示创新教育科技产品
  • Snowflake 如何通过 Apache Iceberg 和 Polaris 为大数据的未来提供动力
  • 【JavaEE初阶】多线程6(线程池\定时器)
  • C# 开发教程-入门基础
  • linux 双网卡服务器突然断电后网卡单通故障解决
  • C#通过注册表实现记住上次打开路径
  • 超级简约的B端页面,B端系统就该如此简化设计。
  • JS基础:数组for循环年龄案例
  • sql中的APPLY 和 LATERAL
  • Git 命令详解与项目迁移指南
  • 代码随想录算法训练营第13天|二叉树基础知识、递归遍历、迭代遍历、层序遍历、116. 填充每个节点的下一个右侧节点指针
  • 【计算机网络】TCP的可靠传输机制、标记位以及编程结构
  • vue3透传、注入