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=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
- Stm32 DMA
- stm32 DMA
- STM32 DMA
- STM32->DMA
- stm32 DMA
- STM32之DMA
- STM32 DMA学习
- STM32 DMA USART ADC
- STM32——DMA
- STM32的DMA中断
- STM32-DMA学习笔记
- ADC-DMA For STM32
- STM32 USART DMA
- STM32之DMA简介
- STM32 DMA使用浅谈
- STM32之DMA二
- STM32 DMA传输
- STM32 DMA使用详解
- 线性回归与分类, 解决与区别
- CF 178(div 2)B(greedy + 枚举)
- "this class is not key value coding-compliant for the key ..."问题的解决(转)
- 勿以自己的经历来审视他人
- POJ-1325-Machine Schedule
- Stm32 DMA
- 低吸是大傻,买点不是最低那一天,而是发力那一刻
- MyEclipse连接MySQL的方法
- 写代码,反转一个单链表,分别以迭代和递归的形式来实现
- hdu2444 二分匹配 The Accomodation of Students
- 知道与做到之间的距离
- [Python] 使用Django开发Web框架
- linux-3.4.2 s5pv210 Goodix-TS 移植
- 牛人网站自己收集