您的位置:首页 > 科技 > IT业 > 使用CUBE_MX实现STM32 DMA 功能(存储器到存储器)

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

2024/12/23 4:37:47 来源:https://blog.csdn.net/weixin_67341796/article/details/142152044  浏览:    关键词:使用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.数据长度

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com