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
今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...
随机推荐
- C#中调用Windows系统服务exe程序的工具类与重启服务的流程
场景 使用C#编写的Windows服务程序,在Winform中进行调用. 常用工具类方法检测服务是否存在或者安装,获取服务状态,启动服务,停止服务的方法. 以在Winform中重启服务为例. 注: 博 ...
- HDU1163 - Eddy's digital Roots
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1163 九余数:一个数除于9所得到的余数,即模9得到的值 求九余数: 求出一个数的各位数字之和,如果是两 ...
- 76.0.3809.100版本的谷歌浏览器对应能用的chromedriver版本
# -*- coding: utf-8 -*- # @Time : 2019/9/3 11:42 # @Author : wujf # @Email : 1028540310@qq.com # @Fi ...
- linux 第一个知识点(my)
关于Linux - rwx rwx rwx root user 194 Oct : 19 21:24 test -:此符号为文件名,如果是d 则为目录,如果是l 则为连接 rwx: 这是所有者所有的 ...
- DataGridView只显示数据源中绑定的字段
场景: 由于环境需要,在获取数据源的时候会获取多于DataGridView中绑定的字段,若不做任何处理,直接将数据源绑定到DataGridView上面,DataGridView就会将数据源中没有绑定的 ...
- Eclispe WEB项目 转到 IDEA 后无法部署问题
IDEA是个强大的IDE 这个就不用多说了 Eclispe 的Web项目 转到IDEA之后,开始部署会出现大量的问题 项目从SVN下载下来的时候,大概就是这个样 第一步是先设置 项目结构 也就 ...
- ASP.NET MVC5 的请求管道和运行生命周期
https://www.jianshu.com/p/848fda7f79e0 请求处理管道 请求管道是一些用于处理HTTP请求的模块组合,在ASP.NET中,请求管道有两个核心组件:IHttpModu ...
- 【你不知道的javaScript 上卷 笔记1】 javaScript 是如何工作的?
一.什么是作用域? 作用域是用来存储变量以及方便寻找变量的一套规则. 二.javaScript 编译过程(编译发生在代码执行前的几微妙) 分词/词法分析(Tokenizing/Lexing)-> ...
- 查看Sql Server库中某张表的结构
--快速查看表结构(比较全面的) SELECT CASE WHEN col.colorder = THEN obj.name ELSE '' END AS 表名, col.colorder AS 序号 ...
- 项目打jar包和运行
打包成jar包和部署,运行. 1.在pom.xml中加入 <packaging>jar</packaging> <groupId>com.demo02</g ...