理论
12个通道:DMA1(7)DMA2(5)
方向:存储器和存储器间(DMA_MEMORY_TO_MEMORY)、外设到存储器(DMA_PERIPH_TO_MEMORY)、存储器到外设(DMA_MEMORY_TO_PERIPH)
闪存、 SRAM、外设的SRAM、 APB1、 APB2和AHB外设均可作为访问的源和目标
数据宽度:字节(Byte 8)、半字(Half Word 16)、全字(Word 32)
可编程的数据传输数目: 0 ~ 65535
若可编程的数据传输数目为10,数据宽度为字节,半字,全字
传输总数据大小:10字节,20字节,40字节
若传输总数据大小与实际传输不符,会让传输标志(__HAL_DMA_GET_FLAG) ≠ 0
代码编写
存储器和存储器间实验
DMA配置
串口初始化参考:链接
Cube IDE代码
main.c
/* USER CODE BEGIN PD */
#define BUFF_SIZE 100 //37行
/* USER CODE END PD */
/* USER CODE BEGIN PV */
uint8_t SRC_Buff[BUFF_SIZE]; //48行
uint8_t DEST_Buff[BUFF_SIZE];
/* USER CODE END PV */
for(int i = 0; i < BUFF_SIZE; i++) //95行
SRC_Buff[i] = i+2;
/*
* 参数1:指向 DMA_HandleTypeDef 结构的指针,该结构包含指向 DMA 通道的配置信息
* 参数2:源内存缓冲区地址
* 参数3:目标内存缓冲区地址,参数4:从源传输到目标的数据长度
*/
HAL_DMA_Start(&hdma_memtomem_dma1_channel1, (uint32_t)SRC_Buff, (uint32_t)DEST_Buff, BUFF_SIZE);
//while里,111行
hdma_memtomem_dma1_channel1.Instance->CNDTR = BUFF_SIZE; //可编程的数据传输数目:CNDTR
__HAL_DMA_ENABLE(&hdma_memtomem_dma1_channel1); //启用指定的 DMA 通道
while(__HAL_DMA_GET_FLAG(&hdma_memtomem_dma1_channel1, DMA_FLAG_TC1) == 0); //判断是否传输完成
HAL_UART_Transmit(&huart1, DEST_Buff, BUFF_SIZE, 100); //串口发送据
__HAL_DMA_CLEAR_FLAG(&hdma_memtomem_dma1_channel1, DMA_FLAG_TC1); //清楚标志
__HAL_DMA_DISABLE(&hdma_memtomem_dma1_channel1); //禁用指定的 DMA 通道
HAL_Delay(1000);