STM32的DMA有三种类型的传输
1.M-M(内存到内存)
2.M-P(内存到外设)
3.P-M(外设到内存)
STM32的标准库函数提供了一个STM32的初始化结构体如下;
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;
上述结构体是STM32的初始化结构体,从上面的结构体变量定义,我们初始化DMA的时候可以分三步走:
第一步:从哪里来到那里去:这句话说明的是上述的第1-3条
uint32_t DMA_PeripheralBaseAddr;//外设地址
uint32_t DMA_MemoryBaseAddr; //内存地址
uint32_t DMA_DIR; //传输方向
第二步:数据要传输多少,传的单位是多少:这句话说明的是上述的第4-8条
uint32_t DMA_BufferSize; //传输的数据多少
uint32_t DMA_PeripheralInc; //外设地址是否递增
uint32_t DMA_MemoryInc; //内存地址是否递增
uint32_t DMA_PeripheralDataSize; //外设数据宽度
uint32_t DMA_MemoryDataSize; //内存数据宽度
第三步:啥时候传输结束; 这句话说明的是传输的模式
uint32_t DMA_Mode; //模式
DMA的初始化步骤
1、打开DMA时钟
2、写入DMA初始化结构体数据
3,调用DMA_Init函数将结构体数据写入寄存器
4,清空DMA发送/接收完成标志位
5,调用DMA_Cmd函数开启DMA通道
如果是M-P则需要通过使能DMA请求例如:
USART_DMACmd(使能DMA串口请求)
如果是M-M则不需要使能DMA请求。
当打开DMA通道时直接就开始数据传输了。
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』