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

相关推荐
宝绿特塑业再生科技7 小时前
改性HDPE再生颗粒在户外家具挤出发泡板材中的色差控制与高品质价值重构
经验分享·科技·学习·生活·1024程序员节·户外家具
andrsted9 小时前
练题簿在线免费刷题:让整理过的资料,变成能反复练习的题库
学习·微信小程序·小程序·学习方法·刷题·1024程序员节
Alsn8610 小时前
Windows 安装 Ollama 及本地模型部署
学习·1024程序员节
欣欣之王来了11 小时前
原始HTML插值:v-html指令的使用与安全风险
前端·学习·架构·项目·vue3教程
知识分享小能手13 小时前
C学习教程,从入门到精通,C语言学生信息管理系统 — 知识点详解(18)
c语言·学习·1024程序员节
破芽14 小时前
learn-claude-code-s05-s11-学习笔记
笔记·学习
pipixia2003314 小时前
C++ 面试高频:namespace 的 6 个知识点,从 using 到匿名命名空间
c语言·学习·算法·嵌入式·命名空间·c++面试·匿名命名空间
每天题库14 小时前
汽车维修工等级考试题库 理论实操核心考点一次梳理清
学习·安全·考试·题库·考证
神也畏惧菠萝15 小时前
想要学习Agent应用开发?:2026 AI Agent开发全栈通关路线
学习·langgraph·mcp协议·agent开发·rag架构·prompt高级工程
程序猿乐锅15 小时前
【从0-1学习Python | 第七篇】Python 面向对象基础
开发语言·笔记·后端·python·学习·1024程序员节