两个DMA控制器有12个通道(DMA1有7个通道,DMA2有5个通道),每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各个DMA请求的优先权。
在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,依此类推)
独立数据源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐。
每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求。
闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标。
可编程的数据传输数目:最大为65535
每个通道都可以在有固定地址的外设寄存器和存储器地址之间执行DMA传输。DMA传输的数据量是可编程的,最大达到65535。包含要传输的数据项数量的寄存器,在每次传输后递减。
通过设置DMA_CCRx寄存器中的PINC和MINC标志位,外设和存储器的指针在每次传输后可以有选择地完成自动增量。当设置为增量模式时,下一个要传输的地址将是前一个地址加上增量值,增量值取决与所选的数据宽度为1、2或4。第一个传输的地址是存放在DMA_CPARx /DMA_CMARx寄存器中地址。在传输过程中,这些寄存器保持它们初始的数值,软件不能改变和读出当前正在传输的地址(它在内部的当前外设/存储器地址寄存器中)。当通道配置为非循环模式时,传输结束后(即传输计数变为0)将不再产生DMA操作。要开始新的DMA传输,需要在关闭DMA通道的情况下,在DMA_CNDTRx寄存器中重新写入传输数目。在循环模式下,最后一次传输结束时,DMA_CNDTRx寄存器的内容会自动地被重新加载为其初始数值,内部的当前外设/存储器地址寄存器也被重新加载为DMA_CPARx/DMA_CMARx寄存器设定的初始基地址。
通道配置过程下面是配置DMA通道x的过程(x代表通道号):1. 在DMA_CPARx寄存器中设置外设寄存器的地址。发生外设数据传输请求时,这个地址将是数据传输的源或目标。2. 在DMA_CMARx寄存器中设置数据存储器的地址。发生外设数据传输请求时,传输的数据将从这个地址读出或写入这个地址。3. 在DMA_CNDTRx寄存器中设置要传输的数据量。在每个数据传输后,这个数值递减。4. 在DMA_CCRx寄存器的PL[1:0]位中设置通道的优先级。5. 在DMA_CCRx寄存器中设置数据传输的方向、循环模式、外设和存储器的增量模式、外设和存储器的数据宽度、传输一半产生中断或传输完成产生中断。6. 设置DMA_CCRx寄存器的ENABLE位,启动该通道。一旦启动了DMA通道,它既可响应连到该通道上的外设的DMA请求。
循环模式
循环模式用于处理循环缓冲区和连续的数据传输(如ADC的扫描模式)。在DMA_CCRx寄存器中的CIRC位用于开启这一功能。当启动了循环模式,数据传输的数目变为0时,将会自动地被恢复成配置通道时设置的初值,DMA操作将会继续进行。
存储器到存储器模式
DMA通道的操作可以在没有外设请求的情况下进行,这种操作就是存储器到存储器模式。当设置了DMA_CCRx寄存器中的MEM2MEM位之后,在软件设置了DMA_CCRx寄存器中的EN位启动DMA通道时,DMA传输将马上开始。当DMA_CNDTRx寄存器变为0时,DMA传输结束。存储器到存储器模式不能与循环模式同时使用。
操作一个不支持字节或半字写的AHB设备
当DMA模块开始一个AHB的字节或半字写操作时,数据将在HWDATA[31:0]总线中未使用的部分重复。因此,如果DMA以字节或半字写入不支持字节或半字写操作的AHB设备时(即HSIZE不适于该模块),不会发生错误,DMA将按照下面两个例子写入32位HWDATA数据:●当HSIZE=半字时,写入半字’0xABCD’,DMA将设置HWDATA总线为’0xABCDABCD’。●当HSIZE=字节时,写入字节’0xAB’,DMA将设置HWDATA总线为’0xABABABAB’。假定AHB/APB桥是一个AHB的32位从设备,它不处理HSIZE参数,它将按照下述方式把任何AHB上的字节或半字按32位传送到APB上:●一个AHB上对地址0x0(或0x1、0x2或0x3)的写字节数据’0xB0’操作,将转换到APB上对地址0x0的写字数据’0xB0B0B0B0’操作。●一个AHB上对地址0x0(或0x2)的写半字数据’0xB1B0’操作,将转换到APB上对地址0x0的写字数据’0xB1B0B1B0’操作。例如,如果要写入APB后备寄存器(与32位地址对齐的16位寄存器),需要配置存储器数据源宽度(MSIZE)为’16位’,外设目标数据宽度(PSIZE)为’32位’。
DMA请求映像
DMA1控制器
从外设(TIMx[x=1、2、3、4]、ADC1、SPI1、SPI/I2S2、I2Cx[x=1、2]和USARTx[x=1、2、3])产生的7个请求,通过逻辑或输入到DMA1控制器,这意味着同时只能有一个请求有效。参见下图的DMA1请求映像。
外设 |
通道1 |
通道2 |
通道3 |
通道4 |
通道5 |
通道6 |
通道7 |
|
ADC1 |
ADC1 |
|
|
|
|
|
SPI/I2S |
|
SPI1_RX |
SPI1_TX |
SPI/I2S2_RX |
SPI/I2S2_TX |
|
|
USART |
|
USART3_TX |
USART3_RX |
USART1_TX |
USART1_RX |
USART2_RX |
USART2_TX |
I2C |
|
|
|
I2C2_TX |
I2C2_RX |
I2C1_TX |
I2C1_RX |
TIM1 |
|
TIM1_CH1 |
TIM1_CH2 |
TIM1_TX4 TIM1_TRIG TIM1_COM
|
TIM1_UP |
TIM1_CH3 |
|
TIM2 |
TIM2_CH3 |
TIM2_UP |
|
|
TIM2_CH1 |
|
TIM2_CH2 TIM2_CH4 |
TIM3 |
|
TIM3_CH3 |
TIM3_CH4 TIM3_UP |
|
|
TIM3_CH1 TIM3_TRIG |
|
TIM4 |
TIM4_CH1 |
|
|
TIM4_CH2 |
TIM4_CH3 |
|
TIM4_UP |
DMA2控制器从外设(TIMx[5、6、7、8]、ADC3、SPI/I2S3、UART4、DAC通道1、2和SDIO)产生的5个请求,经逻辑或输入到DMA2控制器,这意味着同时只能有一个请求有效。参见下图的DMA2请求映像。
外设 |
通道1 |
通道2 |
通道3 |
通道4 |
通道5 |
ADC3(1) |
|
|
|
|
ADC3 |
SPI/I2S3 |
SPI/I2S3_RX |
SPI/I2S3_TX |
|
|
|
UART4 |
|
|
UART4_RX |
|
UART4_TX |
SDIO(1) |
|
|
|
SDIO |
|
TIM5 |
TIM5_CH4 TIM5_TRIG |
TIM5_CH3 TIM5_UP |
|
TIM5_CH2 |
TIM5_CH1 |
TIM6/ DAC通道1 |
|
|
TIM6_UP/ DAC通道1 |
|
|
TIM7/ DAC通道2 |
|
|
|
TIM7_UP/DAC通道2 |
|
TIM8(1) |
TIM8_CH3 TIM8_UP |
TIM8_CH4 TIM8_TRIG TIM8_COM |
TIM8_CH1 |
|
TIM8_CH2 |