DMA 案例 内存到内存搬运

DMA 案例 内存到内存搬运

需求

使用DMA的方式将数组A的内容复制到数组B中,搬运完之后将数组B的内容打印到屏幕
在这里插入图片描述
在这里插入图片描述
重定向 printf 的话记得将下面这个勾打开:
在这里插入图片描述

用到的库函数

  1. HAL_DMA_Start
HAL_StatusTypeDef HAL_DMA_Start(
	DMA_HandleTypeDef *hdma,   // 参数一
	uint32_t SrcAddress,   // 参数二
	uint32_t DstAddress,  // 参数三
	uint32_t DataLength  // 参数四
)

参数一:DMA_HandleTypeDef *hdma DMA句柄
参数二:uint32_t SrcAddress 源内存地址
参数三: uint32_t DstAddress 目标内存地址
参数四:uint32_t DataLength 数据传输长度。注意:需要乘以sizeof(uint32_t)
返回值: HAL_StatusTypeDef,HAL状态(OK,busy,ERROR,TIMEOUT)

  1. __HAL_DMA_GET_FLAG
#define __HAL_DMA_GET_FLAG(__HANDLE__, __FLAG__) (DMA1->ISR & (__FLAG__))

参数一:HANDLE , DMA通道句柄
参数二: FLAG,数据传输标志。DMA_FLAG_TGx表示数据传输完成标志
返回值:FLAG的值(SET/RESET)

代码实现

  1. 开启数据传输
  2. 等待数据传输完成
  3. 打印数组内存
#define BUF_SIZE 16

// 源数组
uint32_t srcBuf[BUF_SIZE] = {
	0x00000000,0x11111111,0x22222222,0x33333333,
	0x44444444,0x55555555,0x66666666,0x77777777,
	0x88888888,0x99999999,0xAAAAAAAA,0xBBBBBBBB,
	0xCCCCCCCC,0xDDDDDDDD,0xEEEEEEEE,0xFFFFFFFF
};
// 目标数组
uint32_t desBuf[BUF_SIZE];

int fputc(int ch, FILE *f)
{
	unsigned char temp[1]={ch};
	HAL_UART_Transmit(&huart1,temp,1,0xffff);
	return ch;
}
// main
// 开启数据传输
	HAL_DMA_Start(
		&hdma_memtomem_dma1_channel1,
		(uint32_t)srcBuf,
		(uint32_t)desBuf,
		sizeof(uint32_t) * BUF_SIZE
	);
	// 等待数据传输完成
	while(__HAL_DMA_GET_FLAG(&hdma_memtomem_dma1_channel1, DMA_FLAG_TC1) == RESET);
	// 打印数组内容
	for(i = 0; i < BUF_SIZE; i++){
		printf("Buf[%d] = %X\r\n", i, desBuf[i]);
	}

结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值