STM32CubeMX教程13 ADC - 单通道转换
目录
1、准备材料
2、实验目标
3、ADC概述
4、实验流程
4.0、前提知识
4.1、CubeMX相关配置
4.1.1、时钟树配置
4.1.2、外设参数配置
4.1.3、外设中断配置
4.2、生成代码
4.2.1、外设初始化调用流程
4.2.2、外设中断调用流程
4.2.3、添加其他必要代码
5、常用函数
6、烧录验证
6.1、实验具体流程
6.2、实验现象
7、软件触发ADC采集
8、注释详解
参考资料
1、准备材料
开发板(正点原子stm32f407探索者开发板V2.4)
STM32CubeMX软件(Version 6.10.0)
野火DAP仿真器
keil µVision5 IDE(MDK-Arm)
CH340G Windows系统驱动程序(CH341SER.EXE)
XCOM V2.6串口助手
1个滑动变阻器
2、实验目标
使用STM32CubeMX软件配置STM32F407开发板的ADC实现单通道ADC采集,具体为使用ADC1_IN5通道通过软件/定时器触发采集滑动变阻器上的分压
3、ADC概述
ADC即模拟数字转换,是将模拟电压量转换为数字量的一种手段,如下图所示为STM32F407单个ADC的结构框图(注释1),其主要包括5个部分,分别为①ADC电源引脚、②ADC输入引脚、③ADC触发源、④ADC转换规则和⑤ADC中断触发,下面从这五个方面分别介绍STM32F407的ADC

①ADC电源引脚有VDDA、VSSA、VREF+和VREF-四个引脚,STM32的ADC采集范围为VREF- ≤ VIN ≤ VREF+,一般将ADC的负端参考电压与VSSA短接然后接地,将ADC的正端参考电压接VDDA即3.3V,这样ADC的采集范围就设置为0~3.3V,对于12位分辨率的ADC,其采集数字量范围为0-4095,这样就可以将0-3.3V的电压映射到0-4095的数字量,使其可以相互转化,ADC电源即参考电压引脚具体描述如下图所示(注释1)

②STM32F407有三个ADC可供使用,每个ADC又拥有16个通道ADCx_IN[15:0],其中ADC1还拥有Temperature Sensor Channel、Vrefint Channel和Vbat Channel三个内部通道,Temperature Sensor Channel通道用于测量芯片内部温度,范围为-40℃~125℃,精度为±1.5℃,Vrefint Channel用于测量内部参考电压,Vbat Channel用于测量备用电源电压的一半,ADC的转换主要依靠12位分辨率的片上模数转换器
③注入通道和规则通道均有16个触发源,可以选择定时器外部源触发/定时器比较捕获触发/软件常规触发,具体参看上图ADC框架中的紫色框框
④ADC启动转换时需要按照一定通道顺序转化,该顺序由规则通道和注入通道两者共同决定,其中注入通道其数据寄存器为4*16位,因此可以同时转换四个通道,但是规则通道的数据寄存器只有一个16位的寄存器,因此必须一个通道一个通道的转换,每转换完一个通道,就需要及时将转换完成的结果从规则通道数据寄存器中读出去,其中注入通道类似ADC通道转换过程的中断,如下图所示(注释2)

⑤ADC的中断事件有DMA溢出、ADC转换结束、注入转换结束和模拟看门狗事件共四个事件,前三个中断和其名字表述类似,当转换结束/溢出时就会产生中断,模拟看门狗可以设置ADC转换值的上限和下限,当超出限制之后就会产生中断,可以用于警报,如下表所示(注释1)

ADC有独立模式、二重和三重采集模式,当只有ADC1启动时只能使用独立模式,当ADC1/2启动时可以使用二重采集模式,当ADC1/2/3/全部启动时可以使用三重采集模式,本实验只介绍独立模式
4、实验流程
4.0、前提知识
本实验为ADC独立模式单通道单次转换模式,主要利用ADC1_IN5通道由软件/定时器启动ADC转换,如果是软件手动启动的ADC转换则在单次转换模式下每次转换完成一次之后均需要再次手动启动ADC转换,另外需要注意ADC在开始精确转换之前需要一段稳定时间tSTAB,如下图所示为ADC转化所经过的路径

4.1、CubeMX相关配置
请先阅读“STM32CubeMX教程1 工程建立”实验3.4.1小节配置RCC和SYS
4.1.1、时钟树配置
系统时钟树配置均设置为STM32F407总线能达到的最高时钟频率,具体如下图所示

4.1.2、外设参数配置
本实验需要需要初始化USART1作为输出信息渠道,具体配置步骤请阅读“STM32CubeMX教程9 USART/UART 异步通信”
设置TIM3通用定时器溢出时间100ms,外部触发事件选择更新事件,参数详解请阅读“STM32CubeMX教程6 TIM 通用定时器 - 生成PWM波”实验,具体配置如下图所示

在Pinout & Configuration页面左边功能分类栏目Analog中单击其中ADC1,在Mode中勾选需要使用的输入通道,本实验为单通道转换实验,因此任意勾选IN0~IN15之间的任一通道均可,笔者勾选了IN5
在Configuration中对ADC1_IN5的转换参数进行配置,下面介绍一些比较重要的参数
------------------ ADCs_Common_Settings ------------------
①Mode(模式):现在只能选择独立模式,当同时启用了ADC1/2或ADC1/2/3时这里会出现多重ADC采集的模式可选
------------------------- ADC_Settings -------------------------
②Clock Prescaler(时钟分频):决定ADC转换的频率,分频越少ADC转换的频率越高,最少2分频,一个通道一次ADC转换的总时间为N+12个ADC时钟周期,其中N为设置的采样次数Cycles
③Resolution(ADC转换精度):可以选择12/10/8/6位精度的转换值,精度选择不同需要的转换时钟周期也不同
④Data Alignment(数据对齐):由于规则数据寄存器为16位,但是最高转换精度为12位,因此数据可以选择以右对齐/左对齐的方式放入寄存器
⑤Scan Conversion Mode(扫描转换模式):规则通道同时只能转换一个通道,启用该参数后,当规则通道中有多个通道等待转换时其转换完当前通道会自动转换组内的下一个通道
⑥Continuous Conversion Mode(连续转换模式):启用该参数,ADC结束一个转换立即开始一个新的转换,与参数⑤共同启用,则组内最后一个通道转换完毕后会立即切换到第一个通道继续转换
⑦DMA Continuous Requests(DMA请求):需要在DMA Settings中添加DMA请求后,该参数才可以使能
⑧End Of Conversion Selection(结束转换标志):选择是一个通道转换完就产生EOC标志,还是一个组内所有通道全部转换完才产生EOC标志
------------------ ADC_Regular_ConversionMode------------------
⑨NumberOfConversion(转换通道数量):常规规则通道希望转换的通道数量
⑩External Trigger Conversion Source(外部触发转换源)
⑪External Trigger Conversion Edge(外部触发转换边沿)
⑫Rank(规则通道排序)
------------------ ADC_Injected_ConversionMode------------------
⑬NumberOfConversion(注入通道转换模式通道数量):注入通道希望转换的通道数量
具体参数配置如下图所示

4.1.3、外设中断配置
在Pinout & Configuration页面左边System Core/NVIC中勾选ADC1/2/3全局中断,然后选择合适的中断优先级即可,步骤如下图所示

4.2、生成代码
请先阅读“STM32CubeMX教程1 工程建立”实验3.4.3小节配置Project Manager
单击页面右上角GENERATE CODE生成工程
4.2.1、外设初始化调用流程
在生成的工程代码主函数main()中调用了MX_ADC1_Init()函数完成了对ADC1基本参数的配置,ADC常规规则通道/注入通道等参数配置
然后在ADC初始化函数HAL_ADC_Init()函数中调用了HAL_ADC_MspInit()函数对ADC1时钟和中断进行了使能,对中断优先级进行了配置,对ADC1_IN5输入引脚做了复用操作
如下图所示为ADC1单通道初始化的具体函数调用流程

4.2.2、外设中断调用流程
使能ADC1/2/3全局中断后在stm32f4xx_it.c中自动生成了TIM4的中断处理函数ADC_IRQHandler()
ADC_IRQHandler()调用了HAL库的ADC中断处理函数HAL_ADC_IRQHandler(),该函数处理所有的ADC中断事件
在ADC转换完成之后最终调用了ADC转换完成中断回调函数HAL_ADC_ConvCpltCallback(),该函数为虚函数
如下图所示为ADC1单通道转换中断回调的具体函数调用流程

4.2.3、添加其他必要代码
在adc.c中重新实现ADC转换完成中断回调函数HAL_ADC_ConvCpltCallback(),在该函数中获取ADC的转换值,然后将其计算为电压值*1000,并将这两个值通过串口输出,具体代码如下图所示

源代码如下
/*转换完成中断回调*/
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{/*定时器中断启动单通道转换*/if(hadc->Instance == ADC1){uint32_t val=HAL_ADC_GetValue(&hadc1);uint32_t Volt=(3300*val)>>12;printf("val:%d, Volt:%d\r\n",val,Volt);}
}
在主函数中以中断方式启动ADC转换,然后启动ADC的触发源TIM3定时器,具体代码如下图所示

5、常用函数
/*启动ADC转换*/
HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef *hadc)/*停止ADC转换*/
HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef *hadc)/*以中断方式启动ADC转换*/
HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef *hadc)/*停止ADC转换*/
HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef *hadc)/*轮询ADC是否转换完毕*/
HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef *hadc, uint32_t Timeout)/*获取ADC转换值*/
uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef *hadc)/*ADC转换完成中断回调函数*/
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
6、烧录验证
6.1、实验具体流程
“配置USART1用于输出信息 -> 配置通用定时器TIM3实现100ms定时 -> TIM3外部触发事件选择为更新事件 -> 启动ADC1的通道5并配置相关参数 -> 外部触发转换源选择TIM3的外部触发事件 -> 启动ADC1/2/3全局中断 -> 重新实现ADC转换完成中断回调HAL_ADC_ConvCpltCallback()函数 -> 在回调函数中读取ADC转换值并通过串口输出 -> 在主函数中启动定时器和ADC转换”
6.2、实验现象
烧录程序,上电后打开串口,串口会每100ms传来一次ADC采集的数据,旋转滑动变阻器从一端到另一端,可以看到ADC采集到的值从0逐渐变为最大值4095

7、软件触发ADC采集
如果你希望不采用定时器触发中断采集的方式,而是想使用软件手动触发轮询采集的方式,需要先将ADC规则转换模式中触发源修改为软件触发,然后使用HAL_ADC_Start()启动转换,使用HAL_ADC_PollForConversion()轮询检测是否转换完成,转换完成后使用可以HAL_ADC_GetValue()获取转换后的ADC值,具体参考如下图所示


源代码如下
HAL_ADC_Start(&hadc1);
if(HAL_ADC_PollForConversion(&hadc1,200)==HAL_OK)
{uint32_t val=HAL_ADC_GetValue(&hadc1);uint32_t Volt=(3300*val)>>12;printf("val:%d, Volt:%d\r\n",val,Volt);
}
HAL_Delay(500);
8、注释详解
注释1:图片来自STM32F4xx中文参考手册 RM0090
注释2:图片来自【STM32】HAL库 STM32CubeMX教程九---ADC_cubemx adc-CSDN博客
参考资料
STM32Cube高效开发教程(基础篇)
相关文章:
STM32CubeMX教程13 ADC - 单通道转换
目录 1、准备材料 2、实验目标 3、ADC概述 4、实验流程 4.0、前提知识 4.1、CubeMX相关配置 4.1.1、时钟树配置 4.1.2、外设参数配置 4.1.3、外设中断配置 4.2、生成代码 4.2.1、外设初始化调用流程 4.2.2、外设中断调用流程 4.2.3、添加其他必要代码 5、常用函数…...
矩阵的乘法
首先矩阵的乘法定义如下: #include <stdio.h> int main() { int i 0; int j 0; int arr[20][20] { 0 }; int str[20][20] { 0 }; int s[20][20] { 0 }; int n1 0; int n2 0; int m2 0; int z 0; int m1 0;…...
python爬取招聘网站数据
这段代码是使用Selenium自动化测试模块进行网页爬取的示例代码。它通过模拟人的行为在浏览器中操作网页来实现爬取。具体的流程如下: 导入所需的模块,包括Selenium、时间、随机、csv等模块。打开浏览器,创建一个Chrome浏览器实例。设置要爬取…...
灌区信息化方案(什么是现代化灌区,如何一步到位)
一、系统概述 详情:https://www.key-iot.com.cn/ 本灌区信息化方案以星创易联公司的各类智能设备为基础,通过其产品完成水文、雨情、土壤等多源异构数据的采集,以无线自组网的方式实现数据传输,并在后台管理中心建立信息化软件平台,对数据进行融合处理。系统实现对…...
jmeter自动录制脚本功能
问题排查: 建议用 google浏览器; 重启一下jmeter; 过滤规则重新检查下; 看下代理设置是否正常; 注意:下面的的过滤设置中 用的都是正则表达式的规则。...
十一、工具盒类(MyQQ)(Qt5 GUI系列)
目录 编辑 一、设计需求 二、实现代码 三、代码解析 四、总结 一、设计需求 抽屉效果是软件界面设计中的一种常用形式,可以以一种动态直观的方式在有限大小的界面上扩展出更多的功能。本例要求实现类似 QQ 抽屉效果。 二、实现代码 #include "dialog.…...
postgresql 查询字段 信息
SELECT base.“column_name”, col_description ( t1.oid, t2.attnum ), base.udt_name, COALESCE(character_maximum_length, numeric_precision, datetime_precision), (CASE WHEN ( SELECT t2.attnum ANY ( conkey ) FROM pg_constraint WHERE conrelid t1.oid AND contyp…...
antv/x6_2.0学习使用(四、边)
一、添加边 节点和边都有共同的基类 Cell,除了从 Cell 继承属性外,还支持以下选项。 属性名类型默认值描述sourceTerminalData-源节点或起始点targetTerminalData-目标节点或目标点verticesPoint.PointLike[]-路径点routerRouterData-路由connectorCon…...
C++ stack用法总结
std::stack 是 C 标准模板库(STL)中的容器适配器,它提供了栈(stack)的功能,基于其他序列容器实现。以下是 std::stack 的用法总结: 包含头文件: #include <stack>创建 std::…...
【大数据进阶第三阶段之Datax学习笔记】阿里云开源离线同步工具Datax概述
【大数据进阶第三阶段之Datax学习笔记】阿里云开源离线同步工具Datax概述 【大数据进阶第三阶段之Datax学习笔记】阿里云开源离线同步工具Datax快速入门 【大数据进阶第三阶段之Datax学习笔记】阿里云开源离线同步工具Datax类图 【大数据进阶第三阶段之Datax学习笔记】使用…...
PHP 基础编程 2
文章目录 时间函数dategetdatetime 使用数组实现登录注册和修改密码简单数组增加元素方法修改元素方法删除元素方法 具体实现方法数组序列化数组写入文件判断元素是否在关联数组中(登录功能实现)实现注册功能实现修改admin用户密码功能 时间函数 时区&am…...
git merge origin master 和 git merge origin/master 的区别
git merge origin master和git merge origin/master的区别 1. git checkout dev 2. git fetch origin master 3. git merge origin release 把 origin/master,heads/release merge到 heads/dev1. git checkout dev 2. git fetch origin master 3. git me…...
数据挖掘 模糊聚类
格式化之前的代码: import matplotlib.pyplot as plt#绘图 import pandas as pd#读取数据集 from sklearn.preprocessing import scale from sklearn.cluster import DBSCAN#聚类 from sklearn import preprocessing#数据预处理的功能,包括缩放、标准化…...
Vue2和Vue3各自的优缺点以及区别对比
Vue2和Vue3各自的优缺点以及区别对比 Vue2的优点: 成熟稳定:Vue2是一个经过长时间发展和测试的成熟版本,广泛应用于各种项目中。 生态系统丰富:由于Vue2的流行程度,它的生态系统相对较为完善,有大量的插件…...
手写一个加盐加密算法(java实现)
目录 前言 什么是MD5?? 加盐算法 那别的人会不会跟你得到相同的UUID? 如何使用盐加密? 代码实现 前言 对于我们常见的登录的时候需要用到的组件,加密是一个必不可少的东西,如果我们往数据库存放用户…...
基于Springboot的在线考试系统
点击以下链接获取源码: https://download.csdn.net/download/qq_64505944/88499371 mysql5、mysql8都可使用 内含配置教程文档,一步一步配置 Springboot所写 管理员页面 学生页面...
【React系列】JSX核心语法和原理
本文来自#React系列教程:https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. ES6 的 class 虽然目前React开发模式中更加流行hooks,但是依然有很多的项目依然是使用类组件&#x…...
【C++初阶(九)】C++模版(初阶)----函数模版与类模版
本专栏内容为:C学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C 🚚代码仓库:小小unicorn的代码仓库&…...
Permission denied
Permission denied:权限被拒绝,没有访问文件的权限。 查询对文件的权限: ls -l 文件名称 r为可读权限,w为可写权限,x为可执行权限。 授权文件rwx,可读可写可执行权限: chmod 777 文件名称 如…...
轻松学会电脑如何录制音频
随手录音,保留证据以便后续出现问题进行判定,或者保存会议音频记录方便后续根据录音内容整理自己会议记录不足之处等等;越来越多的地方需要用到录音,那么在电脑上该如何进行音频录制呢?特别是使用比较广泛的Windows电脑…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
