“DMA ADC” 指的是 利用DMA(直接存储器访问)技术来传输ADC(模数转换器)采集到的数据 的一种方式。
要理解它,需要先了解这两个组成部分:
-
ADC (Analog-to-Digital Converter, 模数转换器):
- 这是硬件模块,存在于微控制器(MCU)、单片机(SoC)或专门的ADC芯片中。
- 作用: 将连续变化的模拟电压或电流信号(例如来自传感器、麦克风、温度探头等的信号)转换成离散的数字值(二进制代码),这样处理器(CPU)才能理解和处理这些信号。
- 过程: ADC采样模拟信号,量化其幅度,然后输出对应的数字编码结果(通常存储在ADC的数据寄存器中)。
-
DMA (Direct Memory Access, 直接存储器访问):
- 这是微控制器/处理器中的一种硬件功能。
- 作用: 允许外设(如ADC)直接与内存(RAM)交换数据,而不需要CPU(中央处理器)的全程参与和控制。
- 优势: 极大减轻了CPU的负担。CPU只需要在初始化时配置好DMA传输(告诉DMA从哪里取数据、存到哪里、传输多少数据),之后DMA就能在后台自动完成数据搬运工作。传输完成后,DMA通常会通过中断通知CPU。这使得CPU可以腾出时间去执行其他更重要的计算任务,或者在低功耗模式下休眠,从而提高系统的整体效率和实时性。
“DMA ADC” 组合起来意味着什么?
- 目标: 高效、实时地读取和处理ADC转换得到的大量数据。
- 问题: 如果没有DMA,每次ADC完成一次转换(产生一个数据点),CPU都必须立即中断手头的工作,去读取ADC数据寄存器里的值,然后把它存放到内存(如数组)中。如果ADC采样速度很快(例如每秒采样成千上万次),CPU就会被频繁中断,忙于搬运数据,导致无法有效执行其他应用程序代码,系统性能下降。
- 解决方案: 使用DMA。
- 工作流程:
- CPU初始化ADC(设置采样通道、采样率、转换精度等)。
- CPU初始化DMA控制器(告诉DMA源地址是ADC的数据寄存器,目标地址是内存中的某个数组或缓冲区,传输数据量(比如数组长度)、传输模式(单次、循环等)以及触发源(由ADC转换完成事件触发))。
- 启动ADC转换(可能是连续转换模式)。
- 一旦ADC完成单个转换,其转换完成标志会被置起(触发DMA)。
- DMA硬件(不是CPU) 自动探测到这个触发信号。
- DMA硬件 自动将ADC数据寄存器中新产生的那个转换结果值(数字量),直接复制到指定的内存位置(数组或缓冲区)。
- 这个过程在每次ADC转换完成时自动发生,直到DMA传输达到预设的数据量(例如填满一个缓冲区)。
- 当DMA完成预设数量的传输(如缓冲区填满一半或全部填满)时,它可以产生一个中断通知CPU。
- CPU只在此时(缓冲区数据准备好后)才被中断一次,然后可以开始处理内存缓冲区中累积的多个ADC数据点(例如进行滤波、计算、存储、发送等)。
为什么使用DMA ADC?
- 极大降低CPU开销: CPU几乎不需要参与数据传输过程,节省大量CPU时间用于核心算法处理。
- 提高实时性和吞吐量: 特别适合高速、连续的数据采集应用(如音频处理、高速数据采集卡、振动分析、通信解调等),能够跟得上ADC最快采样速率。
- 减少延迟: 数据从ADC寄存器到内存的传输延迟更低、更可预测。
- 提高系统效率: CPU可以更长时间处于低功耗模式或专注于复杂计算。
- 简化编程: 程序员只需专注于配置好DMA和ADC,然后处理缓冲区中的数据包即可,不需要编写繁琐的、频繁读取ADC寄存器的代码。
总结:
“DMA ADC” 是一种利用DMA硬件自动搬运ADC转换结果到RAM的技术。它解决了高速ADC数据采集时CPU被频繁中断搬运数据的问题,显著提高了系统的数据采集效率、实时性和CPU利用率,是嵌入式系统、数据采集系统中非常核心和常用的技术组合。
基于APM32F411 DMA_ADC Handler模式分析及解决
最近在编写DMA_ADC例程的过程中出现了一个中断配置的问题,在ADC采集过程中,结合手册进行ADC连续转换模式配置采集,手册上给出需要进行中断配置的信息,但是真实情况不需要进行中断配置也可以进行
2025-06-24 14:30:37
STM32多通道DMA—ADC采样 精选资料推荐
title: STM32多通道DMA—ADC采样tags: STM32date: 2019-02-26 22:30:00阿正的个人站学习笔记–STM32多通道DMA—ADC采样资料来源于杜洋工作室
xiongcanfei
2021-08-04 07:19:31
STM32G070 DMA ADC通道数据错位
STM32G070 配置DMA ADC转换。想通过软件定时触发连续转换一个序列后停止。测试时发现采样时间设置快了会出现ADC通道数据错位的现象。查看编程手册,才发现问题,厂家是认真的吗,ADC连续采样还有啥意义。求解惑
_b25
2023-03-01 16:56:49
如何stm32Cubex和ENV配置并使用DMA+ADC以及DMA+UART?
如何stm32Cubex和ENV配置并使用DMA+ADC以及DMA+UART?
其实znvm
2022-11-24 11:38:49
DMA ADC不会复位缓冲区
大家好,我想使用DSPIC33 EP512MU810读取几个模拟输入,并产生PWM输出信号。为了减少CPU负载,我想使用DMA直接将ADC值写入SRAM。没有DMA,ADC和PWM工作没有任何问题
nckznc
2019-08-22 12:10:12
在STM32上如何通过DMA+ADC的模式快速采集直流无刷电机电流?
在STM32上如何通过DMA+ADC的模式快速采集直流无刷电机电流?其实现代码该怎样去编写?
比吥匕卟
2021-07-20 07:36:50
如何利用STM32单片机去实现DMA+ADC+UART功能呢
如何利用STM32单片机去实现DMA+ADC+UART功能呢?STM32F103单片机+ULN2003是怎样驱动直流电机的?
刀马旦
2021-12-14 06:47:45
有什么办法可以让DMA与ADC和TouchGFX一起运行吗?
我有一块带有 STM32H7 和 TouchGFX 的定制板。我正在使用中断触发的 DMA 对我的 ADC 进行数据采样。在没有启用 DCache 的情况下,它运行良好。但是如果 DCache 被禁
阿什顿信道
2023-01-03 09:34:01
基于极海APM32F103的USB键盘与虚拟串口例程
最近在编写DMA_ADC例程的过程中出现了一个中断配置的问题,在ADC采集过程中,结合手册进行ADC连续转换模式配置采集,手册上给出需要进行中断配置的信息,但是真实情况不需要进行中断配置也可以进行
2025-08-16 09:20:51
esp-idf_v4.4.2版DMA ADC例程问题求解
adc_digi_init_config_t adc_dma_config = {.max_store_buf_size = 1024,.conv_num_each_intr = TIMES
zhongnian
2023-03-06 07:24:46
基于STM32F103ZET6的简单功能应用
本文是基于STM32F103ZET6的简单功能应用。主要应用了DMA和ADC,定时器,串口等通用的简单外设和通信。主要功能是:用定时器定时10S时,用ADC采集MQ-2的模拟量数据,最后用串口DMA发送到上位机部分,实现采集数据。
ningkui
2021-12-10 06:59:28
STM32F103RC的相关资料分享
STM32F103RC DMA ADC 温度,电压采样#include "stm32f10x.h"#include"stm32f10x_adc
wjwierw
2021-12-03 08:29:26
dSPIC33CKxx单片机AD+定时器触发
已实现:1.不带DMA的ADC采样配制成PWM下定时器模式,设置SCCP1触发ADC采样,无法触发ADC采样,但是能进SCCP1定时器。问题是: 1.配置SCCP1定时器中断触发ADC采样,需要注意哪些问题?
307473207
2019-05-29 21:24:44
如何让uint16使用dma的adc窗口缓冲区?
嗨,大家好,我想创建一个静态的ADC窗口,专门缓冲1024个2字节的单词,但不滑动。我认为DMA将是最有效的方法。我假设必须使用多个TD,因为ADCySAMPLE()只一次获得一个16位的样本,但是
shaoye88
2019-09-17 11:10:09
PIC单片机的DMA和ADC相关资料分享
1、DMA{ RCC->APB2RSTR |= (1
ncvttwer
2019-07-22 22:35:41
带DMA的STM32H723ZG模数转换器,数据宽度为什么要设置成32位?
我正在使用 STM32H723ZG MCU,并希望通过 DMA 使用 ADC 扫描转换。我可以实现我想要的,只有一件事我不完全理解与之相关。我正在使用最大分辨率为 12 位的 ADC3。根据MCU
liese
2022-12-05 11:45:48
有没有同时使用ADC DMA和SPI DMA的示例?
我在一个项目中使用 S32K144 MCU,需要在 DMA 模式下启用 SPI 以便 S32K144 和另一个芯片之间的通信,以及带有 DMA 的 ADC 以监控电压。ADC 和 SPI 的驱动程序
DengQilong
2023-04-18 08:39:03
可以同时使用DMA-ADC1进行连续转换和使用ADC2进行单次转换吗?
我一直在寻找一种方法,使用 DMA 连续采样 ADC 以测量电源电流和电压,然后使用另一个 ADC 读取温度,可能每秒只读取一次。我已经阅读了 STM32 ADC 模式,但不明白我的应用程序是否可行
dfgsdf
2023-01-31 06:18:22
ADC—单通道DMA到多通道DMA ADC采集修改事项
1、 使能通道IO,因为从单通道到多通道,需要添加规则转换通道数,故需要使能扫描模式,否则只能扫描第一个通道;2、 DMA模式配置需修改为循环传输模式,否则只转换一次;3、 开启ADC规则转换通道;
hahaabc123
2023-03-08 10:58:27
STM32Cube_FW_WB_V1.3.0的DMA + ADC不工作是为什么?如何解决?
魔方IDE 1.1.0STM32Cube_FW_WB_V1.3.0试图使 DMA 传输 ADC 结果。我将代码放在 main() 中的 MX_..._Init() 之后和 while(1
lotusp
2022-12-15 07:24:53
如何在STM32H750VBT6上配置和读取不带DMA的ADC?
我正在使用 MCU STM32H750VBT6,我正在尝试配置 ADC1 以从传感器获取读数,但我没有使用 DMA,只是 DMA 没有向我返回正确的值,它会给我一个示例代码,说明如何读取 ADC1 通道?还使用了哪些设置?
风动影随
2023-01-12 08:22:54
stm32单片机例程相关资料下载
在这篇文章中将自己上传的资源做一个下载链接的目录方便查找下载STM32单片机实现DMA+ADC+UART功能STM32F103单片机+ULN2003驱动直流电机STM32F103单片机
孔妞妞
2021-11-26 06:27:16
长时间PHY操作错误后,pic32以太网未重新连接怎么办
H/W:Pic32以太网启动器套件2Harmony1.6和MplabX 3.1softer正在运行:tcpip clilent、httpserver、nvm驱动程序、spi、DMA/ADC驱动程序我
lulijian
2020-05-12 09:59:08
STM32F4芯片采用ADC+DMA+TIM方式采样AD数据如何操作呢?
我是新手小白,我有裸机调试好的可以实现ADC+DMA+TIM采集电压电流数据并做FFT然后显示在液晶上的程序,现在想实现多线程操作,把采集数据、FFT变换和显示数据分成三个线程操作。我现在移植好了
天暗下来
2023-02-24 13:46:02
STM32F4芯片如何实现ADC+DMA+TIM方式采样AD数据呢
我是新手小白,我有裸机调试好的可以实现ADC+DMA+TIM采集电压电流数据并做FFT然后显示在液晶上的程序,现在想实现多线程操作,把采集数据、FFT变换和显示数据分成三个线程操作。我现在移植好了
学生物的程序猿
2022-10-13 10:39:18
STM32L412KB ADC采样右移问题如何解决?
我正在使用带 DMA 的 ADC。在我的初始化代码中,我做了这样的 ADC 校准程序:HAL_ADCEx_Calibration_Start(&hadc1, ADC
xiongcanfei
2023-01-11 07:49:33