/================翻译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学习记录的更多相关文章

  1. STM32F103之定时器学习记录

    /==============翻译STM32F103开发手册定时器部分========================/ 14 高级控制计时器(TIM1和TIM8) 14.1 TIM1和TIM8介绍 ...

  2. STM32F103之ADC学习记录

    1.问题 1)10位ADC的误差是多少? 首先要分清分辨率与精度的区别. 10cm的尺子,有100个等分刻度,则该尺子的分辨率为1mm. 但不能说这把尺子的精度是1mm. 在冬天,尺子会热胀冷缩,依然 ...

  3. STM32F103之USART学习记录

    1.USART的主要特性 1)名称:串行异步通信接口 2)全双工.异步通信 3)发送和接收速率最高可达4.5MBits/s 4)可编程数据长度8或9bits 5)可配置的停止位:支持1或2位停止位 6 ...

  4. STM32F103之GPIO学习记录

    9 GPIO:通用I/O口 AFIO:可供选择的I/O口 9.1 GPIO功能描述 每一个通用的I/O口都有: 两个32位的配置寄存器(配置寄存器低和配置寄存器高): 两个32位的数据寄存器(输入数据 ...

  5. STM32F103之I2C学习记录

    26.3.1  模式选择 该外设可以在以下四种模式之一 1)从机发送模式 2)从机接收模式 3)主机发送模式 4)主机接收模式 IIC协议时序 MSB:Most Significant Bit(最高有 ...

  6. V4L2学习记录【转】

    转自:http://blog.chinaunix.net/uid-30254565-id-5637600.html V4L2学习记录 这个还没有分析完,先在这放着,防止电脑坏掉丢了,以后再完善 V4L ...

  7. Quartz 学习记录1

    原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...

  8. Java 静态内部类与非静态内部类 学习记录.

    目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...

  9. Apache Shiro 学习记录4

    今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...

随机推荐

  1. (int)、int.Parse()、int.TryParse()、Convert.ToInt32()区别

    请看代码: //1.null. //int i1 = (int)null;//编译时报错:无法将“null”转换为“int”,因为后者是不可以为“null”的值类型. //int i2 = int.P ...

  2. Python语法速查: 14. 测试与调优

    返回目录 本篇索引 (1)测试的基本概念 (2)doctest模块 (3)unittest模块 (4)调试器和pdb模块 (5)程序探查 (6)调优与优化 (1)测试的基本概念 对程序的各个部分建立测 ...

  3. java递归方法分析

    测试题目: 使用递归方式判断某个字串是否是回文( palindrome )“回文”是指正着读.反着读都一样的句子.比如“我是谁是我” 设计思路: 第一,判断是不是回文序列的条件是每一对对称位置的字符是 ...

  4. P1642 规划 [01分数规划]

    裸题,考虑size完了跑一个树上背包,这题没了. // by Isaunoya #include <bits/stdc++.h> using namespace std; #define ...

  5. PAT (Advanced Level) Practice 1035 Password (20 分)

    To prepare for PAT, the judge sometimes has to generate random passwords for the users. The problem ...

  6. 如何在 messager/alert/confirm等消息提示框中 获取 / 设置 嵌入 html内容中的 input[type=checkbox]等的选中状态?

    总结, 有3点: 不能/不要 在 这些消息框 / 提示框/ 对话框中的 回调函数中去写代码: 获取嵌入 内容中input.checkbox的选中状态, 因为 虽然在这些框存在的时候, 这个 check ...

  7. [POI2008] PLA-Postering - 单调栈

    给你 \(n\) 个相连的矩形建筑,让你用最少海报把他们覆盖掉,海报不能重叠,也不可以高出被覆盖的矩形. Solution 考虑维护一个单调递增的栈,每次插入时弹掉所有比自己高的,如果自己和末端一样高 ...

  8. python的循环语句

    python的循环语句有两种:for 和 while,for循环是对可迭代对象进行迭代并处理,因此for的对象是一个可以迭代的对象,而while循环的条件则是一个布尔值可以是一个返回布尔值的表达式. ...

  9. 松软科技课堂:jQuery 效果 - 淡入淡出

    jQuery Fading 方法 通过 jQuery,您可以实现元素的淡入淡出效果. jQuery 拥有下面四种 fade 方法: fadeIn() fadeOut() fadeToggle() fa ...

  10. 倍加福r2000激光驱动安装及使用

    第一次完成激光的驱动安装和激光数据的采集,遇到很多问题,最后一一解决,现在记录下来,方便后面給机器人安装激光使用 激光的了解 (1)激光型号:OMD30M-R2000(30M表示30m) (2)参考手 ...