【嵌入式学习】嵌入式原理知识-DMA(九)

1. DMA简介

DMA(Direct Memory Access)直接存储器存取

DMA可以提供外设和存储器 或者存储器和存储器 之间的高速数据传输

无需CPU介入,节省了CPU的资源

存储器到存储器 的数据转运,我们一般使用软件触发。

外设到存储器的数据转运,我们一般使用硬件触发。

2. STM32的存储器

下表列出了STM32具有的存储器,以及存储器的地址及用途:

ROM掉电不丢失;

RAM掉电丢失;

类型 起始地址 存储器 用途
ROM 0x0800 0000 程序存储器Flash 存储C语言编译后的程序代码
ROM 0x1FFF F000 系统存储器 存储BootLoader,用于串口下载
ROM 0x1FFF F800 选项字节 存储一些独立于程序代码的配置参数
RAM 0x2000 0000 运行内存SRAM 存储运行过程中的临时变量
RAM 0x4000 0000 外设寄存器 存储各个外设的配置参数
RAM 0xE000 0000 内核外设寄存器 存储内核各个外设的配置参数

3. DMA框图

方向部分就是DMA运行区域:

存储器和存储器 以及外设到存储器

既然需要转运数据,就需要如下的三个参数:

1: 起始地址

2:数据宽度

3:地址是否自增

对于地址是否自增:

比如通过串口接收数据,进行数据转运,此时,地址选择不自增,数据会不断的填入这个地址,我们只需要进行转运即可。

传输计数器:

用来确定转运多少次数据;

当传输计数器降低至0后,会通过自动重装器来重置计数器。

触发方式:

触发方式提供图中的M2M来决定;

当M2M置1,此时软件触发DMA转运

当M2M置0,此时为硬件触发,提供外设的标志位来进行触发。

4. DMA请求来源

上述介绍了两种触发方式,此部分就是具体的DMA通道,对应的触发源:

由图中可得:

DMA可以转运SPI,IIC,UART的数据;

以及定时器TIM信号触发DMA转运。

右侧的硬件优先级,通过仲裁器来判断其运行的先后顺序。

5. DMA数据宽度转运原则

按照下图所示:

当读小宽度写大宽度,此时高位补0;

当读大宽度写小宽度,此时只保留低位;

6. DMA实例

6.1 固定数组数据转运

若有两组数据,如下表所示,那么,地址需要自增,将对应位置的数据转运到对应的位置:

6.2 AD扫描模式+ DMA数据转运

因为是扫描模式,且每次的AD采样结果都会将其存储在DR寄存器,所以,外设地址不自增,目标地址自增,此时可以将数据传输到对应的数组中:

相关推荐
Rabitebla10 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
Gary移动存储固件10 小时前
eMMC5.1协议中文学习讲解(6.6.17~6.6.22.4.6)
学习·ufs·emmc·nand·存储固件
一个天蝎座 白勺 程序猿11 小时前
别让收藏夹替你学习:我搭AI知识体系的完整方法,脚本直接拿去用
人工智能·学习·ai·ai学习
楚山之石12 小时前
【Nat Biomed Eng】Connectome 2.0 超高梯度扫描仪:500 mT/m 与 600 T/m/s 把活体人脑微观结构分辨推进到亚微米级
图像处理·学习·数据分析·mri
坤坤子吖14 小时前
Linux网络编程:TCP 粘包与半包问题,如何正确处理 TCP 流式数据?
linux·服务器·网络·笔记·网络协议·学习
LGL6030A18 小时前
Java学习历程31——初识Spring Boot
java·spring boot·学习
阿达和自己20 小时前
springboot学习-springboot引入MyBatis-Plus
spring boot·学习·mybatis
旖旎夜光20 小时前
【C++ 基础入门】C++11 新特性(中):右值引用、移动语义与完美转发
开发语言·c++·笔记·学习
§ꦿCFོ༉1 天前
嵌入式八股文—C语言入门学习(四)
c语言·开发语言·学习
2603_969694851 天前
【JavaWeb学习记录】MyBatis核心知识点与实战笔记:从入门到动态SQL
笔记·sql·学习·mysql·mybatis·javaweb·学习方法