Stm32之DMA直接内存读取
1.DMA简介:
2.DMA的外设对应通道:
? DMA每个外设所对应的通道,都是确定好的,默认的优先级及各外设对应的通道如下:
3.相关寄存器:
此处DMA1与DMA2控制的寄存器的地址是分开的,因此只介绍DMA1;DMA2的所有寄存器应该于DMA1类似,均排列在DMA1后(即先全部是DMA1的寄存器,再是DMA2的寄存器);
-
DMA interrupt status register (DMA_ISR):中断标志位:每个通道各4个,共占28位[27:0]
- TEIFx: Transfer Error Interr Flag传输错误标志位
- HIIFx: Half Transfer Interr Flag传输过半标志位
- TCIFx: Transfer Complete Interr Flag传输完成标志位
- GIFx: Global Interr Flag全局中断标志位(只要上述中断有一个发生,该位就置一)
-
DMA interrupt flag clear register (DMA_IFCR):中断标志清除位:一样占28位[27:0];用于与ISR一一对应清除标志; -
DMA channel x configuration register (DMA_CCRx) (x = 1…7): 各个通道的通道控制寄存器:(每个寄存器占15位[14:0])
-
MEM2MEM[14]:是否使能内存到内存的搬运; -
PL[13:12]:priority level优先级配置;00-低;01-中;10-高;11-最高; -
MSIZE[11:10]: Memory size传输内存单位大小;00-8位;01-16位;10-32位;11-保留; -
PSIZE[9:8]: Peripheral size传输到外设单位大小;00-8位;01-16位;10-32位;11-保留; -
MINC[7]: Memory increment mode,内存地址是否自增; -
PINC[6]: Peripheral increment mode,外设地址石否自增; -
CIRC[5]: Circular mode,是否使能循环传输; -
DIR[4]: Data transfer direction,传输方向:0-P2M;1-M2P; -
[3:0] TEIE(Transfer error interrupt enable)和HTIE( Half transfer interrupt enable)和TCIE(Transfer complete interrupt enable)三个中断标志的使能位; -
EN[0]:该通道的使能位。 -
DMA channel x number of data register (DMA_CNDTRx) (x = 1…7):该寄存器的值是通道传输的数据长度,占16位,所以最大值位65535; -
DMA channel x peripheral address register (DMA_CPARx) (x = 1…7), 32位寄存器,用来存放要传输的外设的地址; -
DMA channel x memory address register (DMA_CMARx) (x = 1…7),32位寄存器,用来存放要传输的内存的地址;
4.库函数操作:
-
使能DMA的时钟:RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMAx(1/2), ENABLE) -
初始化要开启的通道参数: DMA_Init(DMA_Channel_TypeDef DMAy_Channelx, DMA_InitTypeDef DMA_InitStruct)** 要求的参数除了通道几外,还有一个结构体用于设置传输时的具体参数: 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;
-
对于外设,均要使能该外设:DMA_Cmd(DMA_Channelx, ENABLE); -
注意:使用DMA传输时,在对应外设中,要将外设中的DMA传输开启; 如: ADC_DMACmd(ADC3,ENABLE);//使能ADC3到DMA的转换 -
两个常用的库函数: FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG)
//在 DMA 传输过程中,我们要查询 DMA 传输通道的状态,参数为DMAy_FLAG_TCx;DMAy的x通道
uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx)
//是获取当前剩余数据量大小,参数同样是DMAy的通道x
5.关于地址:
|