STM32F1学习笔记:DMA基本原理

一、DMA简介
DMA全称Direct Memory Access,即直接存储器访问
DMA传输将数据从一个地址空间复制到另一个地址空间。当CPU初始化这个传输动作(初始化DMA控制器的相关参数),传输动作本身是由DMA控制器来实现和完成的(也就是说,将数据从一个地址空间复制到另一个地址空间这个动作,并不需要CPU的干涉)。
DMA传输方式通过硬件为RAM和IO设备开辟了一条直接传输数据的通道,使得CPU的效率大大提高,为CPU减负

二、STM32F1的DMA
有2个DMA控制器,DMA1有7个通道,DMA2有5个通道。每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁来协调各个DMA请求的优先权
在这里插入图片描述
三、DMA处理过程
每次,DMA传输由3个操作组成:
1、从外设数据寄存器或者从当前外设/存储器地址寄存器指示的存储器地址取数据,第一次传输时的开始地址是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元。
2、存数据到外设数据寄存器或者当前外设/存储器地址寄存器指示的存储器地址,第一次传输时的开始地址是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元。
3、执行一次DMA_CNDTRx寄存器的递减操作,该寄存器包含未完成的操作数目。

数据传输方向:由DMA_CCRx寄存器中的DIR位设置。

四、仲裁器
软件:每个通道的优先级可以在DMA_CCRx寄存器中设置,有两个bit可以用来配置4个优先级:低、中、高、最高。
硬件:如果2个请求有相同的软件优先级,则较低编号的通道比较高编号的通道有更高的优先级

五、可编程的数据量
1、传输的数据量,最大为65535。
2、传输数据宽度可配置。字节(8位),半字(16位),字(32位)。在DMA_CCRx寄存器中配置。

六、中断
每个DMA通道都可以在DMA传输过半,传输完成和传输错误时产生中断。

七、相关库函数

void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct);//设置开启的通道,配置通道
void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState);//使能
void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState);//开启中断(有3个中断可以开启)
void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber);//设置传输数据量
uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx);//读取还剩多少数据没有传输

常用的外设DMA使能库函数

void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState);
void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState);
void DAC_DMACmd(uint32_t DAC_Channel, FunctionalState NewState);

猜你喜欢

转载自blog.csdn.net/Chelsea_n/article/details/106885460