DMA 案例 内存到内存搬运
需求
使用DMA的方式将数组A的内容复制到数组B中,搬运完之后将数组B的内容打印到屏幕
重定向 printf 的话记得将下面这个勾打开:
用到的库函数
- 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)
- __HAL_DMA_GET_FLAG
#define __HAL_DMA_GET_FLAG(__HANDLE__, __FLAG__) (DMA1->ISR & (__FLAG__))
参数一:HANDLE , DMA通道句柄
参数二: FLAG,数据传输标志。DMA_FLAG_TGx表示数据传输完成标志
返回值:FLAG的值(SET/RESET)
代码实现
- 开启数据传输
- 等待数据传输完成
- 打印数组内存
#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]);
}
结果