目录
实验要求
使用 DMA 的方式将数组 A 的内容复制到数组 B 中,搬运完之后将数组 B 的内容打印到屏幕。
CubeMX配置
DMA 配置:
重定向 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)
2.__HAL_DMA_GET_FLAG
# define __HAL_DMA_GET_FLAG ( __HANDLE__ , __FLAG__ ) ( DMA1 -> ISR & ( __FLAG__ ))
- 参数一:HANDLE,DMA通道句柄
- 参数二:FLAG,数据传输标志。DMA_FLAG_TCx表示数据传输完成标志
- 返回值:FLAG的值(SET/RESET)
代码实现
- 开启数据传输
- 等待数据传输完成
- 打印数组内容
#define BUF_SIZE 16
//源数组
uint32_t strBUF[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函数里:
int i = 0;
//开启数据传输
HAL_DMA_Start(&hdma_memtomem_dma1_channel1,(uint32_t)strBUF,
(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]);
}