STM32F103之DMA学习记录

/================翻译STM32F103开发手册DMA章节===========================/

13 DMA(Direct memory access)

13.1 DMA介绍

DMA(直接存储器存取)是用来给外设与存储器以及存储器与存储器提供高速的数据传输。

数据可以通过DMA快速地移动而不需经过CPU。

这使得CPU资源可以用于其他操作。

两个DMA控制器一共有12个通道(DAM1有7个,DAM2有5个),

每一个都能专注地管理一个或多个外设的存储器访问请求。

有一个仲裁机制处理DMA请求的优先级问题。

13.2 DMA主要特性

12个可配置的独立通道:DMA1有7个,DMA2有5个。

12个通道都连接到专用的硬件DMA请求,

每个通道也支持软件触发。这由软件进行配置。

DMA通道的请求优先级是可以通过软件编程设置的,

优先级等级包括:非常高、高、中、低,

如果是同等级的话,请求1有限请求2。

独立的源点和目标点传输大小,模拟打包和拆包。

源点和目标点地址必须与数据大小对齐。

支持循环缓冲区管理。

有3个事件标志:DMA传输一半、DMA传输完成以及DMA传输错误。

每个通道的单独中断请求对于这三个事件标志会逻辑上或在一起。

存储器与存储器之间的传输。

外设到存储器、存储器到外设、外设到外设都是可以传输的。

FLSH,SRAM,挂在APB1、APB2与AHB上的外设都可以作为DMA传输的源点和目标点。

传输的数据量是可以设置的,最高可达65536。

 

 

 上图就是DMA的模块图,可以看出模块与存储器之间的数据传输可以不经过CPU。

 

13.3 DMA功能描述

DMA控制器通过与Cortex-M3内核共享系统总线执行存储器数据的直接传输。

当DMA请求与CPU针对相同的目标点(存储器或者外设)时,

DMA请求可能会使CPU访问系统总线停止几个周期。

总线矩阵实现循环调度,从而保证CPU能占用至少一半的系统总线带宽。

13.3.1 DMA事务

时间发生后,外设向DMA控制器发送一个控制信号。

DMA控制器根据通道的优先级处理请求。

只要DMA控制器访问外围设备,DMA控制器就会给外设发送一个响应。

当外设接收到DMA控制器的响应,外设会释放它的请求。

一旦请求被外围设备拒绝,DMA控制器会停止响应。

如果有更多的请求,外设会开始下一个事务。

综上所述,每个DMA包含包含3个操作:

(1)从外围数据寄存器或内存地址加载数据,

通过一个内部的当前外设或存储器地址寄存器。

 用于第一次传输的起始地址是基本外设/内存地址,

这些地址可以在DMA_CPARx或DMA_CMARx寄存器中编程设置。

(2)加载到外围数据寄存器的数据的存储或内存地址通过当前内部外设/存储器地址寄存器。

用于第一次传输的起始地址是基本外设/内存地址,

这些地址可以在DMA_CPARx或者DMA_CMARx寄存器里编程设置。

(3)后递减的DMA_CNDTRx寄存器包含一些仍需要执行的事件。

13.3.2 仲裁者

仲裁程序根据通道请求的优先级管理它们,

并且启动外围/内存访问序列。

优先级分两阶段管理:

(1)软件:每一个通道的优先级都可以通过DMA_CCRx寄存器配置。

有四个等级:非常高、高、中等、低。

(2)硬件:如果两个请求具有相同的软件优先级,

最低数字的通道会获得优先权而不是最高数字的通道。

例如:通道2比通道4有优先权。

在高密度、超高密度以及连接线器件中,DMA1控制器比DMA2控制器有优先权。

 

 

 

13.3.3 DMA通道

每一个通道都能处理固定地址的外设寄存器与一个内存地址的DMA传输。

数据量大小是可以编程控制的,数据最大是65535。

每一次传输后,包含数据量的寄存器会递减。

可编程数据大小

在外设与内存之间,传输数据的大小都是可通过设置DMA_CCRx寄存器的RSIZE和MSIZE位编程改变。

 

指针增量

在每一个事件之后,外设和内存指针可以自动递增,

这取决于DMA_CCRx寄存器的PINC和MINC位。

如果递增模式启用,下一个转换的地址将是前一个地址加1或2或4,

这个递增的数据取决于选择数据的大小。

第一次转移的地址由DMA_CPARx/DMA_CMARx寄存器设置。

在转移操作过程中,寄存器保留最初的编程值。

当前的转移地址不能由软件编程控制。

如果通道被配置为非循环模式,在上一次转换后,将不提供DMA请求。

为了重新加载要转移到DMA_CNDTRx寄存器新数量的数据项,

DMA通道必须禁止。

如果一个DMA通道禁止,DMA寄存器不会重置。

DMA通道寄存器保持初始值,这些初始值是在通道配置阶段编程设置的。

在循环模式,在最后一次转换后,

DMA_CNDTRx寄存器自动加载初始设置的值。

 

通道配置过程

应该用以下顺序来配置DMA通道:

1、在DMA_CPARx寄存器上设置外围寄存器地址。

在外围事件触发后,

数据会从外设地址转移到内存地址。

2、在DMA_CMARx寄存器设置内存地址。

在外围事件触发后,会从这个地址读或写数据。

3、在DMA_CNDTRx寄存器配置要传输的总数据量。

在每次外围事件后,这个值会递减。

4、在DMA_CCRx寄存器中使用PL[1:0]位配置通道的优先级。

5、在DMA_CCRx寄存器中配置数据传输方向,循环模式,

外设和内存的递增模式,外设和内存的数据大小,中断触发时刻。

6、DMA_CCRx寄存器里通过设置使能位激活通道。

一旦通道激活,该通道可以服务任何连接在此通道上的DMA请求。

当数据传输一半时,传输过半标志位(HTIF)被置1,

如果过半中断使能位(HTIE)位被设置了,会产生一个中断。

在传输结束时,传输完成标志位(TCIF)被置1,

如果传输完成中断使能位被设置了,会产生一个中断。

循环模式

循环模式可用于处理循环缓冲区和连续数据流(例如ADC扫描模式)。

在DMA_CCRx寄存器里通过设置CIRC位可以激活这项特征。

如果循环模式被激活,数据将会以初始配置值自动传输加载,

初始配置值是在配置阶段设置的,并且DMA请求继续被处理。

内存到内存模式

 DMA通道也可以在没有外设触发请求的情况下工作。

这种模式被称为内存到内存模式。

如果DMA_CCRx寄存器的MEM2MEM位被置1,

当软件配置DMA_CCRx寄存器的使能位,通道就启动传输。

一旦DMA_CNDTRx寄存器值变为0,传输就会停止。

内存到内存模式不能与循环模式同时使用。

 

13.3.4 数据宽度、数据对齐方式以及大小端模式都是可编程的

当PSIZE与MSIZE不相等时,DMA会执行对齐。

寻址AHB外设不支持字节或半字操作

当DMA启动一个AHB字节或半字写操作时,

数据会复现在HWDATA[31:0]总线的空闲线路上。

因此当未使用的AHB从设备不支持字节或半字操作(当外设不适用HSIZE时)

并且不产生任何错误,DMA将会写32位HWDATA用以下两种方式写:

(1)写半字“0xABCD”,当HSIZE= 半字

13.3.5 错误管理

对一个保留地址空间进行读或写操作时,会产生一个DMA传输错误。

当DMA读或写访问过程中产生一个DMA传输错误时,

错误通道会通过硬件清除使能位自动禁止,

使能位在相应的通道配置寄存器(DMA_CCRx)中。

通道传输错误中断标志位(TEIF)在DMA_IFR寄存器中设置,

如果传输错误中断使能位(TEIE)被设置后,会产生中断。

13.3.6 中断

对于每一个通道,在传输一半时,在传输完成时或传输错误时,都会产生一个中断。

单独的中断使能位可灵活配置。

 

 

 

 

13.3.7 DMA请求映射

 DMA1 控制器

在进入DMA1之前,外设的七个请求是简单的逻辑或关系,

这就意味着在一个时刻只能有一个请求。

通过对相应外设寄存器DMA的控制位进行编程,

外设的DMA请求可以被独立地激活。

 

 

 从上图可以看出,外设请求先经过一个或门,然后通过一个选择器,

接着对7个DMA请求进行优先级设置,最终执行最高优先级DMA请求。

 

 

 DMA2控制器

DMA2控制器的介绍与DMA1控制器的介绍差不多,

只不过DMA1有7个通道,DMA2只有5个通道。

 

 

 

 

 

13.4 DMA寄存器

posted on 2020-02-21 17:49  辉哥54110  阅读(1891)  评论(0编辑  收藏  举报