STM32F10XX DMA学习

耗尽温柔 提交于 2019-12-31 17:56:30

DMA(Direct Memory Access)是计算机科学中的一种内存访问技术。它允许某些电脑内部的硬件子系统(电脑外设),可以独立地直接读写系统存储器,而不需绕道 CPU。 DMA 用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。传输过程中, CPU 是闲置的,数据的高速传输不需要用到 CPU,节省了 CPU 的资源来做其他的操作。

在硬件系统中,主要由 CPU(内核)、外设、内存(SRAM)、总线等结构组成,数据经常要在存储器与外设直接转移,或是从外设 A 转移到外设 B。在不使用DMA 情况下,内核通过 DCode 经过总线矩阵协调,使用 AHB 把外设 ADC 采集的数据读取到内核,然后内核 Dcode 再通过总线矩阵协调,把数据存放到内存 SRAM中。而 DMA 就可以取代这样的工作,由 DMA 控制器的 DMA 总线与总线矩阵协调,使用 AHB 把外设 ADC 的数据经由 DMA 通道存放到内存 SRAM。使用 DMA为多通道采集、采样频率高、连续输出数据的 AD 采集提供了更高效的方法。这里的外设一般是指外设的数据寄存器,比如 ADC、 SPI、 I2C 等外设的数据
寄存器。

 

仲裁器, 一个 DMA 控制器对应 8 个数据流,数据流包含要传输数据的源地址、目标地址、数据等信息。如果我们需要同时使用同一个 DMA 控制器多个外设请求时,那必然需要同时使用多个数据流,其中哪个数据流优先, 此时由仲裁器来选定。

仲裁器管理数据流方法分为两个阶段。第一阶段属于软件阶段,我们在配置数据流时可以通过寄存器设定它的优先级别,可以在 DMA_CCRx 寄存器中设置, 有最高优先级、高优先级、中等优先级和低优先级四个等级。 第二阶段是硬件,如果两个请求有相同的软件优先级,则较低编号的通道比高编号的通道有较高的优先权

 DMA请求映像:

例如通道1,三个外设采用逻辑或到通道一,所以在同一时间,我们只能使用其中的一个外设。

配置:

DMA_CPARx设置外设寄存器的地址,作为数据源

DMA_CMARx设置存放数据的目标地址

DMA_CNDTRx 寄存器中设置要传输的数据流。在每个数据传输后,这个数
值递减

DMA_CCRx 寄存器中的 PL[1:0]位设置通道的优先级。


DMA_CCRx 寄存器中设置数据传输的方向、循环模式、 外设和存储器的增
量模式、外设和存储器的数据款的、传输一半产生中断或传输完成产生中断。

设置 DMA_CCRx 寄存器的 ENABLE 位,启动通道。

 

DMA参数配置:

 

Direction:传输方向, 有三种, 分别是外设到存储器、 存储器到外设和存储器到存储器, 根据工程要求来选择三种传输方向。

PeriphInc:配置外设地址寄存器是否要自动递增(数据源)

MemInc:使能存储器地址自动递增功能。(目标存放数据地址)

PeriphDataAlignment:外设数据长度调整,有三种分别是字节、字和半字

MemDataAlignment:存储器数据字长调整

Mode:配置传输模式

Priority:优先权

DMA编程流程:

1. DMA初始化

2. 配置DMA数据流参数

3. 开始传输

4. 等待传输完成


 

 

 

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!