DMA简介:
DMA是用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。简单的来说它就是一个“搬运工”。
DMA的主要特性:
1、在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:最高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,依此类推) 。
2、独立数据源和目标数据区的传输宽度(字节(8个字节)、半字(16字节)、全字(32字节)),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐。
3、DMA的传输方向分为三种:
(1)外设到存储器
(2)存储器到外设
(3)存储器到存储器
4、可编程的数据传输数目(传输的次数):最大为65535
DMA的主要寄存器:
DMA的时钟位于AHB中,在开启时钟后需要延时一会,以完成启动DMA时钟的动作。我们在配置DMA时主要配置它的配置寄存器(CCR)、传输数量寄存器(CNDTR)、外设地址寄存器(CPAR)、存储器地址寄存器(CMAR)。
配置代码:
#include "dma.h"
#include "delay.h"
//外设到存储器
void DMA1_P2M_Init(u32 cpar, u32 cmar)
{
//1, 外设时钟使能
RCC->AHBENR |= 1<<0; //DMA1外设时钟使能
Delay_Ms(5);
//2, DMA1核心寄存器配置
DMA1_Channel1->CCR &= 0x00000000; //清空CCR寄存器
DMA1_Channel1->CCR |= 0<<14; //非存储器到存储器模式
DMA1_Channel1->CCR |= 3<<12; //通道优先级:最高
DMA1_Channel1->CCR |= 1<<10; //存储器数据宽度:16位
DMA1_Channel1->CCR |= 1<<8; //外设数据宽度:16位
DMA1_Channel1->CCR |= 1<<7; //开启存储器增量模式
DMA1_Channel1->CCR |= 0<<6; //关闭外设增量模式
DMA1_Channel1->CCR |= 0<<5; //不执行循环操作
DMA1_Channel1->CCR |= 0<<4; //从外设读
//设置地址
DMA1_Channel1->CPAR = cpar; //外设地址
DMA1_Channel1->CMAR = cmar; //存储器地址
}
void DMA1_StartUp(u16 cndtr)
{
DMA1_Channel1->CCR &= ~(1<<0); //关闭通道
DMA1_Channel1->CNDTR = cndtr; //设置数据传输数量
DMA1_Channel1->CCR |= 1<<0; //开启通道
}
若要使用DMA记得也要去允许打开外设(如ADC,串口等)的DMA请求。