028 - STM32学习笔记 - ADC结构体学习(二)
028 - STM32学习笔记 - 结构体学习(二)

上节对ADC基础知识进行了学习,这节在了解一下ADC相关的结构体。
一、ADC初始化结构体
在标准库函数中基本上对于外设都有一个初始化结构体xx_InitTypeDef(其中xx为外设名,例如之前使用过的GPIO_InitTypeDef),结构体成员用来设置外设的工作模式,通过标准库函数xx_Init()调用将这些设定的参数送入外摄对应的寄存器。
对于ADC来说也是这样的操作,先看一下ADC_InitTypeDef结构体的定义:
ADC_InitTypeDef结构体
typedef struct {uint32_t ADC_Resolution; //设置ADC分辨率选择FunctionalState ADC_ScanConvMode; //设置ADC扫描选择FunctionalState ADC_ContinuousConvMode; //设置ADC连续转换模式选择uint32_t ADC_ExternalTrigConvEdge; //设置ADC外部触发极性uint32_t ADC_ExternalTrigConv; //设置ADC外部触发选择uint32_t ADC_DataAlign; //设置输出数据对齐方式uint8_t ADC_NbrOfChannel; //设置转换通道数目
} ADC_InitTypeDef;
ADC_Resolution:用于配置ADC的分辨率,可选的分辨率有12 位、10 位、8 位和 6 位。分辨率越高, AD转换数据精度越高,转换时间也越长;分辨率越低,AD转换数据精度越低,转换时间也越短。
ADC_Resolution_12b //12位精度
ADC_Resolution_10b //10位精度
ADC_Resolution_8b //8位精度c
ADC_Resolution_6b //6位精度
ADC_ScanConvMode:该成员主要用于配置ADC是否使用扫描,可选参数为ENABLE和DISABLE,如果只用到一个通道,配置为DISABLE,如果时多个通道,则选择ENABLE。
ADC_ContinuousConvMode:用于配置启动自动连续转换还是单次转换,可选参数为ENABLE(连续转换)和DISABLE(单次转换)。如果选择为单次转换,那么每次转换完成后,都需要手动控制才能重新启动转换。
ADC_ExternalTrigConvEdge:设置外部触发极性,如果使用外部触发,可选有:
ADC_ExternalTrigConvEdge_None //禁止触发检测
ADC_ExternalTrigConvEdge_Rising //上升沿触发检测
ADC_ExternalTrigConvEdge_Falling //下降沿触发检测
ADC_ExternalTrigConvEdge_RisingFalling //上升下降沿均检测
ADC_ExternalTrigConv:外部触发模式选择,可选的触发条件如下图-4,常用的一般使用软件自动触发:

ADC_DataAlign:设置转换结果数据对其模式,可选有右对齐ADC_DataAlign_Right或者左对齐ADC_DataAlign_Left,这里我们选择右对齐。
ADC_NbrOfChannel:设置AD转换通道数目。
ADC_CommonInitTypeDef结构体
除了ADC_InitTypeDef初始化结构体外,还有ADC_CommonInitTypeDef通用初始化结构,ADC_CommonInitTypeDef结构体内容决定了三个ADC共用的工作环境。
typedef struct{uint32_t ADC_Mode; //ADC模式选择uint32_t ADC_Prescaler; //ADC分频系数uint32_t ADC_DMAAccessMode; //DMA模式配置uint32_t ADC_TwoSamplingDelay; //采样延迟
}ADC_CommonInitTypeDef;
ADC_Mode:ADC工作模式选择在前面有学习过,有独立模式、双重模式以及三重模式;
ADC_Prescaler:ADC时钟分频系数选择,ADC时钟是由PCLK2分频而来,分频系数决定ADC时钟频率,可选的分频系数位2、4、6和8,在之前也学习过ADC的最大时钟配置为36MHz。
ADC_DMAAccessMode:DMA模式设置,在双重或者三重模式下才需要设置,可以设置三种模式,分别为:
ADC_DMAAccessMode_Disabled //独立模式下选择
ADC_DMAAccessMode_1 //模式1
ADC_DMAAccessMode_2 //模式2
ADC_DMAAccessMode_3 //模式3
ADC_TwoSamplingDelay:2个采样阶段之前的延迟,仅适用于双重或三重交错模式。
二、独立模式单通道采集实验
在F429实验板上,提供了一个板载贴片滑动变阻器,供我们调试ADC时使用,原理图如下:

滑动变阻器动触点连接到STM32的ADC通道引脚(GPIOC_3),固定触点一边接0V,一边接3.3V,因此旋转滑动变阻器调节旋钮时,动触点的电压会在0~3.3V之间变化。
根据以上电路设计,设计个模拟量采集程序,具体需要实现如下步骤:
- 初始化配置ADC目标引脚为模拟输入模式;
- 使能ADC时钟(再次强调,使用外设一定要先开启时钟!!!);
- 配置通用ADC为独立模式,采样4分频;
- 设置目标ADC为12位分辨率,1通道的连续转换,不需要外部触发;
- 设置ADC转换通道顺序及采样时间;
- 配置使能ADC转换完成中断,在中断内读取转换完数据;
- 启动ADC转换;
- 使能软件触发ADC转换。
这里需要注意,没用使用到DMA进行数据传输,而是使用中断方式进行读取。
bsp_adc.h
#ifndef __BSP_ADC_H_
#define __BSP_ADC_H_#include "stm32f4xx.h"#define R_ADC_IRQ ADC_IRQn
#define R_ADC_INT_FUNCTION ADC_IRQHandler
#define R_ADC_GPIO_PORT GPIOC
#define R_ADC_GPIO_PIN GPIO_Pin_3
#define R_ADC_GPIO_CLK RCC_AHB1Periph_GPIOC#define R_ADC ADC1
#define R_ADC_CLK RCC_APB2Periph_ADC1
#define R_ADC_CHANNEL ADC_Channel_13void R_ADC_Init(void);
#endif
bsp_adc.c
#include "bsp_adc.h"/** @brief 初始化ADC GPIO引脚* @parm 无* @retval 无*/
static void R_ADC_GPIO_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(R_ADC_GPIO_CLK,ENABLE); //开启ADC外设引脚时钟GPIO_InitStructure.GPIO_Pin = R_ADC_GPIO_PIN; //配置引脚位3引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //配置引脚为模拟输入GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //配置为无上下拉GPIO_Init(R_ADC_GPIO_PORT,&GPIO_InitStructure); //初始化引脚
}/** @brief 配置ADC引脚工作模式* @parm 无* @retval 无*/
static void R_ADC_Mode_Config(void)
{ADC_InitTypeDef ADC_InitStructure;ADC_CommonInitTypeDef ADC_CommonInitStructure;RCC_APB2PeriphClockCmd(R_ADC_CLK,ENABLE);//-----------------ADC Common结构体参数初始化--------------//ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; //设置模式为独立模式ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4; //设置为4分频ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //禁止DMA直接访问模式ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_10Cycles; //设置采样间隔周期为10个周期ADC_CommonInit(&ADC_CommonInitStructure);//-----------------ADC Init结构体参数初始化--------------//ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; //设置ADC采样分辨率为12位ADC_InitStructure.ADC_ScanConvMode = DISABLE; //多通道下才会用到扫描模式,这里直接禁止ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //设置为连续转换ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; //禁用外部边沿触发ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //设置为右对齐ADC_InitStructure.ADC_NbrOfConversion = 1; //转换通道只有1个ADC_Init(R_ADC,&ADC_InitStructure);ADC_RegularChannelConfig(R_ADC,R_ADC_CHANNEL,1,ADC_SampleTime_56Cycles); //配置ADC通道转换顺序为1,第一个转换,才压根时间为56个时钟周期ADC_ITConfig(R_ADC,ADC_IT_EOC,ENABLE); //ADC转换结束产生中断,在中断服务程序中读取转换数值ADC_Cmd(R_ADC,ENABLE); //使能ADCADC_SoftwareStartConv(R_ADC); //开始ADC转换,由软件触发
}static void R_ADC_NVIC_Config(void)
{NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //设置中断向量组为1NVIC_InitStructure.NVIC_IRQChannel = R_ADC_IRQ; //配置中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //设置主优先级为1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //设置此优先级为1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //通道使能NVIC_Init(&NVIC_InitStructure); //初始化中断
}
void R_ADC_Init(void)
{R_ADC_GPIO_Config();R_ADC_Mode_Config();R_ADC_NVIC_Config();
}
main.c
#include "stm32f4xx.h"
#include "bsp_usart_dma.h"
#include "bsp_systick.h"
#include "bsp_adc.h"
#include <stdio.h>
__IO uint16_t ADC_Value;
float ADC_Vol = 0;
int main(void)
{DEBUG_USART1_Config();R_ADC_Init();SysTick_Init();printf("\r\n---------------ADC实验(中断模式)----------------\r\n");while(1){Delay_ms(1000);printf("\r\n ADC数据(未转换) = 0x%04X \r\n",ADC_Value);ADC_Vol =(float)(ADC_Value*3.3/4096); // 读取转换的 AD 值 printf("\r\n ADC数据(已转换) = %.2f V \r\n",ADC_Vol);}
}
stm32f4xx_it.c
//此处记得在头文件中声明函数
extern __IO uint16_t ADC_ConvertedValue;
void ADC_IRQHandler(void)
{if (ADC_GetITStatus(R_ADC,ADC_IT_EOC)==SET) //获取ADC中断状态{ADC_ConvertedValue = ADC_GetConversionValue(R_ADC); // 等待转换完成后,读取ADC的转换值}ADC_ClearITPendingBit(R_ADC,ADC_IT_EOC); //清除状态寄存器
}
输出结果如下,调整电位器会发现数值在0V~3.3V之间变化。

单通道相对比较简单,这里先了解一下,后面在学习一下多通道并且启用DMA传输模式。
相关文章:
028 - STM32学习笔记 - ADC结构体学习(二)
028 - STM32学习笔记 - 结构体学习(二) 上节对ADC基础知识进行了学习,这节在了解一下ADC相关的结构体。 一、ADC初始化结构体 在标准库函数中基本上对于外设都有一个初始化结构体xx_InitTypeDef(其中xx为外设名,例如…...
Pytest自动化测试框架:mark用法---测试用例分组执行
pytest中的mark: mark主要用于在测试用例/测试类中给用例打标记(只能使用已注册的标记名),实现测试分组功能,并能和其它插件配合设置测试方法执行顺序等。 如下图,现在需要只执行红色部分的测试方法,其它方法不执行&am…...
【TCP连接的状态】
linux查看tcp的状态命令: 1)、netstat -nat 查看TCP各个状态的数量 2)、lsof -i:port 可以检测到打开套接字的状况 3)、 sar -n SOCK 查看tcp创建的连接数 4)、tcpdump -iany tcp port 9000 对tcp端口为9000的进行抓包 查看占用端口…...
Node.js入门指南(一)
目录 Node.js入门 什么是Node.js Node.js的作用 Node.js安装 Node.js编码注意事项 Buffer(缓冲器) 定义 使用 fs模块 概念 文件写入 文件读取 文件移动与重命名 文件删除 文件夹操作 查看资源状态 路径问题 path模块 Node.js入门 什么是Node.js …...
使用Grpc实现高性能PHP RPC服务
文档:Quick start | PHP | gRPC 下面将介绍使用 Grpc 和 Protobuf 实现高性能 RPC 服务的具体步骤: 1. 安装 Grpc 和 Protobuf 首先需要安装 Grpc 和 Protobuf。可以从官网下载相应的安装包(Supported languages | gRPC)或通过…...
二、爬虫-爬取肯德基在北京的店铺地址
1、算法框架解释 针对这个案例,现在对爬虫的基础使用做总结如下: 1、算法框架 (1)设定传入参数 ~url: 当前整个页面的url:当前页面的网址 当前页面某个局部的url:打开检查 ~data:需要爬取数据的关键字&…...
linux驱动开发.之spi测试工具spidev_test源码(一)
同i2c-tools工具类似,spidev_test是用来测试SPI BUS的用户态程序,其源码存在kernel目录下的tools下,具体为tools\spi\spidev_test.c。buildroot同样也提供名为spidev_test的package,可以直接进行编译,方便用户调试spi总…...
基于材料生成算法优化概率神经网络PNN的分类预测 - 附代码
基于材料生成算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于材料生成算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于材料生成优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神…...
Go——二、变量和数据类型
Go 一、Go语言中的变量和常量1、Go语言中变量的声明2、如何定义变量方式1:方式2:带类型方式3:类型推导方式定义变量方式4:声明多个变量总结 3、如何定义常量4、Const常量结合iota的使用 二、Golang的数据类型1、概述2、整型2.1 类…...
合并区间问题
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1: 输入:intervals [[1,…...
2023 年最新 MySQL 数据库 Windows 本地安装、Centos 服务器安装详细教程
MySQL 基本概述 MySQL是一个流行的关系型数据库管理系统(RDBMS),广泛应用于各种业务场景。它是由瑞典MySQL AB公司开发,后来被Sun Microsystems收购,最终被甲骨文公司(Oracle Corporation)收购…...
每天一道算法题(十)——获取和为k的子数组
文章目录 1、问题2、示例3、解决方法(1)方法1——双指针 总结 1、问题 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 2、示例 示例 1: 输入&#x…...
2023年亚太杯数学建模思路 - 案例:最短时间生产计划安排
文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 最短时…...
在vscode中使用Latex:TexLive2023
安装TexLive2023及配置vscode可参考https://zhuanlan.zhihu.com/p/166523064 然后编译模板 .tex文件时,出现以下几个错误: 1. ctexbook找不到字体集 d:/texlive/2023/texmf-dist/tex/latex/ctex/ctexbook.cls:1678: Class ctexbook Error: CTeX fo…...
Unity开发之C#基础-File文件读取
前言 今天我们将要讲解到c#中 对于文件的读写是怎样的 那么没接触过特别系统编程小伙伴们应该会有一个疑问 这跟文件有什么关系呢? 我们这样来理解 首先 大家对电脑或多或少都应该有不少的了解吧 那么我们这些软件 都是通过变成一个一个文件保存在电脑中 我们才可以…...
深度学习之二(前馈神经网络--Feedforward Neural Network)
概念 前馈神经网络(Feedforward Neural Network)是一种最基本的神经网络结构,也被称为多层感知器(Multilayer Perceptron,MLP)。它的特点是信息只在网络中单向传播,不会形成环路。每一层神经元的输出都作为下一层神经元的输入,没有反馈回路。 结构: 前馈神经网络通…...
2023全球边缘计算大会深圳站-核心PPT资料下载
一、峰会简介 边缘计算,是指在靠近物或数据源头的一侧,采用网络、计算、存储、应用核心能力为一体的开放平台,就近提供最近端服务。其应用程序在边缘侧发起,产生更快的网络服务响应,满足行业在实时业务、应用智能、安…...
【亚太杯思路助攻】2023年第十三届APMCM亚太地区大学生数学建模竞赛——(文末领取方式)
2023年第十三届APMCM亚太地区大学生数学建模竞赛——来啦!!! 大家准备好了吗?别担心,【数模加油站】会像数模国赛、研赛一样,第一时间提供无偿解题思路、代码、参考文献等资料帮助大家。 祝各位小伙伴都能…...
vue开发一、在Vue中引入ElementUI二、在Vue中使用阿里图标库
目录 一、在Vue中引入ElementUI1. 安装ElementUI2. 引入ElementUI3. 使用ElementUI组件 二、在Vue中使用阿里图标库1. 在阿里图标库中选择图标2. 下载图标3. 引入图标4. 使用图标 总结 一、在Vue中引入ElementUI ElementUI是一种基于Vue的第三方UI库,提供了许多常用…...
基于SpringBoot+Mybatis plus+React.js实现条件选择切换搜索功能
笔记/朱季谦 在写React前端逻辑时,经常遇到可以切换不同条件的列表查询功能,例如下边截图这样的,其实,这块代码基本都一个逻辑,可以一次性将实现过程记录下来,待以后再遇到时,直接根据笔记复用…...
LLM工作流引擎:构建智能自动化流程的核心架构与实践
1. 项目概述:当LLM遇上工作流引擎最近在开源社区里,一个名为llm-workflow-engine的项目引起了我的注意。这个名字本身就很有意思,它把两个当下最火的概念——“大语言模型”和“工作流引擎”——直接焊在了一起。作为一个在自动化和AI应用领域…...
独立开发者如何借助 Taotoken 以更低成本启动 AI 产品原型
独立开发者如何借助 Taotoken 以更低成本启动 AI 产品原型 1. 独立开发者的 AI 产品原型挑战 对于独立开发者或小型团队而言,启动 AI 产品原型往往面临多重挑战。最直接的困难是初期资金有限,难以承担高昂的模型调用成本。传统方式需要为不同模型分别注…...
别再死记硬背了!用STM32CubeMX配置CAN波特率,手把手教你算Tq和采样点
告别手动计算:用STM32CubeMX智能配置CAN总线参数的实战指南 当你第一次在STM32项目中使用CAN总线时,是否曾被数据手册里那些晦涩的位时间参数搞得晕头转向?作为嵌入式开发者,我们经常需要在有限的时间内完成通信模块的配置&#x…...
RocketMQ入门第一篇:核心概念与整体工作原理零基础详解
文章目录一、前言:为什么学RocketMQ?它到底是什么?二、RocketMQ核心基础概念:看懂术语才算入门1. 消息(Message):传输的最小数据单元2. 主题(Topic):消息的一…...
实验室4篇论文被ICML 2026录用
点击下方卡片,关注“CVer”公众号AI/CV重磅干货,第一时间送达点击进入—>【顶会/顶刊】投稿交流群添加微信号:CVer2233,小助手拉你进群!扫描下方二维码,加入CVer学术星球!可以获得最新顶会/顶…...
【让你的电脑更好用】提升办公效率 OpenClaw 2.6.6 技能使用教程(含安装包)
OpenClaw 2.6.6 实用技能推荐|办公效率提升必备(新手友好) OpenClaw(小龙虾)的核心优势在于Skill 技能扩展。开启对应技能后,AI 可直接执行各类操作,满足文件整理、办公自动化、浏览器操作、系…...
企业内部工具如何通过统一API密钥管理实现安全接入
企业内部工具如何通过统一API密钥管理实现安全接入 1. 企业AI服务接入的安全挑战 在企业内部工具中集成AI能力时,开发团队通常面临三个核心问题:多项目密钥分散管理困难、调用行为难以追踪、以及成本分配不透明。传统做法是为每个项目单独申请不同厂商…...
2025年全球开发者时间处理习惯报告:为什么Arrow库成为Python开发者的终极选择
2025年全球开发者时间处理习惯报告:为什么Arrow库成为Python开发者的终极选择 【免费下载链接】arrow 🏹 Better dates & times for Python 项目地址: https://gitcode.com/gh_mirrors/ar/arrow 在Python开发中,日期和时间处理一直…...
电子产品风扇噪音评估与系统级噪音优化的综合解决方案
🎓作者简介:科技自媒体优质创作者 🌐个人主页:莱歌数字-CSDN博客 211、985硕士,从业16年 从事结构设计、热设计、售前、产品设计、项目管理等工作,涉足消费电子、新能源、医疗设备、制药信息化、核工业…...
别再报错‘PowerSI executable not found’了!手把手教你搞定Cadence 2017.4与Sigrity 2019的完整安装与联调
彻底解决Cadence与Sigrity联调报错:从安装到仿真的全流程指南 每次打开Allegro Sigrity SI准备大展拳脚时,突然跳出的"PowerSI executable not found"报错对话框,就像一盆冷水浇灭了所有热情。这个看似简单的路径配置问题ÿ…...
