【嵌入式学习】嵌入式原理知识-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寄存器,所以,外设地址不自增,目标地址自增,此时可以将数据传输到对应的数组中:

相关推荐
传奇开心果编程1 小时前
【ArkUI进阶练中学】第11课:安全与合规进阶
学习·ui·华为·harmonyos
Mr_Macallon3 小时前
C++回顾(基础)(01)
c语言·开发语言·c++·学习
sunoo-2294 小时前
【ARM嵌入式学习笔记第十天】i.MX6ULL eLCDIF控制器驱动RGB LCD全解析(硬件原理+寄存器配置+裸机代码)
arm开发·笔记·学习
kaiyou20265 小时前
用户研究岗秋招,统计分析能力怎么学习和证明?
数据库·python·学习
知识分享小能手5 小时前
C++ 学习教程,从入门到精通,string类和标准模板库 — 完整知识点详解(16)
开发语言·c++·学习
inferno6 小时前
SVN学习笔记(二)
笔记·学习·svn
传奇开心果编程6 小时前
【ArkUI进阶练中学】第12课:应用架构演进与遗留系统迁移
学习·ui·华为·harmonyos
我想我不够好。6 小时前
装一个纯净的系统
学习
小黄蚁7 小时前
使用LVGL模拟示波器创建正弦函数波形
单片机·学习