实用指南:二十四、STM32的DMA

news/2025/12/2 20:27:37/文章来源:https://www.cnblogs.com/gccbuaa/p/19299233

前言:现代 MCU 频繁得处理大量外设数据(ADC、UART、SPI、I²C 等),如果把这些数据搬运完全交给 CPU,会占用大量 CPU 周期,降低系统响应能力。**DMA(Direct Memory Access,直接内存访问)**就是解决这个困难的利器:它行在不占用 CPU 的情况下,把外设数据自动搬运到内存(或把内存数据搬到外设),显著降低 CPU 负担、提升实时性与吞吐量。

目录

一、DMA 是什么?为什么要用?

二、DMA 的总体架构

三、DMA 的典型传输方向与使用场景

四、DMA 的关键设置项与概念

五、DMA 的工作时序与中断

六、常见误区与调试要点

七、性能注意事项与优化建议

八、ADC+DMA


什么?为什么要用?就是一、DMA

DMA 的本质:一个硬件控制器,负责在外设寄存器、内存和外设之间直接搬运数据,搬运过程中 CPU 不参与数据逐字节拷贝(但仍需做配置和处理完毕后的逻辑)。

主要优点

  • 降低 CPU 占用:尤其适合大量或高速数据采集(如音频、传感器阵列、图像流等)。

  • 更稳定的实时性:减少中断频率或避免中断上下文开销。

  • 更高吞吐量:硬件搬运比软件循环拷贝更快、更节省总线带宽。

适用场景举例:ADC 多通道高速采样、UART 大量数据接收、SPI 快速数据传输、内存到内存的批量拷贝、PWM 波形输出缓冲等。

二、DMA 的总体架构

  • STM32F1 系列通常有DMA1(个别器件还有 DMA2)。

  • DMA 被划分为通道(Channel),每个通道映射到一个或多个外设事件(例如 ADC、USART、SPI 等)。通道数量有限(例如 DMA1 通常有 7 个通道)。

  • 每个通道有自己的配置寄存器,控制源/目的地址、方向、数据宽度、优先级、传输长度、模式(循环/普通)等。

  • DMA 与外设通过**请求映射(request mapping)**关联:某个外设触发数据准备(如 ADC EOC),会产生 DMA 请求到对应通道。

三、DMA 的典型传输方向与使用场景

  • 外围设备 → 内存(Peripheral-to-Memory)
    场景:ADC 将转换结果推送到内存、USART RX 接收数据写内存。是最常见的用于数据采集的方向。

  • 内存 → 外围设备(Memory-to-Peripheral)
    场景:从一个内存缓冲区把数据写到 DAC、UART TX、SPI TX(比如发送音频或图像信息)。

  • 内存 → 内存(Memory-to-Memory)
    场景:大块内存数据搬运(在 F1 上支持有限,注意映射与配置)。用于缓冲区复制、DMA 驱动的块传输等。

  • 双向 / 循环模式模式选择)就是(实际
    循环(Circular)适合连续流素材采集;普通(Normal)适合一次性传输。

四、DMA 的关键配置项与概念

  • 源地址(Peripheral address)与目的地址(Memory address)
    DMA 在搬运时会从源地址读取数据并写到目的地址;比如 ADC->内存: 源=ADC_data_register,目的=缓冲区首地址。

  • 传输方向(Direction):见上一节。

  • 传输长度(Number of Data)字节数,依赖数据宽度)。就是:要搬运的数据项个数(不

  • 数据宽度(Peripheral & Memory Data Size):常见为 8-bit、16-bit、32-bit。ADC(12-bit)一般运用 16-bit 宽度(half-word),UART 通常用 8-bit。数据宽度必须匹配硬件与缓冲格式。

  • 地址递增(Peripheral increment / Memory increment):是否在每次传输后自动增加地址。外设寄存器通常禁用地址递增(固定地址),内存缓冲通常启用递增。

  • 传输模式(Normal / Circular)

    • Normal:完成指定数量传输后停止并触发完成中断。

    • Circular:完成后自动重新开始(围绕缓冲区),适合连续采样。

  • 优先级(Priority):在多通道竞争 DMA 总线时决定抢占顺序(高优先级通道更早获得总线)。

  • 中断/标志:半传中断(Half Transfer)、传输完成中断(Transfer Complete)、传输错误中断。半传在循环模式下非常有用——可以实现“前半缓冲处理同时后半缓冲接收”的方案。

五、DMA 的工作时序与中断

  • 启动步骤(概念层面):

    1. 配置 DMA(源/目地址、长度、宽度、递增、模式、优先级)。

    2. 配备外设(使能外设 DMA 请求,比如 ADC_DMACmd)。

    3. 使能 DMA 通道与相关中断(如果需要)。

    4. 启动外设触发(ADC 软件触发或定时器触发),数据开始流入缓冲区。

  • 半传中断(HT)与传输完成中断(TC)
    在循环模式下,半传中断可以触发处理已填满的缓冲区一半数据,而 DMA 继续写入另一半;传输搞定中断则表示一轮缓冲写满。利用这两个事件可以实现无缝“生产者-消费者”模式。

  • 错误处理:DMA 也可能产生传输错误(比如总线错误),要有相应的检测与恢复策略(重启 DMA、报警等)。

六、常见误区与调试要点

  • 误区:DMA 一开就万事大吉
    DMA 确实减轻 CPU,但错误配置(地址错误、长度错误、宽度不匹配)会导致数据错位、溢出或硬件挂起。调试时重点检查外设数据寄存器地址、数据宽度和内存缓冲区大小。

  • 误区:半传中断和全传中断二者可互相替代
    半传中断用于“流式处理”更低延迟;若只用全传中断,会在缓冲写满后才处理,可能加大延迟。

  • 调试技巧

    • 先用短缓冲进行能力验证(例如 4 个采样点);

    • 打开半传/全传中断并在 ISR 中简单翻转 IO(示波器观察)确认触发节奏;

    • 检查 DMA 优先级与竞争关系;

    • 确认内存对齐(16-bit/32-bit)与 CPU 访问不会引起未对齐故障。

  • 跨域缓存障碍(高级):F1 的 Cortex-M3 没有数据缓存问题,然而在更高端系列(如 Cortex-M7)必须考虑 D-cache 与 DMA 的一致性:使用缓存刷新/失效或使用不可缓存内存区。

七、性能注意事项与优化建议

  • 选择合适的数据宽度:尽量让外设与内存宽度匹配,减少额外的对齐/移动操作(例如 ADC 用 16-bit 存储)。

  • 优先级与通道分配:把关键通道设高优先级;避免多个高频外设共享同一 DMA 通道。

  • 中断开销最小化:把处理尽量放到任务或主循环,不在 ISR 中做大量计算;使用半传中断只做标记并在主循环处理。

  • 使用循环模式处理持续数据流:比如 ADC 连续采样或串口持续接收,循环模式可以避免频繁重启 DMA。

  • 考虑缓冲大小权衡:小缓冲降低延迟但增加中断频率;大缓冲降低中断负担但增加响应延迟。

八、ADC+DMA

  • 当需要实时采集多通道数据(如传感器阵列、音频采样、振动分析等)时,CPU 去轮询或处理中断会消耗大量计算资源,甚至跟不上数据速率。

  • 通过ADC + DMA 能够搭建:ADC 将转换结果自动写入内存缓冲区,CPU 仅在缓冲半满或满时处理数据,极大提高效率与实时性。

配置流程:

  • 设计缓冲区:为采样结果准备好连续的内存数组(例如 uint16_t buffer[NUM_SAMPLES];)。通常选择 16-bit 单元来保持 ADC 的 12-bit 数据。

  • 配置 ADC

    • 打开 ADC 时钟,设置采样时间、分辨率(12-bit)、触发模式(软件或定时器触发)、扫描模式(若为多通道自动扫描)。

    • 对于多通道自动采样,启用扫描模式并在序列寄存器中设置通道顺序。

  • 配置 DMA(外设 → 内存):

    • 源地址:ADC 材料寄存器地址(固定);目的地址:缓冲区首地址;

    • 数据宽度:一般选择 16-bit(half-word);

    • 内存地址递增:启用;外设地址递增:禁用;

    • 模式:要是是持续采样(例如定时器触发连续采样),选择Circular(循环)一次性采集选择就是模式;若Normal

    • 启用半传/全传中断(根据需要)。

  • 把 ADC 的 DMA 请求打开(告诉 ADC 在 EOC 时发出 DMA 请求,让 DMA 自动搬运数据)。

  • 启动 ADC(与触发器)与 DMA 通道:在正确的时序下启动 DMA,之后启动 ADC & 触发(倘若用定时器触发,启动定时器)。

  • 在中断/任务中处理素材

    • 如果使用循环模式并启用了半传/全传中断:在半传中断中处理缓冲区前半,在全传中断中处理后半;处理完后继续让 DMA 循环写入。

    • 要是使用普通模式:在传输完成中断中处理整个缓冲区并可重新配置/重启 DMA。

下一章节将详细讲解代码部分。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/984744.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

北京上门收酒

家里藏着几瓶年份茅台,是多年前长辈留下的念想,如今想变现却不知行情;朋友送的进口红酒堆在酒柜落灰,自己不爱喝,拿去烟酒店问价总被压得离谱;企业年会剩余的高端白酒,处理起来既怕麻烦又担心被骗——在京城,不…

暗黑2重制版(Diablo II Resurrected)——自制地图高速公路简化版 - dark

没有添加新装备新怪物新字符串,只是把一些场景串并到一起,方便快捷玩,这是简化版,act1只有女伯爵和安姐,act2只有大虫子,act3只有劳模,act5老尼以及最后5个场景。零、本MOD教程的视频 ------------------------…

Nat Commun | DNALONGBENCH:基因组学长距离DNA预测任务的综合基准测试套件

研究背景 基因组DNA序列是生命的蓝图,指导着细胞复杂性的发展。虽然蛋白质编码区直接编码生物化学功能,但真核生物基因组的大部分由非编码序列组成。这些非编码区域包含各种调控元件(如启动子、增强子),它们像指挥…

rllm中的推理流程

打印一条推理路径 在上文中,我们跑通了rllm框架,下面,让我们仔细分析一下examples/math_tool/run_math_with_tool.py中的内部过程。 run_math_with_tool.py的大致代码如下:agent_args = {"tools": [&quo…

第2天敏捷冲刺 - Helen

第二天敏捷冲刺博客 一、作业基本信息这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/作业要求链接 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/…

OOP-实验4

OOP-实验4 一、任务1 1、源代码GradeCalc.cpp #include <algorithm> #include <array> #include <cstdlib> #include <iomanip> #include <iostream> #include <numeric> #includ…

成群结队-冲刺日志(阶段一)

成群结队-冲刺日志(阶段一)这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/202501SoftwareEngineering作业要求 https://edu.cnblogs.com/campus/fzu/202501SoftwareEngineering/homework/14586团队名称 成…

re笔记4

polarctf 逆向康师傅 没有查壳直接扔到idaf5到main函数 `int __cdecl main_0(int argc, const char **argv, const char **envp) { size_t i; // [esp+D0h] [ebp-84h] char Str2[60]; // [esp+DCh] [ebp-78h] BYREF ch…

成群结队-冲刺日志(阶段二)

成群结队-冲刺日志(阶段二)这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/202501SoftwareEngineering作业要求 https://edu.cnblogs.com/campus/fzu/202501SoftwareEngineering/homework/14586团队名称 成…

2025年12月上海降血糖咨询公司最新推荐,技术实力与市场口碑深度解析!

高血糖及相关代谢疾病已成为威胁公众健康的主要慢性问题,传统控糖模式常陷入 “反复波动、终身依赖” 的困境,专业降血糖服务机构的选择愈发关键。本次推荐基于权威代谢健康协会牵头的 2025 年度专项测评,严格遵循 …

成群结队-冲刺日志(阶段三)

成群结队-冲刺日志(阶段三)这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/202501SoftwareEngineering作业要求 https://edu.cnblogs.com/campus/fzu/202501SoftwareEngineering/homework/14586团队名称 成…

POLIR-Logic-逻辑学: Propositional→FOL→SOL→HOL→Categoties

在逻辑和数学上, Propositional Logic → FOL(First-Order Logic) → SOL(Second-Order Logic) → HOL(Higher-Order Logic) → Categories(类型论/范畴论) 二阶逻辑是一阶逻辑的扩展,一阶逻辑是命题逻辑的扩展[注…

集成光子技术革新AI数据中心,提升能效与带宽

一家专注于为AI基础设施开发集成光子系统级芯片解决方案的公司宣布完成新一轮融资。其核心技术通过将激光器、光电二极管和调制器集成在单一芯片上,显著提升带宽密度、降低功耗,助力减少AI数据中心的碳排放。Scintil…

Nat Methods | Helixer:结合深度学习与隐马尔可夫模型的真核生物基因从头预测工具-获取蛋白质序列

研究背景 随着基因组测序技术的飞速发展,海量的基因组数据以前所未有的速度涌现。然而,要从这些原始的DNA序列中解读出生命的蓝图,精确地识别出基因的位置和结构(即基因注释)是至关重要的一步。传统基因预测方法,…

STM32F103ZET6开发板串口只发不收问题解决 - PC2005

本文记录了 STM32F103ZET6 开发板串口 “只发不收” 问题的排查与解决过程。调试中发现,基于寄存器配置的 USART1 代码在 STM32F103C8T6 最小系统板上可正常双向通信,但在 STM32F103ZET6 开发板上仅能发送数据,无法…

P4390 [BalkanOI 2007] Mokia 摩基亚

简单二维数组,范围显然接受不了。简单 cdq。 矩阵和,考虑二维前缀和差分,容易将一个 4-side 询问拆成四个 2-side 询问,于是就是三维偏序直接上 cdq。 #include<bits/stdc++.h> #include<ext/pb_ds/assoc…

Nat Commun | DNA大语言模型“大阅兵”:一项全面的基准研究为基因组学任务导航

引言 近年来,以GPT-4为代表的基础模型(Foundation Models),或称大语言模型(LLMs),通过在海量文本数据上进行自监督预训练,学会了理解和生成人类语言的强大能力,并彻底改变了自然语言处理领域。这一成功范式迅…

大神

啊我的娃