DMA介绍:
特点:
DMA:直接存储器访问
用于外设与存储器间以及存储器与存储器之间
提高数据传输的一种工具(片上外设)
CPU相当于餐厅老板,只需要告诉DMA快递员
即可让数据从源地址搬运到目标地址
一个DMA有8个数据流,每个数据流有8个通道
其DMA外设地址和硬件相连对应的数据流及通道 可以查看 参考手册
场景:
当搬运大量数据的时候,用DMA搬运可以节省CPU的时间,CPU从而去执行其他程序.
仲裁器:
DMA总线只能分时复用,因此需要有仲裁器
仲裁器设置数据流的优先级:非常高 高 中 低
如果两个数据流的软件优先级相同,数据流的编号越低优先级越高
DMA初始化函数 --- 串口DR寄存器为目标地址
/**********************************************
*函数名 :usart1_dma
*函数功能 :串口1传输数据使用DMA
*函数参数 :u8* buff_addr,u32 ndtr
*函数返回值 :无
*函数描述 :usart1 发送 DMA2的数据流7通道4
**********************************************/
void usart1_dma(u8* buff_addr,u32 ndtr)
{
//DMA时钟使能
RCC->AHB1ENR |= (1<<22);
//数据流关闭
DMA2_Stream7->CR &= ~(1<<0);
//等待关闭完成
while(DMA2_Stream7->CR & (1<<0));
//DMA_SxCR
DMA2_Stream7->CR &= ~(7<<25);
DMA2_Stream7->CR |= (4<<25); //选择通道4
DMA2_Stream7->CR &= ~(3<<16); //优先级为低
DMA2_Stream7->CR &= ~(3<<11); //外设数据大小 1字节
DMA2_Stream7->CR &= ~(1<<9); //外设地址固定
DMA2_Stream7->CR &= ~(3<<13); //存储器数据大小 1字节
DMA2_Stream7->CR |= (1<<10); //存储器地址递增 以1字节偏移
DMA2_Stream7->CR &= ~(3<<6);
DMA2_Stream7->CR |= (1<<6); //存储器到外设
DMA2_Stream7->CR &= ~(1<<5); //DMA流控制器模式
//DMA_SxNDTR
DMA2_Stream7->NDTR = ndtr; //传输次数
//DMA_SxPAR
DMA2_Stream7->PAR = (u32)&USART1->DR; //外设地址
//DMA_SxM0AR
DMA2_Stream7->M0AR = (u32)buff_addr; //存储器地址
//外设DMA使能
USART1->CR3 |= (1<<7);
//开启数据流
DMA2_Stream7->CR |= (1<<0);
}