*学习路线指引*:
1.DMA功能介绍
2.DMA的配置
一、我的学习认知程度--DMA功能介绍
DMA能实现一个地址下的数据,硬件自动搬运到另一个地址下,实现硬件全自动化,无需软件干预,即减轻CPU的负担。
二、我的学习认知程度--DMA的配置
结合代码理解:
// 定义接收缓冲区大小
#define BUFFER_SIZE 1
// 定义接收缓冲区
uint8_t rx_buffer[BUFFER_SIZE];
void DMA_Configuration(void) {
DMA_InitTypeDef DMA_InitStructure;
// DMA配置
DMA_DeInit(DMA1_Channel3);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) & (USART3->DR); // USART3数据寄存器地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)rx_buffer; // 存储接收数据的内存地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = BUFFER_SIZE; // 接收缓冲区大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // 设置为循环模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel3, &DMA_InitStructure);
// 使能USART3的DMA接收
USART_DMACmd(USART3, USART_DMAReq_Rx, ENABLE);
// 使能DMA1_Channel3
DMA_Cmd(DMA1_Channel3, ENABLE);
}
代码有详细介绍。
这里提一下DMA的启动条件:
1.有触发源。 // USART33使能并且打通通道DMA1_Channel3让触发源USART_DMAReq_Rx触发DMA请求。
2.搬运量不为0。
3.DMA使能。
三.总结
最后,总结一下:
尽可能利用DMA来做一些大量的、重复的工作,来最大限度减轻CPU的负担。