STM32F407寄存器操作(多通道单ADC+DMA)

article/2025/7/23 0:48:48

1.前言

又是半年没更新了,趁着端午放假有点时间,并且最近项目要用这块知识,我就顺带研究一下ADC吧。

一般来说ADC主要用法包含了1.单通道软件触发(这是最简单和最常用的用法)2.单通道多次采集(需要快速采集数据,常见应用场景就是示波器)3.多通道采集(多个传感器数据)。

其中1、2我在前面的文章里也都介绍过了,这次我就说一说多通道采集。若是不能使用多通道采集,那么407里面两个ADC只能用两个通道,非常浪费。而407内一个ADC包涵16个通道,如此多的通道量基本能覆盖大部分应用场景了。

OK,那么废话不多说,下面我们正式开始介绍。

2.理论介绍

首先我们看看手册上关于这块的描述

这次我就以规则通道为例了,我们所有数据应该都是存放在DR寄存器里,这就会导致一个问题——数据覆盖。因此我们使用扫描模式时必须要用DMA配合使用。理论上来说如果全部使用注入通道,配置会比较简单,因为每个注入通道ADC都有保存的寄存器。不过这次教程我还是以较难的规则通道为例,一次性解决这个问题。

我们看到手册上对于扫描模式的开启只需要关注ADC->CR1里的SCAN,还是比较简单的。

我们看到CR1寄存器里,SCAN是第八位

给第八位置1即可

3.ADC配置

3.1ADC初始化

我首先把程序放出来,这里我用的是通道0和通道3

void init_adc1()
{init_adc12_chinal(0);	//初始化通道0init_adc12_chinal(3);	//初始化通道3ADC1->CR1&=~(3<<24);	//15 ADCCLK 周期ADC1->CR1|=(1<<8);		//扫描模式ADC1->CR2&=~(1<<1);		//单次转换ADC1->CR2&=~(1<<11);	//数据右对齐ADC1->CR2&=~(3<<28);	//禁止触发检测ADC1->SQR1&=~(0XF<<20);	//重置规则通道序重置列长度ADC1->SQR1|=1<<20;     	//2个转换在规则序列中//设置通道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个周期,提高采样时间可以提高精确度//ADC1->CR2|=1<<8;			//使能DMA模式ADC1->CR2|=1<<0;	   	//开启AD转换器	  
}

基本上没有什么特殊的,按照手册上描述的,给第8位置1

记得把要使用的ADC通道初始化好,配置好采样时间,通道数量正确即可

然后是触发的程序

void adc1_scanf(void)
{ADC1->SQR3=0;	//重置规则通道转换配置ADC1->SQR3|=0<<0;	//设置第一次规则转换通道0ADC1->SQR3|=3<<5;	//设置第二次规则转换通道3ADC1->CR2|=1<<30;	//开始转换
}

与软件触发类似,就是要多配置一个通道

3.2主程序

主程序里我们依次初始化DMA,ADC然后触发一次ADC即可

int main(void)
{Stm32_Clock_Init(336,25,2,7);//设置时钟,168MhzNVIC_SetGroup(1);//设置中断分组,分组1init_PinClock();//初始化所有时钟delay_init(168);//初始化延时init_DMAClock();//初始化DMA时钟init_DMA2_S0C0(2);//DMA2 ADC1转换init_adc1(0);//初始化ADCadc1_scanf();//触发ADC
}

3.3测试

我们首先要看一下ADC程序是否正确

那么改如何测试呢?我们外部通道是PA0和PA3,我们的转换顺序是PA0-PA3。那么我们首先将PA3接地,那么程序运行结束后ADC的DR寄存器里应该是最后一次转换的数据,即PA3管脚的电压,但是因为PA3接地的,那么DR寄存器里首先应该是PA0的浮空值,之后应该被PA0覆盖为0。之后我们再把PA0接地,同理DR寄存器里应首先是PA0管脚的0,之后被覆盖为PA3的浮空值。

OK,我们来测试一下,首先把PA3接地。

可以看到DR寄存器内的数据为0

之后我们再把PA0接地

数据也是正常的浮空数据了

4.DMA配置

下面我来说说加上DMA后该怎么写,配合上DMA后ADC读取到的数据就不会丢失了,所有的数据都可以正常读取进RAM里,而且没有什么标志位,比较简单。

4.1DMA初始化

程序如下,与上一次篇配置是一样的,这里不做过多的介绍了

unsigned short adc_scanf[5];//初始化DMA2 组0 通道0
//ADC1
void init_DMA2_S0C0(unsigned int ADCDMAWei)
{DMA2_Stream0 ->CR   = 0;//禁止数据流 ,才能写寄存器 //外设地址寄存器//将所需寄存器的地址放入PAR寄存器DMA2_Stream0 ->PAR  = (unsigned int)(&ADC1->DR);//数据流地址寄存器//M1AR仅在双通道模式下有用//将数据所在地址给M0AR寄存器DMA2_Stream0 ->M0AR = (unsigned int)(&adc_scanf);DMA2_Stream0 ->NDTR = ADCDMAWei;			// 一次传输数量      DMA2_Stream0 ->FCR  = 0x21;		//FIFO所有配置失效DMA2_Stream0 ->CR |= 0<< 6;		//外设到储存器模式//循环模式//当NDTR寄存器减到0时自动重装//单次模式(普通模式)//NDTR减到0后停止DMADMA2_Stream0 ->CR |= 0<< 8;   //非循环模式DMA2_Stream0 ->CR |= 0<< 9;   //外设非增量模式DMA2_Stream0 ->CR |= 1<<10;   //存储器增量模式,指针增加,可用于传输数组DMA2_Stream0 ->CR |= 1<<11;		//外设数据长度:16位DMA2_Stream0 ->CR |= 1<<13;		//存储器数据长度:16位DMA2_Stream0 ->CR |= 2<<16;   //高等优先级//突发传输//DMA占用CPU总线时间,此时CPU无法工作//一个节拍:传输多少次32位变量//应用场景:从ram里读出字节DMA2_Stream0 ->CR |= 0<<21;   //外设突发单次传输DMA2_Stream0 ->CR |= 0<<23;   //存储器突发单次传输DMA2_Stream0 ->CR |= 0<<25;   //通道0DMA2_Stream0 ->CR |= 1<<0;    //使能数据流
}

4.2ADC初始化修改

ADC这里我们需要把CR2里DMA置1

程序如下

void init_adc1()
{init_adc12_chinal(0);	//初始化通道0init_adc12_chinal(3);	//初始化通道3ADC1->CR1&=~(3<<24);	//15 ADCCLK 周期ADC1->CR1|=(1<<8);		//扫描模式ADC1->CR2&=~(1<<1);		//单次转换ADC1->CR2&=~(1<<11);	//数据右对齐ADC1->CR2&=~(3<<28);	//禁止触发检测ADC1->SQR1&=~(0XF<<20);	//重置规则通道序重置列长度ADC1->SQR1|=1<<20;     	//2个转换在规则序列中//设置通道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个周期,提高采样时间可以提高精确度ADC1->CR2|=1<<8;			//使能DMA模式ADC1->CR2|=1<<0;	   	//开启AD转换器	  
}

主函数里面使用方法也是一样的

4.3测试 

首先把PA0接地

可以看到第0位数据为0了

然后再把PA3接地

可以看到第1为是0了

5.结语

STM32F407多通道扫描模式至此就结束了,整个过程还是比较简单的。这样一来ADC的使用范围也比较大了。在此之外ADC还有一个非连续扫描模式,那么我们下一篇文章去看。那么好的,还是老样子,有什么问题评论区见,我们下一篇文章见。


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

相关文章

RuoYi前后端分离框架实现前后端数据传输加密(二)之前端篇

一、背景 本文是RuoYi前后端分离框架实现前后端数据传输加密(一)之后端篇文章配套的,主要介绍前端对自定义字段传输加密的实现,两篇文章结合可以完整的完成RuoYi前后端分离框架对API通信过程中实现自定义字段加密传输。前端的加解密实现,不涉及到界面的修改,仅仅是方法的…

马斯克称不想为美政府所做一切担责 “政府效率部”成替罪羊

美国企业家埃隆马斯克在接受哥伦比亚广播公司采访时表达了对政府的看法。他表示自己并不想公开反对美国政府,但也不愿意为政府所做的一切承担责任。马斯克提到,他领导的“政府效率部”成了所有问题的替罪羊,所有的裁员无论真假都被归咎于这个部门。马斯克还表示,他对国会共…

苏超第三轮全部战罢 南通队强势领跑

6月1日晚9时28分,江苏省城市足球联赛第三轮结束。本轮赛事分为两个比赛日进行。5月31日,镇江队0∶2不敌宿迁队,常州队0∶1负于扬州队,徐州队2∶1战胜连云港队。6月1日,盐城队1∶0击败淮安队,泰州队0∶4输给南通队,南京队与无锡队的比赛以1∶0结束。本轮联赛中,南通队和…

节后粽子有买三送一还有6折出售 促销力度大吸引顾客

作为传统节令食品,粽子在今年端午节期间再次成为餐桌主角。与往年不同的是,除了经典的“咸甜之争”外,“低卡”、“低脂”等健康概念成为今年粽子市场的新亮点。据《2025中国粽子行业白皮书》,从规模上来看,2025年中国粽子行业市场规模将达到110亿元,增长率在7%左右,产量…

泽连斯基再提乌俄领导人会晤 需达成具体协议

据法新社报道,俄罗斯总统新闻秘书佩斯科夫周三对乌克兰总统泽连斯基呼吁举行美俄乌三国领导人会谈一事作出回应。佩斯科夫表示,只有在俄乌双方达成具体协议后,才有可能举行此类会谈。他强调,这样的会谈应是乌克兰和俄罗斯代表团之间达成具体协议的结果。此前,乌克兰总统泽…

3、禁止树莓派屏幕休眠,设置树莓派屏幕常亮

树莓派是微型电脑&#xff0c;系统自带休眠保护功能&#xff0c;但是有人可能会处理一些事务&#xff0c;想树莓派屏幕常亮&#xff0c;保证树莓派一直都处于活动状态&#xff0c;今天分享如何让树莓派屏幕常亮&#xff0c;禁止休眠的解决方案。 1、 系统&#xff1a;raspbia…

巴黎欧冠夺冠狂欢夜559人被捕 暴力事件引发谴责

法甲球队巴黎圣日耳曼在5月31日晚赢得欧冠联赛冠军奖杯,法国多地的球迷彻夜庆祝。然而,据法国内政部消息,在狂欢夜有559人因滋事被捕,并发生了两起命案。6月1日,法国总统马克龙在爱丽舍宫接见巴黎圣日耳曼球队时,严厉谴责了庆祝活动中发生的暴力事件,称这些行为“不可接…

英国耗资百亿英镑新建核潜艇 备战状态升级

英国首相斯塔默表示,他将“恢复英国的战备状态”,并将提高英国的武器生产能力。6月2日,英国政府发布了《战略国防评估》,这份报告评估了英国面临的威胁,包括俄乌冲突及美国总统特朗普向北约盟国施压,要求提高国防开支及加强防御等情况。该报告呼吁英国武装部队进入“备战…

飞牛fnNAS装机之迷你小主机的利旧

前几天找Console线的时候,翻出一台迷你小主机,想起来以前是做“软路由”用的,现在用不上了。本想放回箱子,但突然想起最近正在做飞牛NAS的专题,不如将其改造成NAS得了。 这个东东有HDMI、VGA接口,2个USB(其中一个支持3.0),还有4个网口。 打开机盖,看看内部情况。发现…

2025年渗透测试面试题总结-奇安信[校招]奇安信观星实验室(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 奇安信[校招]奇安信观星实验室 1. 跟过的大型应用软件CVE漏洞 2. 容器虚拟化漏洞研究 3. 系统审计案例与漏…

郑钦文法网对阵萨巴伦卡 山海皆可平

6月1日,在法国网球公开赛女单第四轮比赛中,中国选手郑钦文以2比1战胜俄罗斯选手萨姆索诺娃,首次闯入法网女单8强。赛后,郑钦文发文:“人都应该有梦,有梦就别怕痛,是一颗宝石就该闪烁”,并鼓励大家勇敢追梦。在另一场1/8决赛中,头号种子萨巴伦卡把握住第八个赛点,以7-…

英首相称将恢复英国战备状态 提升武器生产能力至战时水平

英国首相基尔斯塔默表示,将恢复英国的“战备状态”,以此作为武装部队的核心目标。他表示,英国将把武器生产能力提升至战时水平。斯塔默在《太阳报》刊文称,英国正面临一个更加危险的世界,现在是时候改变保卫这些岛屿的方式了。斯塔默强调,英国将直面这一时刻,采取大多数…

动态规划第二弹:路径类问题(不同路径,珠宝的最高价值,地下城游戏)

目录 前言 1. 不同路径 &#xff08;1&#xff09;题目及示例 &#xff08;2&#xff09;解题思路 &#xff08;3&#xff09;代码 2. 珠宝的最高价值 &#xff08;1&#xff09;题目及示例 &#xff08;2&#xff09;解题思路 &#xff08;3&#xff09;代码 3. 地下…

LabVIEW双光子显微镜开发

基于LabVIEW 开发高性能双光子显微镜系统&#xff0c;聚焦于生物样本深层成像与纳米材料三维表征。实现了超快激光控制、多维数据采集与实时图像重建。系统采用飞秒激光光源与高精度振镜扫描模块&#xff0c;结合 LabVIEW 的 FPGA 实时控制能力&#xff0c;可对活体组织、荧光纳…

C++校园植树节活动 全国信息素养大赛复赛决赛 C++小学/初中组 算法创意实践挑战赛 内部集训模拟题详细解析

C++校园植树节活动 全国信息素养大赛 C++复赛/决赛模拟训练题 博主推荐 所有考级比赛学习相关资料合集【推荐收藏】1、C++专栏 电子学会C++一级历年真题解析电子学会C&#

题海拾贝:压缩字符串

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 欢迎点赞&#xff0c;关注&am…

Golang——3、流程控制语句

流程控制语句 1、if-else(分支语句)2、for(循环语句)3、for range(键值循环)4、switch-case(分支语句)5、break跳出循环6、continue(跳过本次循环)7、goto(跳转到指定标签) Go语言中最常用的流程控制有if和for&#xff0c;而switch和goto主要是为了简化代码、降低重复代码而生的…

第14讲、Odoo 18 实现一个Markdown Widget模块

目录 模块概述安装与配置前端实现详解依赖库分析使用示例与最佳实践技术架构与设计模式分析总结 模块概述 模块地址https://apps.odoo.com/apps/modules/18.0/web_widget_markdown Odoo 18 Markdown Widget 是一个为 Odoo 18.0 社区版开发的全局通用模块&#xff0c;它允许…

乌方袭击俄机场画面曝光 乌克兰最大胆军事行动

乌克兰官员周日宣布,乌克兰军队对俄罗斯境内深处的多个军用机场发动了大规模无人机袭击。这些机场是用于进行空袭的战略轰炸机基地,这次行动被认为是自俄乌冲突爆发以来乌克兰军队最大胆的军事行动之一。乌克兰安全局官员透露,此次代号为“蛛网”的袭击行动历时一年半准备。…

22. Generate Parentheses

题目描述 22. Generate Parentheses 回溯法 class Solution {vector<string> res;string cur; public:vector<string> generateParenthesis(int n) {backtrack(n,0,0);return res;}void backtrack(int n,int left_count,int right_count){if(cur.size() 2*n){…