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寄存器