当前位置: 首页 > news >正文

细说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 &#xff08;1&#xff09;Mode &#xff08;2&#xff09;参数设置 &#xff08;3&#xff09; TRGO &#xff08;4&#xff09;ADC1_IN0 1&#xff09;ADCs_Common_Settings 2&a…...

C# 将非托管Dll嵌入exe中(一种实现方法)

一、环境准备 电脑系统:Windows 10 专业版 20H2 IDE:Microsoft Visual Studio Professional 2022 (64 位) - Current 版本 17.11.4 其他: 二、测试目的 将基于C++创建DLL库,封装到C#生成的exe中。 一般C++创建的库,在C#中使用,都是采用DllImport导入的,且要求库处…...

完美解决:.vmx 配置文件是由 VMware 产品创建,但该产品与此版 VMware Workstation 不兼容

参考文章&#xff1a;该产品与此版 VMware Workstation 不兼容&#xff0c;因此无法使用 问题描述 当尝试使用 VMware Workstation 打开别人的虚拟机时&#xff0c;可能会遇到以下报错&#xff1a; 此问题常见于以下场景&#xff1a; 从其他 VMware 版本&#xff08;如 ESX…...

使用大语言模型对接OA系统,实现会议室预定功能

随着人工智能技术的不断进步&#xff0c;越来越多的企业开始借助 AI 助手来提高工作效率&#xff0c;尤其是在日常事务的自动化处理中。比如&#xff0c;在许多公司里&#xff0c;会议室的预定是一个常见且频繁的需求&#xff0c;通常需要员工手动检查空闲时间并做出选择。而通…...

Ryu控制器:L2交换功能实现案例

基于 Ryu控制器 在 VM1--OVS--VM2 的简单拓扑中实现流量自动下发&#xff08;流表动态安装&#xff09;的完整案例。通过该案例&#xff0c;当VM1与VM2首次通信时&#xff0c;Ryu控制器会动态学习路径并下发流表&#xff0c;后续流量将直接由交换机转发&#xff0c;无需控制器介…...

动手学深度学习2025.2.23-预备知识之-线性代数

3.线性代数 &#xff08;1&#xff09;向量维数和张量维数的区别&#xff1a; (2)普通矩阵乘法&#xff1a; 要求左矩阵的列数等于右矩阵的行数 import torch ​ # 创建两个矩阵 A torch.tensor([[1, 2], [3, 4]], dtypetorch.float32) B torch.tensor([[5, 6], [7, 8]], d…...

登录-07.JWT令牌-登录后下发令牌

一.思路 我们首先完成令牌生成。 在响应数据这一块 该响应数据是一个标准的Result结构&#xff0c;其中"data"的值就是一个JWT令牌。因此我们只需要将生成的JWT令牌封装在Result当中然后返回给前端即可。 备注是给前端看的&#xff0c;不用管。以后我们做校验时&…...

机器学习实战(7):聚类算法——发现数据中的隐藏模式

第7集&#xff1a;聚类算法——发现数据中的隐藏模式 在机器学习中&#xff0c;聚类&#xff08;Clustering&#xff09; 是一种无监督学习方法&#xff0c;用于发现数据中的隐藏模式或分组。与分类任务不同&#xff0c;聚类不需要标签&#xff0c;而是根据数据的相似性将其划…...

【数据序列化协议】Protocol Buffers

一、为什么需要序列化&#xff1f; 数据跨平台/语言交互&#xff1a; 不同编程语言&#xff08;如 Java、Python、Go&#xff09;的数据结构不兼容&#xff0c;序列化提供统一的数据表示。例如&#xff1a;Java 的 HashMap 和 Python 的 dict 需转换为通用格式&#xff08;如 …...

基于 Python 的电影市场预测分析系统设计与实现(源码 + 文档)

大家好&#xff0c;今天要和大家聊的是一款基于 Python 的“电影市场预测分析”系统的设计与实现。项目源码以及部署相关事宜请联系我&#xff0c;文末附上联系方式。 项目简介 基于 Python 的“电影市场预测分析”系统主要面向以下用户角色&#xff1a;电影制片方、电影发行…...

计算机三级网络技术知识汇总【6】

第六章 交换机及其配置 1. 交换机基础 1.1 基本概念 局域网交换机是一种基于 MAC 地址识别&#xff0c;完成转发数据帧功能的一种网络连接设备。 工作在数据链路层&#xff0c;根据进入端口数据帧中的 MAC 地址进行数据帧的过滤、转发&#xff08;也是交换机的工作原理&…...

2025教育与科研领域实战全解析:DeepSeek赋能细分场景深度指南(附全流程案例与资源)

🚀 2025教育与科研领域实战全解析:DeepSeek赋能细分场景深度指南(附全流程案例与资源)🚀 📚 目录 DeepSeek在教育与科研中的核心价值教学场景应用:从备课到课堂管理的全流程革新科研场景应用:从数据分析到论文写作的智能跃迁师生协同创新:AI赋能的个性化学习与科研…...

Linux 命令大全完整版(10)

4. 压缩与解压缩命令 gzip(gnu zip) 功能说明&#xff1a;压缩文件。语  法&#xff1a;gzip [-acdfhlLnNqrtvV][-S <压缩字尾字符串>][-<压缩效率>][–best/fast][文件…] 或 gzip [-acdfhlLnNqrtvV][-S <压缩字尾字符串>][-<压缩效率>][–best/f…...

彻底卸载kubeadm安装的k8s集群

目录 一、删除资源 二、停止k8s服务 三、重置集群 四、卸载k8s安装包 五、清理残留文件和目录 六、删除k8s相关镜像 七、重启服务器 一、删除资源 # 删除集群中的所有资源&#xff0c;包括 Pod、Deployment、Service&#xff0c;任意节点执行 kubectl delete --all pod…...

vue+element-plus简洁完美实现淘宝网站模板

目录 一、项目介绍 二、项目截图 1.项目结构图 2.首页 3.详情 4.购物车 5.登陆页 三、源码实现 1.路由配置 2.依赖包 四、总结 一、项目介绍 项目在线预览&#xff1a;点击访问 本项目为vue项目&#xff0c;参考淘宝官方样式为主题来设计元素&#xff0c;简洁美观&…...

学习aigc

DALLE2 论文 Hierarchical Text-Conditional Image Generation with CLIP Latents [2204.06125] Hierarchical Text-Conditional Image Generation with CLIP LatentsAbstract page for arXiv paper 2204.06125: Hierarchical Text-Conditional Image Generation with CLIP L…...

深度学习-127-LangGraph之基础知识(四)自定义状态添加额外字段的聊天机器人

文章目录 1 自定义状态2 自定义工具2.1 完善工具human_assistance2.2 浏览器工具baidu_search3 聊天机器人3.1 绑定工具的聊天模型3.2 聊天机器人(带记忆)4 调用图4.1 调用工具时中断4.2 人工提供信息恢复4.3 查询存储的状态4.4 手动更新状态5 参考附录使用LangGraph,在状态中…...

广东英语十二种应用文模版范文

1. 邀请信&#xff08;Invitation Letter&#xff09; 模版 Dear [Recipients Name],I hope this letter finds you well. I am writing to invite you to [Event Name] which will be held on [Date] at [Location]. The event will start at [Time] and we would be deligh…...

python使用httpx_sse调用sse流式接口对响应格式为application/json的错误信息的处理

目录 问题描述方案 问题描述 调用sse流式接口使用httpx_sse的方式 import httpxfrom httpx_sse import connect_sse# 省略无关代码try:with httpx.Client() as client:with connect_sse(client, "GET", url, paramsparam) as event_source:clear_textbox(response_t…...

Leetcode-407. Trapping Rain Water II [C++][Java]

目录 一、题目描述 二、解题思路 【C】 【Java】 Leetcode-407. Trapping Rain Water IIhttps://leetcode.com/problems/trapping-rain-water-ii/description/ 一、题目描述 Given an m x n integer matrix heightMap representing the height of each unit cell in a 2D…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...

第八部分:阶段项目 6:构建 React 前端应用

现在&#xff0c;是时候将你学到的 React 基础知识付诸实践&#xff0c;构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段&#xff0c;你可以先使用模拟数据&#xff0c;或者如果你的后端 API&#xff08;阶段项目 5&#xff09;已经搭建好&#xff0c;可以直接连…...

前端开发者常用网站

Can I use网站&#xff1a;一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use&#xff1a;Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站&#xff1a;MDN JavaScript权威网站&#xff1a;JavaScript | MDN...

LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》

&#x1f9e0; LangChain 中 TextSplitter 的使用详解&#xff1a;从基础到进阶&#xff08;附代码&#xff09; 一、前言 在处理大规模文本数据时&#xff0c;特别是在构建知识库或进行大模型训练与推理时&#xff0c;文本切分&#xff08;Text Splitting&#xff09; 是一个…...