STM32F407寄存器操作(ADC非连续扫描模式)

article/2025/8/7 15:55:05

1.前言

书接上回,在看手册的时候我突然发现手册上还描述了另一种ADC扫描模式,即非连续扫描模式,想着连续扫描模式都已经探索过了,那就顺手把非非连续模式研究一下吧。

2.理论

我们先看看手册,这里我就以规则通道举例了

首先,我们先了解一下什么是非连续模式,这里的非连续模式指的是不在同一个周期内将所有管脚的电压全部读取完毕。手册上也给出了例子,也是比较好理解的。

然后我们再看看需要置为的寄存器,是CR1里的DISCEN和DISCNUM几位,我们看到CR1里

分别是11位,13~15位

3.程序

我先把程序放出来,这里我用的通道0、3、4、5四个通道,每次采样2个通道。

void init_adc1(unsigned char ch1,unsigned char adcm)
{init_adc12_chinal(0);	//初始化通道0init_adc12_chinal(3);	//初始化通道3init_adc12_chinal(4);	//初始化通道4init_adc12_chinal(5);	//初始化通道5ADC1->CR1&=~(3<<24);	//15 ADCCLK 周期ADC1->CR1|=(1<<8);		//扫描模式ADC1->CR1|=1<<11;			//ADC1非连续扫描模式ADC1->CR1|=1<<13;			//不连续采样通道数为2ADC1->CR2&=~(1<<1);		//单次转换ADC1->CR2&=~(1<<11);	//数据右对齐ADC1->CR2&=~(3<<28);	//禁止触发检测ADC1->SQR1&=~(0XF<<20);	//重置规则通道序重置列长度ADC1->SQR1|=3<<20;     	//4个转换在规则序列中//设置通道0的采样时间ADC1->SMPR2&=~(7<<(3*0));		//通道0	采样时间清空	  ADC1->SMPR2|=(7<<(3*0)); 		//通道0  480个周期,提高采样时间可以提高精确度//设置通道3的采样时间ADC1->SMPR2&=~(7<<(3*3));		//通道3	采样时间清空	  ADC1->SMPR2|=(7<<(3*3)); 		//通道3  480个周期,提高采样时间可以提高精确度//设置通道4的采样时间ADC1->SMPR2&=~(7<<(3*4));		//通道4	采样时间清空	  ADC1->SMPR2|=(7<<(3*4)); 		//通道4  480个周期,提高采样时间可以提高精确度//设置通道5的采样时间ADC1->SMPR2&=~(7<<(3*5));		//通道5	采样时间清空	  ADC1->SMPR2|=(7<<(3*5)); 		//通道5  480个周期,提高采样时间可以提高精确度ADC1->SQR3=0;	//重置规则通道转换配置ADC1->SQR3|=0<<0;	//设置第一次规则转换通道0ADC1->SQR3|=3<<5;	//设置第二次规则转换通道3ADC1->SQR3|=4<<10;	//设置第三次规则转换通道4ADC1->SQR3|=5<<15;	//设置第四次规则转换通道5ADC1->CR2|=1<<8;			//使能DMA模式ADC1->CR2|=1<<0;	   	//开启AD转换器	  
}

因此我们把CR1的11位置1开启非连续扫描模式,11~15位写2,表示单次采集2个通道。

同时我们的转换通道数要配置成4

然后是转换顺序,因为我们需要多次手动触发,因此在初始化阶段将转换顺序配置好即可

然后是软件触发的程序

void adc1_incontinue_scanf()
{ADC1->CR2|=1<<30;	//开始转换
}

因为单个循环转换完毕后没有事件生成,因此我们这里不做判断。理论上来说我们的转换时间也应该不是连续的,否则就用连续模式了。

4.测试

首先是主程序,按照DMA-ADC初始化顺序即可,这里我在两次扫描间加入10ms的延迟防止干扰。

int main(void)
{	Stm32_Clock_Init(336,25,2,7);//设置时钟,168MhzNVIC_SetGroup(1);//设置中断分组,分组1init_PinClock();//初始化所有时钟delay_init(168);//初始化延时init_DMAClock();//初始化DMA时钟init_DMA2_S0C0(4);	//DMA2 ADC1转换init_AllAdc();//初始化所有ADC时钟init_adc1(0,2);//初始化ADC1adc1_incontinue_scanf();//第一次扫描delay_ms(10);adc1_incontinue_scanf();//第二次扫描}

首先我们先测试是否是两次转换

程序停在两次延迟处,四个数据中前两位正常有数据了

两次触发完毕后四位数据正常了。

然后测试通道是否正常,有没有发生串扰

首先把PA4接地

第三个数据确实是0

然后我们再把PA3接地

OK,也没问题,第二个数据也是0了

5.结语

非连续扫描模式也不算难,可以说扫描模式顺带功能吧。那么OK,还是老样子,有问题评论区见,下篇文章我将介绍407多重ADC的使用方法。


http://www.hkcw.cn/article/UTFgOvWGiX.shtml

相关文章

老年照护实训室建设方案设计:基础照护与专业护理实训

老年照护实训室的建设是提升老年照护人才培养质量的关键环节&#xff0c;其方案设计需精准对接基础照护与专业护理的实训需求&#xff0c;为学习者构建理论与实践深度融合的教学场景。点击获取实训室建设方案 一、建设背景与目标 &#xff08;一&#xff09;建设背景 随着人…

C语言 — 文件

目录 1.流1.1 流的概念1.2 常见的的流 2.文件的打开和关闭2.1 fopen函数2.2 fclose函数2.3 文件的打开和关闭 3.文件的输入输出函数3.1 fputc函数3.2 fgetc函数3.3 feof函数和ferror函数3.4 fputs函数3.5 fgets函数3.6 fwrite函数3.7 fread函数3.8 fprintf函数3.9 fscanf函数 4…

13. springCloud AlibabaSeata处理分布式事务

目录 一、分布式事务面试题 1.多个数据库之间如何处理分布式事务&#xff1f; 2.若拿出如下场景&#xff0c;阁下将如何应对? 3.阿里巴巴的Seata-AT模式如何做到对业务的无侵入? 4.对于分布式事务问题&#xff0c;你知道的解决方案有哪些?请你谈谈? 二、分布式事务问题…

java多线程与JUC

进程线程 进程&#xff1a;进程是操作系统分配资源的基本单位。在电脑中&#xff0c;一个软件就是一个进程 线程&#xff1a;线程是CPU调度的基本单位&#xff0c;是进程内的执行单元。相当于一个软件中的不同功能 多线程程序的特点&#xff1a;程序可以同时去做多件事&#…

GCC 下载安装

下载 官网&#xff1a;GCC, the GNU Compiler Collection- GNU Project Cygwin linux 环境 MinGW 在 Windows 上提供 GNU 开发工具比 Cygwin 更轻量&#xff08;不模拟完整的 POSIX 环境&#xff09;选择&#xff1a;binaries选择mingw-w64

GpuGeek如何成为AI基础设施市场的中坚力量

AI时代&#xff0c;算力基础设施已成为支撑技术创新和产业升级的关键要素。作为国内专注服务算法工程师群体的智算平台&#xff0c;GpuGeek通过持续创新的服务模式、精准的市场定位和系统化的生态建设&#xff0c;正快速成长为AI基础设施领域的中坚力量。本文将深入分析GpuGeek…

DAY 35 超大力王爱学Python

知识点回顾&#xff1a; 三种不同的模型可视化方法&#xff1a;推荐torchinfo打印summary权重分布可视化进度条功能&#xff1a;手动和自动写法&#xff0c;让打印结果更加美观推理的写法&#xff1a;评估模式 作业&#xff1a;调整模型定义时的超参数&#xff0c;对比下效果。…

MYOJ_4149:(洛谷P1002)[NOIP 2002 普及组] 过河卒(坐标型DP)

题目描述 棋盘上 A 点有一个过河卒&#xff0c;需要走到目标 B 点。卒行走的规则&#xff1a;可以向下、或者向右。同时在棋盘上 C 点有一个对方的马&#xff0c;该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。 棋盘用坐标表示&#xff0…

Java高效处理大文件:避免OOM的深度实践

​关键痛点​&#xff1a;当加载10GB的CSV文件时&#xff0c;Files.readAllLines()抛出OutOfMemoryError&#xff0c;该如何解决&#xff1f; 在Java中处理大文件是开发中的高频场景&#xff0c;尤其在大数据、日志分析等领域。本文将深入探讨几种高效处理大文件的方案&#x…

Word双栏英文论文排版攻略

word写双栏英文论文的注意事项 排版首先改字体添加连字符还没完呢有时候设置了两端对齐会出现这样的情况&#xff1a; 公式文献 等我下学期有时间了&#xff0c;一定要学习Latex啊&#xff0c;word写英文论文&#xff0c;不论是排版还是公式都很麻烦的&#xff0c;而Latex一键就…

esp-idf ubuntu环境配置

常用命令 source ~/esp/esp-idf/export.shidf.py --list-targets idf.py set-target 将清除 build 目录&#xff0c;并重新生成 sdkconfig 文件&#xff0c;原来的 sdkconfig 文件保存为 sdkconfig.old。 idf.py build idf.py flashNo module named pip wget https://bootst…

BFS入门刷题

目录 P1746 离开中山路 P1443 马的遍历 P1747 好奇怪的游戏 P2385 [USACO07FEB] Bronze Lilypad Pond B P1746 离开中山路 #include <iostream> #include <queue> #include <cstring> using namespace std; int n; int startx, starty; int endx, endy; …

Cypress + TypeScript + Vue3

🚀 从零构建 Cypress + TypeScript + Vue3 组件测试环境【详细实战教程】 组件测试是前端开发中不可忽视的一环,它能够帮助我们在开发阶段就发现 UI 与交互逻辑问题。本文将带你手把手搭建基于 Cypress + TypeScript + Vue3 的组件测试环境,包含完整目录结构、配置文件、组…

车辆检测算法在爆炸事故应急响应中的优化路径

视觉分析赋能车辆管控&#xff1a;以山东应急场景为例 背景&#xff1a;应急场景下的车辆管控痛点 近期山东多起爆炸事故暴露了应急响应中的车辆管理短板&#xff1a;消防车、救护车因违停车辆堵塞通道&#xff0c;违规车辆闯入事故核心区&#xff0c;传统监控系统依赖人工识别…

【小沐杂货铺】基于Three.JS绘制太阳系Solar System(GIS 、WebGL、vue、react,提供全部源代码)第2期

&#x1f37a;三维数字地球系列相关文章如下&#x1f37a;&#xff1a;1【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第一期2【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第二期3【小沐学GIS】…

π0论文阅读

https://www.physicalintelligence.company/download/pi0.pdf 模型输出的token&#xff0c;接diffusion模型&#xff0c;相比自OpenVLA那样的回归模型解码出action&#xff0c;输出更快&#xff0c;精度也会更高。 一、动作专家模块与流匹配&#xff08;Flow Matching&#xf…

安全漏洞修复导致SpringBoot2.7与Springfox不兼容

项目基于 springboot2.5.2 实现的&#xff0c;用 springfox-swagger2 生成与前端对接的 API 文档&#xff1b;pom.xml 中依赖如下 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId>&l…

VisionPro —— 不规则胶路检测

简介 本文介绍了一种基于Cognex视觉工具的胶路检测方法&#xff0c;分为直线和弧形两部分检测。 直线部分采用卡尺工具检测胶路宽度&#xff0c;通过动态调整仿射矩形区域进行多位置测量&#xff1b;弧形部分使用blob工具沿圆周设置检测区域。 两种方法均通过脚本实现工具映…

QT中更新或添加组件时出现“”qt操作至少需要一个处于启用状态的有效资料档案库“解决方法”

在MaintenanceTool.exe中点击下一步 第一个&#xff1a; 第二个&#xff1a; 第三个&#xff1a; 以上任意一个放入资料库中

【PyQt5】从零开始的PyQt5 - QLabel篇

从零开始的PyQt5 - QLabel篇 引言一、简述二、例程2.1 显示到QWidget窗口上2.2 重新设置Label大小和对齐方式2.3 添加内容&#xff0c;设置边框2.4 显示富文本 三、参考 引言 QLabel主要用于显示文本或图像&#xff0c;不提供用户交互功能。本文主要简述PyQt5中的QLabel以及展…