细说STM32F407单片机2个ADC使用DMA同步采集各自的1个输入通道的方法
目录
一、示例说明
二、工程配置
1、RCC、DEBUG、CodeGenerator
2、USART6
3、TIM3
(1)Mode
(2)参数设置
(3) TRGO
(4)ADC1_IN0
1)ADCs_Common_Settings
2) ADC_Settings
3)ADC_Regular_ConversionMode
(5)ADC2_IN1
1)ADCs_Common_Settings
2) ADC_Settings
3)ADC_Regular_ConversionMode
(6)DMA
(7)NVIC
二、软件设计
三、运行与调试
本文将通过一个实例测试 STM32F407ZGT6使用2个ADC模块并通过DMA模式同步采集各自的1个通道的方法。
当一个ADC只有一个输入通道,在转换结束后可以及时读出结果数据寄存器的内容。
当一个ADC规则转换组有多个通道时,应该使用扫描转换模式(Scan Conversion Mode),ADC在转换完一个通道后立刻转换下一个通道,直到规则组内的通道序列转换完。并启用DMA模式。
当多个ADC规则转换组各有一个(多个)通道时,应选择诸如Dual regular simultaneous mode only的选项,并开启DMA模式。如果某个ADC规则转换组只有一个通道,无须开启Scan Conversion Mode,如果某个ADC规则转换组不只有一个通道,还须同时开启Scan Conversion Mode。
一、示例说明
本文将继续使用旺宝红龙开发板STM32F407ZGT6 KIT V1.0。开发板1个可调电位器的模拟信号输入到PF8引脚,该管脚复选为ADC3_IN6。但是STM32F407**Datasheet规定,只允许ADC1和ADC2可以组合成二重ADC功能。否则,比如,如果设置了ADC1和ADC3,或者ADC2和ADC3,那么在ADCs_Common_Settings组里根本看不到诸如Dual regular simultaneous mode only这样的选项。

只能配置ADC1和ADC2完成二重ADC同步采集功能,这里配置为ADC1_IN0(PA0)和ADC2_IN1(PA1),为了在开发板上获得ADC通道的数据输入,可以用导线把PF8依次连接到PA0和PA1上,这样,就使得ADC1_IN0和ADC2_IN1通道有了数据输入。当然也可以配置ADC1和ADC2采集片内内部参考信号。
使用ADC1和ADC2同步采集两个通道的信号,双重ADC同步采集时(Dual regular simultaneous mode only),不能采集同一个通道;但如果ADC1和ADC2复选到同一个管脚上,并采集相同通道数据,则应选择仅双正交交织模式(Dual regular interleaved mode only)。
多重ADC模式只能采用DMA方式传输数据。
二、工程配置
1、RCC、DEBUG、CodeGenerator
- RCC:外部晶振25MHz,HCLK=168MHz,PCLK1=42MHz,PCLK2=84MHz;
- DEBUG:Serial Wire;
- CodeGenerator:勾选☑Generate peripheral initialization as a pair of '.c/.h' files per peripheral
2、USART6
配置PG9、PG14为USART6,全部参数默认;
3、TIM3
(1)Mode
选择internal clock。
(2)参数设置
- 预分频因子:49999。
- 计数器方向:Up.
- 计数器周期:499.
- 内部时钟分频:No.
- 自动重装载:启用。
(3) TRGO
- MSM bit:Disable。
- Trigger Event:Update Envent。
(4)ADC1_IN0
1)ADCs_Common_Settings
- Mode:选择Dual regular simultaneous mode only
- DMA Access Mode:DMA access mode
- Delay between 2 sampling phases:25Cycles
2) ADC_Settings
- Clock Prescaler:PCLK2 divided by 4
- Resolution:12 bits(15 ADC Clock cycles)
- Data Alignment:Right alignment
- Scan Conversion Mode:Disable
- Continuous Conversion Mode:Disabled. 启用连续转换模式后,ADC结束一个转换后立即启动一个新的转换。启用后数据更新的频率会快很多。
- Discontinuous Conversion Mode:Disabled. 这种模式一般用于外部触发时,将一组输入通道分为多个短的序列,分批次转换。
- DMA Continuous Requests:Enabled
- End Of Conversion Selection:EOC flag at the end of single channel conversion
3)ADC_Regular_ConversionMode
- Number Of Conversion:1
- External Trigger Conversion Source:Timer 3 Trigger Out event
- External Trigger Conversion Edge:Trigger detecton on the rising edge
- Rank1:通道0,采样周期15个周期;

(5)ADC2_IN1
1)ADCs_Common_Settings
- Mode:选择Dual regular simultaneous mode only
- DMA Access Mode:DMA access mode
- Delay between 2 sampling phases:25Cycles
2) ADC_Settings
- Clock Prescaler:PCLK2 divided by 4
- Resolution:12 bits(15 ADC Clock cycles)
- Data Alignment:Right alignment
- Scan Conversion Mode:Disable
- Continuous Conversion Mode:Disabled.
- Discontinuous Conversion Mode:Disabled.
- DMA Continuous Requests:Enabled
- End Of Conversion Selection:EOC flag at the end of single channel conversion
3)ADC_Regular_ConversionMode
- Number Of Conversion:1
- External Trigger Conversion Source:没有这个选择项了
- External Trigger Conversion Edge:没有这个选择项了
- Rank1:通道1,采样周期15个周期;

(6)DMA
启用ADC1和ADC2。设置为Circular模式,数据长度设置为word。

(7)NVIC
设置USART6全局中断,抢占式优先级为1。因为文章中使用了其中断功能;
默认设置 DMA2 Stream0和 DMA2 Stream2全局中断,抢占式优先级为1。
设置ADC123的全局中断,抢占式优先级为1。
TIM3的全局中断开不开启都可以,无关紧要,因为程序中使用的时计数器的Update Envent,而这个事件的产生并不依赖于TIM3的全局中断。

二、软件设计
使用STM32CubeIDE建立本实例的软件工程,只需要修改main.c。其余的程序IDE自动生成。
/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */
/* USER CODE BEGIN PV */
#define BATCH_DATA_LEN 1 // Dual ADC captures 32-bit data stored at once
uint32_t dmaDataBuffer[BATCH_DATA_LEN]; // DMA Buffer
/* USER CODE END PV */
/* USER CODE BEGIN 2 *///菜单设计uint8_t hello1[] = "Demo14_4_DualADC:测试二重ADC同步采集\r\n";HAL_UART_Transmit(&huart6,hello1,sizeof(hello1),500); //阻塞模式HAL_Delay(10);uint8_t hello2[] = "多ADC同步采集需启用DMA模式。\r\n";HAL_UART_Transmit_IT(&huart6,hello2,sizeof(hello2)); //非阻塞模式HAL_Delay(10);printf("对于STM32F407,只可以ADC1和ADC2组合为二重ADC,并应该启用使用DMA模式。\r\n");printf("当规则转换组有多个通道时,还应该使用扫描转换模式(Scan Conversion Mode),\r\n");printf("MCU管脚PF8,是外部模拟量输入通道,接可调电阻产生的可变电压。\r\n");printf("ADC1_IN0对应MCU管脚PA0,用导线把PA0连接PF8。\r\n");printf("ADC2_IN1对应MCU管脚PA1,用导线把PA1连接PF8。\r\n\r\n");HAL_ADCEx_MultiModeStart_DMA(&hadc1, dmaDataBuffer, BATCH_DATA_LEN); // Start ADC1HAL_ADCEx_MultiModeStart_DMA(&hadc2, dmaDataBuffer, BATCH_DATA_LEN); // Start ADC2HAL_TIM_Base_Start(&htim3); // Start TIM3/* USER CODE END 2 */
/* USER CODE BEGIN 4 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{uint32_t Volt;uint32_t adcValue=dmaDataBuffer[0]; // Data for ADC2 and ADC1uint32_t ADC1_val = adcValue & 0x0000FFFF; // The lower 16 bits are the data of ADC1Volt=3300*ADC1_val;Volt=Volt>>12;printf("ADC1 = %ld\r\n",Volt );uint32_t ADC2_val = adcValue & 0xFFFF0000; // The higher 16 bits are the data of ADC2ADC2_val = ADC2_val>>16;Volt=3300*ADC2_val; // mV unitVolt=Volt>>12; // divided by 2^12printf("ADC2 = %ld\r\n",Volt );
}//串口打印
int __io_putchar(int ch)
{HAL_UART_Transmit(&huart6, (uint8_t*)&ch, 1, 0xFFFF);return ch;
}
/* USER CODE END 4 */
三、运行与调试
首次下载或运行,最先显示在串口助手上的是程序的菜单设计:

之后,连续显示ADC1_IN0和ADC2_IN1采集到的数据,因为二重ADC的各自的数据通道采用默认设置的相同的触发信号,因此是同步采集。

相关文章:
细说STM32F407单片机2个ADC使用DMA同步采集各自的1个输入通道的方法
目录 一、示例说明 二、工程配置 1、RCC、DEBUG、CodeGenerator 2、USART6 3、TIM3 (1)Mode (2)参数设置 (3) TRGO (4)ADC1_IN0 1)ADCs_Common_Settings 2&a…...
[python脚本]论文1.(一)CPU/内存数据分析和分组
CPU 收集到的CPU数据,格式如下: 由于这里6个数据为一组来收集latency的数据以及各个分位值的数据,而本质上每一行都是一次完整的测试,因此这里将这个csv文件分为两个文件,第一个是和latency相关的,将6条数…...
一周学会Flask3 Python Web开发-Jinja2模板基本使用
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 我们平台开发web系统,必须用到网页,单纯的静态网页无法满足我们的需求。我们可以使用模版引擎技术&am…...
基于大数据爬虫的旅游分析可视化平台设计和实现
# 当数据蜘蛛侠遇上旅游百事通:一场说走就走的技术狂欢 ## 引言:当旅游攻略遇上大数据,世界突然变得透明 去年国庆假期,小王在黄山之巅挤成"人肉三明治"时突然顿悟——如果能提前知道哪个景点即将爆满,哪个…...
sql调优之数据库开发规范
数据库 数据库开发规范 也可用于PostgreSQL以及兼容PG的数据库 通用命名规则 【强制】 本规则适用于所有对象名,包括:库名、表名、列名、函数名、视图名、序列号名、别名等。 【强制】 对象名务必只使用小写字母,下划线,数字&…...
《操作系统 - 清华大学》8 -3:进程管理:进程特点
深入剖析进程的特点、实现及进程控制块 一、进程的特点 (一)动态性 进程具有明显的动态性。它可以被动态创建,在执行过程中会发生状态切换,从一个状态转变为另一个状态。当所有任务执行完毕后,进程还会结束运行。整…...
Java 大视界 -- 总结与展望:Java 大数据领域的新征程与无限可能(96)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
前端ES面试题及参考答案
目录 let/const 与 var 的区别?TDZ 是什么? 箭头函数与普通函数的区别?箭头函数能否作为构造函数? 模板字符串的嵌套表达式和标签模板用法? 解构赋值的应用场景及对象 / 数组解构差异? 函数参数默认值的生效条件及暂时性死区问题? 展开运算符(...)在数组 / 对象中…...
【微服务】深入解析spring aop原理
目录 一、前言 二、AOP 概述 2.1 什么是AOP 2.2 AOP中的一些概念 2.2.1 aop通知类型 2.3 AOP实现原理 2.3.1 aop中的代理实现 2.4 静态代理与动态代理 2.4.1 静态代理实现 三、 jdk动态代理与cglib代理 3.1 jdk动态代理 3.1.1 jdk动态代理模拟实现 3.2 CGLIB 代理…...
计算机网络之路由协议(OSPF路由协议)
一、定义与分类 OSPF是一种内部网关协议(IGP),也属于链路状态路由协议。它使用链路状态路由算法,在单一自治系统(AS)内部工作。适用于IPv4的OSPFv2协议定义于RFC2328,而RFC5340则定义了适用于I…...
DeepSeek等LLM对网络安全行业的影响
大家好,我是AI拉呱,一个专注于人工智领域与网络安全方面的博主,现任资深算法研究员一职,兼职硕士研究生导师;热爱机器学习和深度学习算法应用,深耕大语言模型微调、量化、私域部署。曾获多次获得AI竞赛大奖,拥有多项发明专利和学术论文。对于AI算法有自己独特见解和经验…...
Ai沟通学习记录三
代理模式 简单的理解可以任务角色扮演。例如:“你是伟大的画家”,帮我构思一个山水花的描述词。 你是个眼科医生,我最近眼干燥,怎么弄。 等等。 举例环节 输入: 如果你是熊。看到一个人,蹲下来捡石头。 你…...
pikachu靶场搭建教程
需要的东西 phpStudy: 链接: https://pan.baidu.com/s/1fJ-5TNtdDZGUf5FhTm245g 提取码:0278 pikachu-master: Github链接:https://github.com/zhuifengshaonianhanlu/pikachu 链接: https://pan.baidu.c…...
游戏引擎学习第119天
仓库:https://gitee.com/mrxiao_com/2d_game_3 上一集回顾和今天的议程 如果你们还记得昨天的进展,我们刚刚完成了优化工作,目标是让某个程序能够尽可能快速地运行。我觉得现在可以说它已经快速运行了。虽然可能还没有达到最快的速度,但我们…...
数据结构与算法再探(七)查找-排序
查找 一、二分查找 二分查找是一种高效的查找算法,适用于在已排序的数组或列表中查找特定元素。它通过将搜索范围逐步减半来快速定位目标元素。理解二分查找的“不变量”和选择左开右闭区间的方式是掌握这个算法的关键。 二分查找关键点 不变量 在二分查找中&a…...
从零开始制作一个漂亮的悬浮按钮
0.1血版 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head> &l…...
Win11更新系统c盘爆满处理
1.打开磁盘管理 2.右击c盘选择属性,进行磁盘管理,选择详细信息。 3.选择以前安装的文件删除即可释放c盘空间。...
element ui的time时间和table表格
<el-date-picker v-model"value1" align"right" type"date" placeholder"选择日期" value-format"yyyy-MM-dd" change"changeDate"></el-date-picker><el-date-picker v-model"datetime"…...
从零实现机器人自主避障
1. 编译工具安装 sudo apt update sudo apt install python3-catkin-pkg python3-rosdep python3-rosinstall-generator python3-wstool python3-rosinstall build-essential sudo rosdep init rosdep update2. 构建节点 mkdir -p ~/ros2_ws/src cd ~/ros2_ws ros2 pkg creat…...
《筑牢元宇宙根基:AI与区块链的安全信任密码》
在科技浪潮汹涌澎湃的当下,元宇宙已不再是科幻作品中的遥远构想,而是逐渐步入现实,成为人们热议与探索的前沿领域。从沉浸式的虚拟社交,到创新的数字经济模式,元宇宙的发展前景广阔,潜力无限。但要让元宇宙…...
深入探索 DeepSeek 在数据分析与可视化中的应用
在数据驱动的时代,快速且准确地分析和呈现数据对于企业和个人都至关重要。DeepSeek 作为一款先进的人工智能工具,凭借其强大的数据处理和可视化能力,正在革新数据分析的方式。 1. 数据预处理与清洗 在进行数据分析前,数据预处理…...
【Nacos】从零开始启动Nacos服务(windows/linux)
文章目录 前言前置条件官方网址一、Nacos下载1.1 选择Nacos版本1.2 下载 二、解压2.1 解压到某个文件夹 三、 启动3.1 方式一:直接使用命令启动3.1.1 进入bin文件夹3.1.2 进入命令行工具3.1.3 执行命令 3.2 方式二:修改配置文件后启动3.2.1 修改启动脚本…...
即插即用Transformer、扩散模型、机器人规划、长文本检索增强生成 | Big Model Weekly 第57期...
点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 01 ProTransformer: Robustify Transformers via Plug-and-Play Paradigm 近年来,基于Transformer的架构在机器学习的各个领域占据了主导地位。本文介绍了一种新颖的鲁棒性注意力机制,旨…...
FPGA DSP:Vivado 中带有 DDS 的 FIR 滤波器
本文使用 DDS 生成三个信号,并在 Vivado 中实现低通滤波器。低通滤波器将滤除相关信号。 介绍 用DDS生成三个信号,并在Vivado中实现低通滤波器。低通滤波器将滤除较快的信号。 本文分为几个主要部分: 信号生成:展示如何使用DDS&am…...
DeepSeek各模型现有版本对比分析
文章目录 一、基础模型系列:V1 到 V3 的演进二、专用模型系列:推理与多模态三、版本选型与商业化趋势 DeepSeek作为最近特别火爆的模型,本文将对DeepSeek现有的主要版本进行对比分析,涵盖参数规模、训练数据、功能改进、应用场景和性能表现等…...
ASP.NET Core Clean Architecture
文章目录 项目地址一、项目主体1. CQRS1.1 Repository数据库接口1.2 GetEventDetail 完整的Query流程1.3 创建CreateEventCommand并使用validation 2. EFcore层2.1 BaseRepository2.2 CategoryRepository2.3 OrderRepository 3. Email/Excel导出3.1 Email1. Email接口层 4. 定义…...
紫光同创开发板使用教程(二):sbit文件下载
sbit文件相当于zynq里面的bit文件,紫光的fpga工程编译完成后会自动生成sbit文件,因工程编译比较简单,这里不在讲解工程编译,所以我这里直接下载sbit文件。 1.工程编译完成后,可以看到Flow列表里面没有报错,…...
【Python爬虫(58)】从0到1:Scrapy实战爬取大型新闻网站
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取ÿ…...
1. 自定义组件基础
相关资源: 📎day10 图片素材.zip 1. 自定义组件基础 概念:在ArkUI中由框架直接提供的称为系统组件 -> Column,Button等,由开发者定义的称为自定义组件 作用:自定义组件可以对 UI和业务逻辑进行封装&…...
MySQL MHA 部署全攻略:从零搭建高可用数据库架构
文章目录 1.MHA介绍2.MHA组件介绍3.集群规划4.服务器初始化5.MySQL集群部署5.1 安装MySQL集群5.2 配置一主两从5.3 测试MySQL主从5.4 赋予MHA用户连接权限 6.安装MHA环境6.1 安装MHA Node6.2 安装MHA Manager 7.配置MHA环境8.MySQL MHA高可用集群测试8.1 通过VIP连接MySQL8.2模…...
