资源描述
DMA_InitTypeDef DMA_InitStructure;
DMA_InitStructure .DMA_Channel=DMA_Channel_0;
DMA_InitStructure .DMA_PeripheralBaseAddr=aSRC_Const_Buffer;
DMA_InitStructure .DMA_Memory0BaseAddr=aDST_Buffer;
DMA_InitStructure .DMA_DIR=DMA_DIR_MemorytoMemory;
DMA_InitStructure .DMA_BufferSize=32;
DMA_InitStructure .DMA_PeripheralInc= DMA_PeripheralInc_Enable;
DMA_InitStructure .DMA_MemoryInc= DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize= DMA_PeripheralDataSize_Word;
DMA_InitStructure.DMA_MemoryDataSize= DMA_MemoryDataSize_Word;
DMA_InitStructure .DMA_Mode=DMA_Mode_Normal;
DMA_InitStructure .DMA_Priority=DMA_Priority_High;
DMA_InitStructure .DMA_FIFOMode= DMA_FIFOMode_Disable;
DMA_InitStructure .DMA_FIFOThreshold=DMA_FIFOThreshold_Full;
DMA_InitStructure .DMA_MemoryBurst=DMA_MemoryBurst_Single;
DMA_InitStructure .DMA_PeripheralBurst=DMA_PeripheralBurst_Single;
DMA_Init(DMA2_STREAM0,&DMA_InitStructure);
DMA_ClearFlag(DMA_STREAM,DMA_FLAG_TCIF);//清除DMA数据流传输完成标志位
DMA_Cmd(DMA2_Stream0,ENABLE);//开始DMA数据传输
DMA外设请求通道的选择
DMA_InitStructure .DMA_Channel
参数选择
DMA_Channel_0 通道0
DMA_Channel_1 通道1
DMA_Channel_2 通道2
DMA_Channel_3 通道3
DMA_Channel_4 通道4
DMA_Channel_5 通道5
DMA_Channel_6 通道6
DMA_Channel_7 通道7
外设地址
DMA_InitStructure .DMA_PeripheralBaseAddr
参数自定义
1).一般设置为外设的数据寄存器地址
2).存储器到存储器模式,则设置其中一个存储区地址
存储区0地址
DMA_InitStructure .DMA_Memory0BaseAddr
参数自定义
一般设置为我们自定义存储区的首地址,也可以定义一个对应的数组存放数值,直接将数组名赋给DMA_Memory0BaseAddr即可
传输方向
DMA_InitStructure .DMA_DIR
参数选择
DMA_DIR_PeripheralToMemory 外设到存储器
DMA_DIR_MemoryToPeripheral 存储器到外设
DMA_DIR_MemoryToMemory 存储器到存储器
设定待传输数据数目
DMA_InitStructure .DMA_BufferSize
参数自定义
其设定的范围为0-65535,一般明确指定一个传输数量
控制外设地址自动递增功能
DMA_InitStructure .DMA_PeripheralInc
参数选择
DMA_PeripheralInc_Enable 使能外设地址自动递增功能
DMA_PeripheralInc_Disable 失能外设地址自动递增功能
其增加量由DMA_PeripheralDataSize决定;
控制存储器地址自动递增功能
DMA_InitStructure .DMA_MemoryInc
参数选择
DMA_MemoryInc_Enable 使能存储器地址自动递增功能
DMA_MemoryInc _Disable 失能存储器地址自动递增功能
其增加量由DMA_MemoryDataSize;决定;
外设数据宽度
DMA_InitStructure.DMA_PeripheralDataSize
参数选择
DMA_PeripheralDataSize_Byte 字节单位=8位
DMA_PeripheralDataSize_HalfWord 半字单位=16位
DMA_PeripheralDataSize_Word 字单位=32位
存储器数据宽度
DMA_InitStructure.DMA_MemoryDataSize
参数选择
DMA_MemoryDataSize_Byte 字节单位=8位
DMA_MemoryDataSize_HalfWord 半字单位=16位
DMA_MemoryDataSize_Word 字单位=32位
直接模式条件下外设和储存器数据宽度大小一样,DMA_PeripheralDataSize 和DMA_MemoryDataSize不被使用
DMA传送模式选择
DMA_InitStructure .DMA_Mode
参数选择
DMA_Mode_Normal 一次传输模式
DMA_Mode_Circular 循环传输模式
软件设置数据流的优先级
DMA_InitStructure .DMA_Priority
数据选择
DMA_Priority_Low 对应定义的数据流为低优先级
DMA_Priority_Medium 对应定义的数据流为中优先级
DMA_Priority_High 对应定义的数据流为高优先级
DMA_Priority_VeryHigh 对应定义的数据流为非常高优先级
FIFO模式
DMA_InitStructure .DMA_FIFOMode;
参数选择
DMA_FIFOMode_Disable FIFO模式使能
DMA_FIFOMode_Enable FIFO模式失能
1).FIFO使能
FIFO模式
源数据 à 目标地址,在FIFO临时存放数据
例如:源地址和目标地址数据宽度不同
源地址输出字节数据,目标地址输出字数据,实际传输把4个8位数据拼凑成一个32位字数据输出
2).FIFO失能
直接模式
默认情况下,DMA工作在直接模式
在每次外设请时都立刻启动对存储器传输的单次传输,要求源地址的数据宽度等于目标地址的数据宽度
3).双缓冲模式
DMA_SxCR的寄存器DBM位为1就可以启用双缓冲模式,并自动激活循环模式
两个存储器的地址指针都有效,DMA控制器会自动切换两个存储区的的数据储存
FIFO阈值选择
DMA_InitStructure .DMA_FIFOThreshold
参数选择
DMA_FIFOThreshold_1QuarterFull FIFO容量的1/4
DMA_FIFOThreshold_HalfFull FIFO容量的1/2
DMA_FIFOThreshold_3QuartersFull FIFO容量的3/4
DMA_FIFOThreshold_Full FIFO容量的满
存储器突发模式选择
DMA_InitStructure .DMA_MemoryBurst
参数选择
DMA_MemoryBurst_Single 单次模式
DMA_MemoryBurst_INC4 4节拍的增量突发模式
DMA_MemoryBurst_INC8 8节拍的增量突发模式
DMA_MemoryBurst_INC16 16节拍的增量突发模式
外设突发模式选择
DMA_InitStructure .DMA_PeripheralBurst
参数选择
DMA_PeripheralBurst_Single 单次模式
DMA_PeripheralBurst_INC4 4节拍的增量突发模式
DMA_PeripheralBurst_INC8 8节拍的增量突发模式
DMA_PeripheralBurst_INC16 16节拍的增量突发模式
1).单次传输
外设
每次DMA请求就传输一次DMA_PeripheralDataSize数据
存储器
每次DMA请求就传输一次DMA_PeripheralDataSize数据
2).突发传输
外设
每次DMA请求就传输DMA_MemoryBurst(4/8/16)个DMA_PeripheralDataSize(字节/半字/字)数据
存储器
每次DMA请求就传输DMA_MemoryBurst(4/8/16)个DMA_PeripheralDataSize(字节/半字/字)数据
突发传输是结合FIFO使用的,要求FIFO阈值一定是内存突发传输数据流(节拍*数据宽度)的整数倍
FIFO(共4级32位)
完成DMA数据流参数配置
DMA_Init(DMA2_STREAM0,&DMA_InitStructure)
参数选择
DMA1_Stream0 DMA1的通道0
DMA1_Stream1 DMA1的通道1
DMA1_Stream2 DMA1的通道2
DMA1_Stream3 DMA1的通道3
DMA1_Stream4 DMA1的通道4
DMA1_Stream5 DMA1的通道5
DMA1_Stream6 DMA1的通道6
DMA1_Stream7 DMA1的通道7
DMA2_Stream0 DMA2的通道0
DMA2_Stream1 DMA2的通道1
DMA2_Stream2 DMA2的通道2
DMA2_Stream3 DMA2的通道3
DMA2_Stream4 DMA2的通道4
DMA2_Stream5 DMA2的通道5
DMA2_Stream6 DMA2的通道6
DMA2_Stream7 DMA2的通道7
结合DMA_Init和DMA_InitStructure .DMA_Channel函数可以对外设请求进行通道和数据流进行选择
展开阅读全文