Directional Memory Access,直接内存访问。是计算机系统中用于快速、大量数据交换的重要技术。
DMA是一种完全由硬件执行数据交换的工作方式。它由DMA控制器控制在存储器和存储器,存储器和外设之间的批量数据传输。
DMA一般用于高速传送成组数据的应用场合。
好处:
减轻CPU的负担:
For DMA:控制传输数据的整个过程,既不通过CPU,也不需要CPU干预,都在DMA控制器的控制下完成。
For CPU:在数据传输开始前配置,在数据传输结束后处理外,在整个数据传输的过程进行其他工作。
弊端:
STM32F103微控制器有2个DMA,每个DMA都有若干的触发通道,每个通道可以管理来自多个外设对存储器的访问请求。
每个外设的DMA请求,可以使用相应的库函数,被独立地开启或关闭。
在每个DMA中,DMA的仲裁器根据通道请求的优先级来启动外设/存储器的访问;同一时刻,一个DMA只能有一个请求有效。
软件优先级:
DMA每个通道的软件优先级可以在DMA_CCRx
寄存器中设置,有4个等级:
硬件优先级:
在软件优先级相同的情况下使用,较低编号的通道的优先级更高。
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
)void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx)
:将DMAy的通道x的寄存器恢复为复位启动时的default值。
DMAy_Channelx
:DMAy的通道x
void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx,DMA_InitTypeDef* DMA_InitStruct)
:根据DMA_InitStruct中指定的参数初始化指定DMA通道的寄存器。
输入参数DMA_InitTypeDef* DMA_InitStruct
:指向结构体DMA_InitTypeDef
的指针,包含了DMAy通道x的配置信息。
typedef struct{
uint32_t DMA_PeripheralBaseAddr;//为通道设置外设基地址。
uint32_t DMA_MemoryBaseAddr;//设置内存基地址。
uint32_t DMA_DIR;//指定外设是作为DMA数据传输的目的地还是来源。DMA_DIR_PeripheralDST/SRC
uint32_t DMA_BufferSize;//指定通道DMA缓存的大小,单位是数据单位。
uint32_t DMA_PeripheralInc;//设定外设地址寄存器是否递增。Enable/Disable
uint32_t DMA_MemoryInc;//设定内存地址寄存器是否递增。Enable/Disable
uint32_t DMA_PeripheralDataSize;//设定外设数据宽度。Byte/HalfWord/Word
uint32_t DMA_MemoryDataSize;//设定内存数据宽度。Byte/HalfWord/Word
uint32_t DMA_Mode;//工作模式是正常缓存还是循环缓存。Normal/Circular
uint32_t DMA_Priority;//VeryHigh/High/Medium/Low
uint32_t DMA_M2M;//是否将DMAy的通道x设置为内存到内存传输。Enable/Disable
}DMA_InitTypeDef;
uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx)
:返回当前指定DMA通道剩余的待传输数据数目。
void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx,FunctionalStateNewState)
:使能or禁止指定DMA通道。
FunctionalStateNewState:Enable/Disable
通道新状态。FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG)
:查询指定DMA通道的标志位状态(是否置位),但不检查该中断是否被屏蔽。因此当该位置位时,通道的指定中断并不一定得到响应。
void DMA_ClearFlag(uint32_t DMAy_FLAG)
:清除指定DMA通道的待处理标志位。
void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx,uint32_t DMAy_IT,FunctionalStateNewState)
:使能or禁止指定DMA通道中断。
DMA_IT
:
DMA_IT_TC
:传输完成中断。DMA_IT_HT
:传输过半中断。DMA_IT_TE
:传输错误中断。ITStatus DMA_GetITConfig(uint32_t DMAy_IT)
:查询指定DMAy的通道x的中断的状态,中断是否发生,指定标志位的状态并检测该中断是否被屏蔽。
void DMA_ClearITPendingBit(uint32_t DMAy_IT)
:清除指定DMAy的通道x的中断的挂起位。
_GetITConfig(uint32_t DMAy_IT)`:查询指定DMAy的通道x的中断的状态,中断是否发生,指定标志位的状态并检测该中断是否被屏蔽。
void DMA_ClearITPendingBit(uint32_t DMAy_IT)
:清除指定DMAy的通道x的中断的挂起位。
因篇幅问题不能全部显示,请点此查看更多更全内容