STM32-寄存器ADC配置指南

目录

输入方式:

模拟看门狗功能:

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;//开启HSI14while(!(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 3ADC1->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.mzph.cn/web/48721.shtml

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

相关文章

手写数字识别(机器学习)

一:一对多分类方法(one-vs-all) 这里先上的代码,想看原理可以到代码下面。 在数据集中,y的取值为1~10,y10表示当前数字为0 首先读取数据,并对数据进行切分。 import pandas as pd import numpy as np import matplotlibmatplo…

【BUG】已解决:IndexError: positional indexers are out-of-bounds

IndexError: positional indexers are out-of-bounds 目录 IndexError: positional indexers are out-of-bounds 【常见模块错误】 【解决方案】 原因分析 解决方法 示例代码 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博…

JavaScript:数组排序(冒泡排序)

目录 一、数组排序 二、sort()方法 1、基本语法 2、默认排序 3、自定义排序 三、冒泡排序 1、基本概念 2、实现步骤 3、过程解析 4、代码示例 5、时间复杂度 一、数组排序 对一个给定数组进行处理,使其从无序变为有序,这个过程就是数组排序&…

二叉树基础及实现(二,加经典OJ)

目录: 一 .接引二叉树(一) 二 .二叉树相关oj题: 1. 检查两颗树是否相同 2. 另一颗树的子树 3. 翻转二叉树 4. 判断一颗二叉树是否是平衡二叉树 5. 对称二叉树 6. 二叉树的构建及遍历 7. 二叉树的分层遍历 8. 给定一个二叉树, 找到该树中两个指定节点的最…

Fine-BI学习笔记

官方学习文档:快速入门指南- FineBI帮助文档 FineBI帮助文档 (fanruan.com) 1.零基础入门 1.1 功能简介 完成四个流程:新建分析主题、添加数据、分析数据、分享协作。 示例数据获取:5分钟上手FineBI - FineBI帮助文档 (fanruan.com) 1.2 …

R语言优雅的进行广义可加模型泊松回归分析

泊松回归(Poisson regression)是以结局变量为计数结果时的一种回归分析。泊松回归在我们的生活中应用非常广泛,例如:1分钟内过马路人数,1天内火车站的旅客流动数,1天内的银行取钱人数,一周内的销…

【已解决】如何使用母版视图统一PPT格式?

母版视图在PPT中是一个强大的工具,可以帮助我们统一幻灯片的格式、布局和设计风格。今天来看看如何利用母版视图统一PPT格式,让每张幻灯片看起来一致和专业。 第一步:打开母版视图 打开PPT后,在顶部菜单栏中,选择【视…

Docker容器限制内存与CPU使用

文章目录 Docker 容器限制内存与 CPU 使用内存限额内存限制命令举例使用 `nginx` 镜像学习内存分配只指定 `-m` 参数的情况CPU 限制命令举例验证资源使用Docker 容器限制内存与 CPU 使用 在生产环境中,为了保证服务器不因某一个软件导致服务器资源耗尽,我们会限制软件的资源…

windows服务器启动apache失败,提示请通过cmd命令行启动:net start apache

Windows Server 2012 R2服务器突然停止运行apche,启动apache失败,提示请通过cmd命令行启动:net start apache 1.报错截图: 进入服务里输入命令启动也不行,提示由于登录失败而无法启动服务。 2.问题原因: 服务器www用…

Node.js知识点总结

Node.js知识点总结 Node.js其本质和浏览器一样是一个JavaScript运行环境。浏览器的运行环境为V8引擎浏览器内置API(BOM、DOM、Canvas);而node.js的运行环境是V8引擎node提供的API(fs、path、http)。它使JavaScript可以编写后端。 基本知识 fs文件系统模块 它提供一…

springboot宠物相亲平台-计算机毕业设计源码16285

目 录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2 开发环境及相关技术介绍 2.1 MySQL数据库的介绍 2.2 B/S架构的介绍 2.3 Java语言 2.4 SpringBoot框架 3 宠物相亲平台系统分析 3.1 可行性分析 3.1.1 技术可行性分析 3.1.2 经济…

基于FPGA + Qt + OpenCv的人脸考勤系统

一:界面设计 客户端界面设计: 服务端界面设计: 简介:首先服务端在注册界面先注册人脸,然后客户端界面进行人脸识别,将人脸识别的图像发送给服务端以后,服务端在图像数据库里寻找人脸比对,若有数据就将查询到的个人信息发送给客户端,并在客户端显示,查询界面是用来查…

Ribbon负载均衡与内核原理

什么是Ribbon? 目前主流的负载方案分为两种: 集中式负载均衡,在消费者和服务提供方中间使用独立的代理方式进行负载,有硬件的(比如F5),也有软件的(Nginx)客户端根据自己的请求做负…

开放式耳机哪种性价比高?五大高口碑优质款式耳机直入!

​或许我们的日常生活中充满了噪声,例如马路、地铁还有公交上,嘈杂的声音会影响我们的心情,同时还会损伤我们的耳朵,在嘈杂的环境中,想听歌想煲剧了怎么办,又不想沉浸在自己的世界里,就可以使用…

rk3588s 定制版 USB adb , USB2.0与USB3.0 区别,adb 由typeC 转换到USB3.0(第二部分)

硬件资源: rk3588s 核心板定制的地板 软件资源: 网盘上的 android12 源码 1 硬件上 客户只想使用 type c 接口中的 usb2.0 OTG 。在硬件上,甚至连 CC芯片都没有连接。 关于一些前置的知识。 1 USB2.0 与 USB3.0 的区别。 usb3.0 兼容2.0 …

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第四十九章 平台总线总结回顾

i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

EEtrade:现货黄金盈利计算方法

现货黄金交易作为一种极具吸引力的投资方式,其盈利计算涉及多个关键因素,投资者需深入理解这些因素,才能准确评估交易结果,并制定科学的投资策略。 一、现货黄金基本盈利计算: 利润公式: 利润 (收盘价 -…

深入浅出mediasoup—WebRtcTransport

mediasoup 提供了多种 transport,包括 WebRtcTransport、PipeTransport、DirectTransport、PlainTransport 等,用来实现不同目的和场景的媒体通信。WebRtcTransport 是 mediasoup 实现与 WebRTC 客户端进行媒体通信的对象,是 mediasoup 最重要…

如何学习Airflow:糙快猛的大数据之路(附思维导图)

什么是Airflow? 在开始之前,让我们先简单了解一下Airflow是什么。Apache Airflow是一个开源的工作流管理平台。它允许你以代码的方式定义、调度和监控复杂的数据处理管道。 想象一下,你有一系列需要按特定顺序执行的任务,而且这些任务之间还有依赖关系,Airflow就是为解决这…

SpringBoot自动配置(面试重点)

自动配置是指: 自动配置是指在应用程序启动时,SpringBoot根据classpath路径下的jar包自动配置应用程序所需的一系列bean和组件,从而减少开发者的配置工作,提高开发效率。 一:Condition Condition是spring4.0之后添加…