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寄存器
STM32F103之DMA学习记录的更多相关文章
- STM32F103之定时器学习记录
/==============翻译STM32F103开发手册定时器部分========================/ 14 高级控制计时器(TIM1和TIM8) 14.1 TIM1和TIM8介绍 ...
- STM32F103之ADC学习记录
1.问题 1)10位ADC的误差是多少? 首先要分清分辨率与精度的区别. 10cm的尺子,有100个等分刻度,则该尺子的分辨率为1mm. 但不能说这把尺子的精度是1mm. 在冬天,尺子会热胀冷缩,依然 ...
- STM32F103之USART学习记录
1.USART的主要特性 1)名称:串行异步通信接口 2)全双工.异步通信 3)发送和接收速率最高可达4.5MBits/s 4)可编程数据长度8或9bits 5)可配置的停止位:支持1或2位停止位 6 ...
- STM32F103之GPIO学习记录
9 GPIO:通用I/O口 AFIO:可供选择的I/O口 9.1 GPIO功能描述 每一个通用的I/O口都有: 两个32位的配置寄存器(配置寄存器低和配置寄存器高): 两个32位的数据寄存器(输入数据 ...
- STM32F103之I2C学习记录
26.3.1 模式选择 该外设可以在以下四种模式之一 1)从机发送模式 2)从机接收模式 3)主机发送模式 4)主机接收模式 IIC协议时序 MSB:Most Significant Bit(最高有 ...
- V4L2学习记录【转】
转自:http://blog.chinaunix.net/uid-30254565-id-5637600.html V4L2学习记录 这个还没有分析完,先在这放着,防止电脑坏掉丢了,以后再完善 V4L ...
- Quartz 学习记录1
原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...
- Java 静态内部类与非静态内部类 学习记录.
目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...
- Apache Shiro 学习记录4
今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...
随机推荐
- 在VS的依赖项中引用项目
操作步骤:鼠标右击项目(注意是项目)->添加->引用->项目(在项目列表中选择需要引用的项目)->确定
- JAVA->查询并显示输入根目录下全部的文件所在目录路径
public static boolean qf(File f,boolean a){ boolean b=false; if(a==true){ File[] fl=f.li ...
- Android之活动Activity用法
Activity是Android的四大组件之一,本篇将通过Activity的生命周期,Intent的组成部分以及如何使用Intent进行页面之间的消息传递来介绍它的基本用法. 1.activity的生 ...
- 虚拟机NAT模式连接外网
虚拟机三种联网方式: 一.NAT(推荐使用) 功能:①可以和外部网络连通 ②可以隔离外部网络 二.桥接模式 功能:直接 ...
- Thymeleaf的基本用法
俗话说,不会前端的后端工程师不是一个合格的程序员.因为在项目中经常要和前端工程师打交道,并且偶尔也会涉及前端的简单开发,因此在闲暇之余学习了一点前端的知识,今天首先总结归纳一下 Thymeleaf 模 ...
- Android_ExpandableListView
实现效果: 类似于QQ联系人列表 相关属性: android:childDivider:指定各组内子类表项之间的分隔条,图片不会完全显示, 分离子列表项的是一条直线 android:childIndi ...
- 使用FDATOOL生成xilinx中FIR滤波器IP核的系数
1.在MATLAB命令窗口输入fdatool后回车,打开“Filter Designer & Analysis Tool”工具界面: 2.点击左下角的Set quantization para ...
- Python标准库之logging模块
很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,loggin ...
- 【Unity|C#】基础篇(13)——特性(Attribute)
[学习资料] <C#图解教程>(第24章):https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.baidu. ...
- 本机添加多IP绑定网站
查询IP 显示为1个IP 点击更改适配器 点击高级 进行添加IP 点击添加 ipconfig 查看效果 注~!:在IIS中可以在这里添加多IP然后绑定