STM32-寄存器ADC配置指南

news2024/12/27 18:42:31

目录

输入方式:

模拟看门狗功能:

ADC中断

配置一个Demo

设置时钟

自校准

通道选择

采样时间选择

转换模式选择

断续模式

启动转换

软件触发

外部触发

转换结束

关于DMA

模拟看门狗

​编辑ADC数据位置​编辑


在STM32F中,ADC可配置分辨率 有12位,10位,8位,6位

ADC供电要求为 2.4V~3.6V

输入方式

-- 外部GPIO口16路输入

-- 内部温度传感器输入

-- 内部参考电压输入

--- 外部电池VBAT输入

模拟看门狗功能:

AWD模拟看门狗功能由在ADC_CFGR1寄存器的AWDEN位置位来开启,它可用于监控所选的单一通道或所有使能通道所配置的电压范围。

如果模拟电压转换由ADC高于高阈值或低于低阈值时,AWD模拟看门狗的状态为被置位,模拟看门狗中断可用设置ADC_IER寄存器中的AWDIE位来使能。

ADC中断

ADC中断可由一下任意事件产生

配置一个Demo

要求如下:配置ADC1IN1,ADC1IN2,ADC1IN3,使用内部专用14Mhz振荡器,过采样为7.5个ADC周期,由TIM1中断作为触发信号,DMA搬运

并且开启模拟看门狗监控ADC1IN1,阈值为3.3v~3.0v并且开启模拟看门狗中断

设置时钟

1.首先要设定ADC的时钟,需要注意的是ADC是双时钟架构,可以选择以下任意一个

选项1:专用的14MHz内部振荡器

选项2:PCLK时钟/2 或/4 最大不能超过14MHz

选项1的优势是ADC一直具有最佳的ADC采样频率,它还提供了为了节能,可自动打开/关闭内部14MHz振荡器的能力。

可以看到选项1的优点为快速,选项2优点为无抖动

从RCC的图里也可以看到HSI14为内部14Mhz专用振荡器独立于任何时钟

HSI14在SystemInit的时候已经被关掉了所以需要在用的时候再开启,在我上篇博客里有解释

STM32F0-标准库时钟配置指南

控制HSI14的寄存器为RCC_CR2

通过寄存器可以看到HSI14也需要校准,步骤为

1.HSI14ON=1,使能HSI14

2.等待HSI14DRY=1,等待HSI14就绪

3.HSI14DIS=0,允许ADC打开HIS14振荡器

经过这三步,HSI14就已经被打开而且可由ADC使用了。

使用HSI14需要注意ADC的这个功能

自动关断模式 (AUTOFF)
        ADC 含有一个本身电源自动管理的功能,该功能为自关断模式。当设置 ADC_CFGR1 寄存器中的 AUTOFF=1 时,开启该功能。
        当AUTOFF=1时, 无转换时ADC经常自断电;转换开始(由软件或硬件触发)时ADC自动唤醒。一个启动时间在触发开始转换与采样之间自动插入。一旦序列转换结束后 ADC 自动关闭。自动关断模式可大大降低应用的功耗, 其适用于需要相对较少转换或转换请求的时间间隔足够长 ( 如低频的硬件触发 ) 的应用。

自校准

2.注意在开启ADC之前需要进行自校准,否则无法使用ADC,在校准期间,ADC计算一个用于ADC校准的7为校准因子(ADC掉电后丢失),在ADC校准期间和校准未完成前,不能使用ADC模块。

校准是由软件设置ADCAL=1来初始化,且只能在ADC禁用(ADEN=0)时完成初始化,校准完成后,ADCAL被硬件清0,校准完成后可由ADC_DR的[6:0]读出校准因子。

使用ADC_CR寄存器完成自校准

软件过程

确认ADEN=0

设置ADCAL=1

等待ADCAL=0

校准完成(可由ADC_DR的[6:0]读出校准因子)

 在ADC配置过程中需要注意

通道选择

通道可以选择:
●16个从GPIO引脚引入的模拟输入

●3个内部模拟输入(温度传感器ADC_IN16,内部参考电压ADC_IN17,VBAT通道ADC_IN18)

ADC可以选择单个或者多个序列

被转换的ADC在通道选择寄存器ADC_CHSELR 中编程选择

ADC扫描的通道顺序由ADC_CFGR1 中 SCANDIR 位的配置来决定:

● SCANDIR=0: 向前扫描 : 从通道 0 到通道 18.

● SCANDIR=1: 回退扫描:从通道 18 到通道 0        

采样时间选择

启动ADC之前,ADC需要在被测电压源内嵌采样电容间建立一个直接连接,采样时间必须足够长以便输入电压源对内嵌电容充电到输入电压水平。

 ADC采样事件对所有通道都适用,通过修改ADC_SMPR来确认采样时间

转换模式选择

单次转换模式

连续转换模式

寄存器如下

断续模式

 该模式由设置 ADC_CFGR1 寄存器中的 DISCEN 位来开启。 在这个模式(DISCEN=1)下,需要硬件或软件的触发事件去启动定义在一个序列中的每次转换。 相反,DISCEN=0 时 , 一个硬件或软件的触发事件就可以启动定义在一个序列中的所有转换。

即序列不是一次转换,而是一个一个转换,在每次触发的时候转换一个。

启动转换

软件触发

需要注意在硬件触发情况下也需要第一次开启ADSTART

ADSTART在

外部触发

一次转换或一个序列的转换可由软件或外部事件 ( 例如:定时器捕获、输入引脚 ) 触发。

输入引脚触发为:

定时器触发为:

设置触发位于

转换结束

状态寄存器会改变

关于DMA

对于减轻CPU负担,建议使用DMA等待和搬运ADC数据

        因为所有通道的转换结果数据存放到一个单一的数据寄存器中,故当转换通道超过 1 个时用
DMA 方式会更有效。这样可以避免丢失存在 ADC_DR 寄存器中的转换结果。

        DMA 模式开启时 (ADC_CFGR1 寄存器中的 DMAEN =1), 每次转换结束时都会产生一个
DMA 请求。这样就允许把在 ADC_DR 寄存器中的转换数据传送到软件指定的目标地址中。

        尽管如此,因 DMA 不能够及时为 DMA 请求服务而产生的过冲 (OVR=1) 时,ADC 就会停止
产生 DMA 请求且相应结果是新的转换数据也不会再由 DMA 进行传输 ( 当 OVR=0 时,会继
续传输 )。这也可以认为所有传输到 RAM 中的数据都是有效的 ( 因无效的数据再也不传输了 )。也就是DMA 传输请求会被阻止直到软件清除 OVR 位。

        根据 OVRMOD 位的配置,ADC_DR 寄存器中的数据可选择为:保持或覆盖。

有两种不同的 DMA 模式,其取决于 ADC_CFGR1 寄存器中的 DMACFG 位的配置:
        ● DMA 一次模式 (one shot mode)(DMACFG=0).
                当 DMA 编程用于传输固定长度的数据时,可选用该模式。在该模式下,每次使能仅进行一轮传输,一旦计数器的值减至0时,DMA传输会停止。想要再次传输,必须重新设置计数器CNDTR的数值。
        ● DMA 循环模式 (DMACFG=1)
                当 DMA 编程为循环模式或双缓冲模式时,可选用该模式。主要处理连续的数据传输,每进行一轮传输,计数器会被自动恢复为初始值,同时DMA传输进入下一轮,非常适合同ADC多通道(扫描)模式一起工作。

寄存器如下:

模拟看门狗

这里选择模拟看门狗监控通道
模拟看门狗中断在这里配置

模拟看门狗阈值寄存器:


ADC数据位置

以上是ADC的所有介绍,接下来开始写Demo
/*要求如下:配置ADC1IN1,ADC1IN2,ADC1IN3,使用内部专用14Mhz振荡器,过采样为7.5个ADC周期,由TIM1中断作为触发信号,DMA搬运
并且开启模拟看门狗监控ADC1IN1,阈值为3.3v~3.0v并且开启模拟看门狗中断。ADC分辨率为默认的12位*/
void Demo(void){
      //打开HSI14时钟
      RCC->CR2 |=  0x00000001;//开启HSI14
      while(!(RCC->CR2 |= 0x00000002));//等待HSI14稳定
      RCC->CR2 |= 0x00000004;//允许ADC打开HSI14       
      //ADC自校准
      ADC1->CR |= 0x00000001; //ADC禁用
      ADC1->CR |= 0x80000000; //开启自校准
      while((ADC1->CR |= 0x80000000)); //等待自校准完成
      //ADC通道选择
      ADC1->CHSELR |= 0x0000000E; //选择通道1 2 3
      ADC1->CFGR1 |= 0X00000004; //前向扫描
      //ADC采样时间选择
      ADC1->SMPR |= 0x00000001; //7.5个采样周期
      //转换模式选择
      ADC1->CFGR1 &= 0XFFFFDFFF; //单次转换模式
      ADC1 ->CFGR1 &= 0xFFFFF3FF; //外部触发禁止
      ADC1 ->CFGR1 &= 0xFFFFFE3F;//使用TIM1_TRGO作为触发事件源
      //开启模拟看门狗
      ADC1->ISR |= 0x00000080;//开启模拟看门狗中断
      ADC1->IER |= 0x00000080;//模拟看门狗中断使能
      ADC1 ->CFGR1 |= 0x4C00000;//模拟看门狗监视通道1 模拟看门狗使能 在单一通道上使能模拟看门狗
      ADC1->TR |=0xE8C0FFF;//阈值为 4095~3723 即3.3v~3.0v
      //DMA设置
      ADC1 ->CFGR1 |= 0x00000003;//DMA使能 循环模式
      //开始转换
      ADC1->CR &= 0xFFFFFFFE; //ADC解除禁用
      ADC1->CR |= 0x00000004; //开始转换
}

具体DMA配置见下篇博客介绍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1947626.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FM与AM的特点

1.是什么? FM(调频):通过改变载波频率来传递信息AM(调幅):通过改变载波的振幅来传递信息 2.分别有什么特点? 抗干扰能力: FM:由于FM信号的传输不依赖于载波的…

c++初阶知识——string类详解

目录 前言: 1.标准库中的string类 1.1 auto和范围for auto 范围for 1.2 string类常用接口说明 1.string类对象的常见构造 1.3 string类对象的访问及遍历操作 1.4. string类对象的修改操作 1.5 string类非成员函数 2.string类的模拟实现 2.1 经典的string…

【CI/CD】docker + Nginx自动化构建部署

CI/CD是什么 CI/CD 是持续集成(Continuous Integration)和持续部署(Continuous Deployment)或持续交付(Continuous Delivery)的缩写,它们是现代软件开发中用于自动化软件交付过程的实践。 1、…

自动驾驶系列—智能巡航辅助功能中的路口通行功能介绍

自动驾驶系列—智能巡航辅助功能中的车道中央保持功能介绍 自动驾驶系列—智能巡航辅助功能中的车道变换功能介绍 自动驾驶系列—智能巡航辅助功能中的横向避让功能介绍 自动驾驶系列—智能巡航辅助功能中的路口通行功能介绍 文章目录 2. 功能定义3. 功能原理4. 传感器架构5. 实…

【Redis进阶】集群

1. 集群分片算法 1.1 集群概述 首先对于"集群"这个概念是存在不同理解的: 广义的"集群":表示由多台主机构成的分布式系统,称为"集群"狭义的"集群":指的是redis提供的一种集群模式&…

牛客JS题(二)直角三角形

注释很详细&#xff0c;直接上代码 涉及知识点&#xff1a; repeat格式化字符串 题干&#xff1a; 我的答案 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"></head><body><div classtriangle><…

C++树形结构(1 基础)

目录 一.基础&#xff1a; 1.概念&#xff1a; 2.定义&#xff1a; Ⅰ.树的相关基础术语&#xff1a; Ⅱ.树的层次&#xff1a; 3.树的性质&#xff1a; 二.存储思路&#xff1a; 1.结构体存储&#xff1a; 2.数组存储&#xff1a; 三.树的遍历模板&#xff1a; 四.信…

【BUG】已解决:NameError: name ‘python‘ is not defined

NameError: name ‘python‘ is not defined 目录 NameError: name ‘python‘ is not defined 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于…

【TortoiseGit】合并单个commit(提交)到指定分支上

0、前言 当我们用Git的时候经常用到多个分支&#xff0c;会经常有如下情况&#xff1a;一个dev分支下面会有多个test分支&#xff0c;而每个test分支由不同的开发者。而我们会有这样的需求&#xff1a; 当某个test分支完成了相应功能验证&#xff0c;就要把成功验证的功能代码…

【Git】上传代码命令至codeup云效管理平台

通过git命令上传本地代码库至阿里的codeup云效管理平台的代码管理模块&#xff0c;使用方便&#xff0c;且比github上传网络环境要求低&#xff0c;超大文件&#xff08;>100M&#xff09;的文件也可以批量上传&#xff0c;且上传速度喜人。 目录 &#x1f337;&#x1f33…

[Vulnhub] Acid-Reloaded SQLI+图片数据隐写提取+Pkexec权限提升+Overlayfs权限提升

信息收集 IP AddressOpening Ports192.168.101.158TCP:22,33447 $ nmap -p- 192.168.101.158 --min-rate 1000 -sC -sV Not shown: 65534 closed tcp ports (conn-refused) PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 6.7p1 Ubuntu 5ubuntu1.3 (Ubuntu Lin…

【NOI-题解】1009 - 数组逆序1162 - 数组元素的删除1211 - 数组元素的插入1161. 元素插入有序数组1159. 数组元素的移动

文章目录 一、前言二、问题问题&#xff1a;1009 - 数组逆序问题&#xff1a;1162 - 数组元素的删除问题&#xff1a;1211 - 数组元素的插入问题&#xff1a;1161. 元素插入有序数组问题&#xff1a;1159. 数组元素的移动 三、感谢 一、前言 本章节主要对数组问题中数组元素移…

昇思25天学习打卡营第23天 | 基于MindSpore的红酒分类实验

学习心得&#xff1a;基于MindSpore的红酒分类实验 在机器学习的学习路径中&#xff0c;理解和实践经典算法是非常重要的一步。最近我进行了一个有趣的实验&#xff0c;使用MindSpore框架实现了K近邻&#xff08;KNN&#xff09;算法进行红酒分类。这个实验不仅加深了我对KNN算…

Jenkins+Gitlab持续集成综合实战

一、持续集成应用背景&#xff1a; DevOps&#xff1a;&#xff08;英文Development&#xff08;开发&#xff09;和Operations&#xff08;技术运营&#xff09;的组合&#xff09;是一组过程、方法与系统的统称&#xff0c;用于促进开发&#xff08;应用程序/软件工程&#…

设计模式|观察者模式

观察者模式是一种行为设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。当主题对象发生变化时&#xff0c;它的所有观察者都会收到通知并更新。观察者模式常用于实现事件处理系统、发布-订阅模式等。在项目中&#xff0c…

C语言 | Leetcode C语言题解之第279题完全平方数

题目&#xff1a; 题解&#xff1a; // 判断是否为完全平方数 bool isPerfectSquare(int x) {int y sqrt(x);return y * y x; }// 判断是否能表示为 4^k*(8m7) bool checkAnswer4(int x) {while (x % 4 0) {x / 4;}return x % 8 7; }int numSquares(int n) {if (isPerfect…

CSA笔记5-局域网yum源配置互联网yum源配置源代码编译安装

局域网yum源配置&#xff1a;建设一个本地网络仓库给本地局域网用户提供下载安装 互联网yum源配置&#xff1a;在线获取最新安装文件的通道 1.局域网web方式yum源配置&#xff1a; 服务器提供yum安装服务&#xff1a; yum install -y httpd 安装并启动httpd 在本地源的基…

Spring AOP(2)原理(代理模式和源码解析)

目录 一、代理模式 二、静态代理 三、动态代理 1、JDK动态代理 &#xff08;1&#xff09;JDK动态代理实现步骤 &#xff08;2&#xff09;定义JDK动态代理类 &#xff08;3&#xff09;代码简单讲解 2、CGLIB动态代理 &#xff08;1&#xff09;CGLIB 动态代理类实现…

RockyLinux 9 PXE Server bios+uefi 自动化部署 RockLinux 8 9

pxe server 前言 PXE&#xff08;Preboot eXecution Environment&#xff0c;预启动执行环境&#xff09;是一种网络启动协议&#xff0c;允许计算机通过网络启动而不是使用本地硬盘。PXE服务器是实现这一功能的服务器&#xff0c;它提供了启动镜像和引导加载程序&#xff0c;…

Java学习Day14:基础篇4

数组 1.理解数组 数组也是一种类型&#xff0c;引用类型&#xff01; 2.数组的定义 3.数组的初始化 静态&#xff1a; 动态&#xff1a; 不同数据类型数组初始化值&#xff1a; null不可用.equal方法&#xff0c;会报错&#xff01; 4.使用数组 5.foreach循环 6.深入数组 7&am…