根据ST公司提供的相关信息,DMA是STM32中一个独立与Cortex-M4核的模块;主要功能是通信“桥梁”的作用,可以将所有外设寄存器和内存空间“连接”起来,这样就可以高速问各寄存器,其传输不受CPU的支配,其间的通讯不占CPU资源,访问速度高,传输还是双向的(双AHB主总线结构);它可以将外设寄存器中的数据与储存器中变量建立绑定,还可以将一外设的寄存器或缓冲器与另外设的寄存器或缓冲器建立双向通讯。
1.DMA初始化
DMA_Init(DMAx_Streamy, &DMA_InitStructure);
F407有2个DMA控制器每个有8个数据流(stream),每个数据流可以编程与规定的通道中的一个搭配。
如果ADC1要使用DMA,通过查询以上表格可知道 ADC1 占用DMA2的数据流0,外设通过0通道进行请求,DMA_InitStructure是初始化用到的数据结构体:
1)通道选择,选择DMA2的stream0的零通道
DMA_Init(DMA2_Stream0, &DMA_InitStructure);
DMA_InitStructure.DMA_Channel = DMA_Channel_0;
2)确定通道两头的地址(位置)
//要提前声明内存中存储位置如: uint16_t ADC_RCVTab[16] ;
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR; //DMA外设ADC基地址
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC_RCVTab;//DMA内存基地址
//两头的地址是否是增加的。
//对于外设来说就是ADC1的地址,不增加。
DMA_InitStructure.DMA_PeripheralInc
= DMA_PeripheralInc_Disable;
//对于内存来说,地址是增加的,是用来存储16个通道的数组。
DMA_InitStructure.DMA_MemoryInc
= DMA_MemoryInc_Enable;
3) 通道建完后,要规定通道通信的软协议
a)通信方向
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
b)通道两头收发数据的基本单位
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
c)通信完成一次要传输的基本单位的数量。
由于AHB编程接口只支持32位访问所以虽然访问16个AD通道,每通道为12位,但是在访问的时候还是按每通道32位进行读取,所以 每次传输 16个通道*32位/传输单位(16位)=32
DMA_InitStructure.DMA_BufferSize = 32;
d) 通信的工作模式(此处为循环通信)
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
e)通信优先级
可以分为4级:VeryHigh,High,Medium,Low.
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
f)是否制定stream fifo模式或直接模式
//这里是直接模式
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
//FIFO的阀值水平
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
g)在一个单一的非可中断期内传输的数据数量(只有地址增量模式才有效)
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
3)调用DMA初始化函数
DMA_Init(DMA2_Stream0, &DMA_InitStructure);
4)DMA使能
/* DMA2_Stream0 enable */
DMA_Cmd(DMA2_Stream0, ENABLE);
2.以上是DMA的配置,那么怎样在外设中使用DMA呢?
这个后面ADC部分会讲到,先提一下。
/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);
简单吧?只要上路了就简单了
版权声明:本文为博主原创文章,未经博主允许不得转载。