使用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.数据长度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值