/================翻译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. 安装MySQL被提示缺少msvcr120.dll,msvcp120.dll或提示0xc00007b错误

    踩坑经历: 我的电脑昨天重装了win10系统,在安装MySQL时被提示缺少msvcr120.dll,我去下载msvcr120.dll后放入System32中,又被提示缺少msvcp120.dll,然后 ...

  2. html点击圆形扩散显示界面特效

    开场白 效果 用到的核心代码 思考 探索 源码 兼容性问题 开场白 经常看到某些app有点击扩散的特效,有些当做扩散显示界面,有些扩散改变主题颜色,想在网页上实现一下,所以就有了这个. 效果 不想听逼 ...

  3. PAT (Advanced Level) Practice 1008 Elevator (20 分) (模拟)

    The highest building in our city has only one elevator. A request list is made up with N positive nu ...

  4. 微信小程序 --- 日历效果

    wxml部分: <view class='box1' style='width: {{ sysW * 7 }}px'> <view class='dateBox'>{{ yea ...

  5. vue常用插件之视频播放(rtmp m3u8)

    vue-video-player(5.0.2) 最近我的项目做了一个监控视屏的显示,后台提供的视屏格式是rtmp 后来又改为m3u8,没成功,原因是占用内存过大,所以取消了这种方式 一.安装 npm ...

  6. 牛客练习赛53-E 老瞎眼 pk 小鲜肉

    Problem 这题的题意大概是 给出一段长度为\(n\) 的区间 \(q\)次询问求 \(L\)~ \(R\) 这个区间内 最短的一段区间 \(l\)~\(r\) 使得 \(\oplus_{i=l} ...

  7. CTF之图片隐写术解题思路

    参考大佬的博客:https://blog.csdn.net/a_small_rabbit/article/details/79644078 深有感触,觉得写得比较全,因此将此篇文章记录在此方便以后用得 ...

  8. Keras 回归 拟合 收集

    案例1 from keras.models import Sequential from keras.layers import Dense, LSTM, Activation from keras. ...

  9. 2020牛客寒假算法基础集训营1 F-maki和tree

    链接:https://ac.nowcoder.com/acm/contest/3002/F来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  10. python创建字典的三种方式

    创建空字典: dict_eq={} print(type(dict)) 直接赋值创建字典: dict_eq={'a':1,'b':2,'c':'adbc'} 通过关键字dict和关键字参数创建 dic ...