1.简介
<1>:DMA,全称为:Direct Memory Access,即直接存储器访问。实际上,DMA作为一个硬件电路,实现在无CPU干预的情况下,内存(memory)和外设之间的联系
<2>:STM32最多有两个DMA的控制器,DMA1有7个通道,DMA2有5个通道,也存在一个仲裁器来判断优先级(共四级 很高 高 中 低)
<3>:DMA的通道连接着专用硬件的DMA请求,可以通过软件来配置
<4>:在DMA中,每个通道存在着三个事件标志(半传输,传输完成,传输失败),通过读取其中的0/1判断是否配置成功
<5>:可以实现外设(Peripheral)和内部存储器(Memory)之间的传输(单向,可相互转换)
<6>:可以实现内存到内存之间的传输(M2M)
2.配置过程
1.实现DMA时钟使能
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//使能DMA1
2.实现DMA的初始化
DMA_InitTypeDef DMA_InitStruct;
DMA1_MEM_LEN=cndtr;//设置每一次的数据传输量
DMA_DeInit(DMA_CHx);//刷新设置
//开始初始化
DMA_InitStruct.DMA_BufferSize=cndtr;//数据传输量
DMA_InitStruct.DMA_DIR=DMA_DIR_PeripheralDST;//director(目标) DST(外设为目标) SRC(外设为源头)
DMA_InitStruct.DMA_M2M= DMA_M2M_Disable;//不采用存储器到存储器
DMA_InitStruct.DMA_MemoryBaseAddr=cmar;//设置存储器地址
DMA_InitStruct.DMA_MemoryDataSize=DMA_PeripheralDataSize_Byte;//8位
DMA_InitStruct.DMA_MemoryInc=DMA_MemoryInc_Enable;//设置增量模式
DMA_InitStruct.DMA_Mode=DMA_Mode_Normal;//设置循环模式
DMA_InitStruct.DMA_PeripheralBaseAddr=cpar;
DMA_InitStruct.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;//8位
DMA_InitStruct.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
DMA_InitStruct.DMA_Priority=DMA_Priority_Medium;//设置优先级
DMA_Init(DMA_CHx,&DMA_InitStruct);//设置结构体
}
3.开启传输过程(注意实现DMA数据值的刷新)
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
{
DMA_Cmd(DMA_CHx,DISABLE);//关闭通道,设置DMA的数据值
DMA_SetCurrDataCounter(DMA_CHx,DMA1_MEM_LEN);//设置传输数据
DMA_Cmd(DMA_CHx,ENABLE);//使能,产生数据传输
}
注:对于DMA初始化详解:
typedef struct {
uint32_t DMA_PeripheralBaseAddr; uint32_t DMA_MemoryBaseAddr; uint32_t DMA_DIR; uint32_t DMA_BufferSize;
uint32_t DMA_PeripheralInc; uint32_t DMA_MemoryInc;
uint32_t DMA_PeripheralDataSize; uint32_t DMA_MemoryDataSize; uint32_t DMA_Mode;
uint32_t DMA_Priority;
uint32_t DMA_M2M; }
DMA_InitTypeDef;
1.第一个参数 DMA_PeripheralBaseAddr 用来设置 DMA 传输的外设基地址,比如要进行串口 DMA 传输,那么外设基地址为串口接受发送数据存储器 USART1->DR 的地址,表示方法为 &USART1->DR,在传输之前要设置外设和内存的地址,一般是以指针的形式
第二个参数DMA_MemoryBaseAddr为内存基地址,也就是我们存放DMA传输数据的内存地址。
第三个参数 DMA_DIR 设置数据传输方向,决定是从外设读取数据到内存还送从内存读取数 据发送到外设,也就是外设是源地还是目的地,DST(distraction 目标),SRE(source 源头)所以选择值为 DMA_DIR_PeripheralDST。
第四个参数 DMA_BufferSize 设置一次传输数据量的大小,(不超过65535)
第五个参数 DMA_PeripheralInc 设置传输数据的时候外设地址是不变还是递增。如果设置 为递增,那么下一次传输的时候地址加 1
第六个参数 DMA_MemoryInc 设置传输数据时候内存地址是否递增。这个参数和 DMA_PeripheralInc 意思接近,只不过针对的是内存。
第七个参数 DMA_PeripheralDataSize 用来设置外设的的数据长度是为字节传输(8bits), 半字传输(16bits)还是字传输(32bits),这里我们是 8 位字节传输,所以值设置为 DMA_PeripheralDataSize_Byte。
第八个参数 DMA_MemoryDataSize 是用来设置内存的数据长度,和第七个参数意思接近,这 里我们同样设置为字节传输 DMA_MemoryDataSize_Byte