Stm32 DMA

来源:互联网 发布:mac terminal字体 编辑:程序博客网 时间:2024/04/28 23:36

两个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=1234]ADC1SPI1SPI/I2S2I2Cx[x=12]USARTx[x=123])产生的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[5678]ADC3SPI/I2S3UART4DAC通道12SDIO)产生的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

 

原创粉丝点击