校准
STM32的ADC分为三种状态:掉电状态、上电状态、工作状态。
当芯片启动运行时,ADC处于掉电状态。当第一次将ADON位设定为1时,ADC从掉电状态进入上电状态,也就是手册里说的“从掉电状态下唤醒”,这时ADON位已经为1。当我们再次设定ADON位等于1时,这时ADC会按照此时的ADC_CR1、ADC_CR2等寄存器的设置开始转换工作,也就进入了工作状态。这也就是下图红框中话的含义。
接下来再分析HAL_ADCEx_Calibration_Start这个函数,通过一层一层查找,方知这个函数之所以要放在HAL_ADC_Start()之前或HAL_ADC_Stop()之后是因为这个函数本身就会执行将ADON置1这么一条语句。
也就是,执行自校准时ADC必须处于前面所说的上电状态,如果ADC在工作状态下——正在转换或者进行过转换——则要将ADON位清零,使ADC关闭进入掉电状态下,之后再将ADON置1,进入上电状态,之后再校准,再之后该注入组的注入该规则组的SCAN。也就是函数的使用说明和英文版的参考手册并不矛盾,而是TMD ST根本就没把这个说清楚!
接下来在顺便说一下为什么当ADON=1时再次设定置ADON位为1会进入工作状态(知道的就不必往下看了)
原因就是这句话
看过正点原子教程的应该都有这个印象,在ADC转换实验中原子将ADC_CR2的EXTSEL位设定为111,将EXTTRIG位设定为1,之后通过SWSTART位置1的方式来启动转换。其实根本不用这么复杂,只需要将ADON再置1就可以启动转换,无论这个转换是单个通道还是还是通道组,效果与软件触发方式完全一样。
规则组连续转换:
其实这里的单次转换模式和连续转换模式讲的都是针对1个通道的,而规则组多通道的转换在手册里其实是叫扫描模式(还有另外一个间断模式),然后扫描模式里再按照CONT位的不同分为单次转换模式和连续转换模式。
文档里的目录层次结构如果是这样会更利于阅读和理解。
中文参考手册里关于扫描模式使用DMA的传输时间写错了
正确的应该是
只要ADC_DR更新就会进行传递。而ADC_DR会在每个通道转换完后就更新。同时,这里也明确指出,使用扫描模式必须使用DMA。
关键字:stm32 ADC校准 单次转换
引用地址:
stm32ADC校准和连续单次转换的理解
推荐阅读最新更新时间:2024-03-16 16:11
基于STM32单片机FSMC协议分析
1. FSMC协议分析 如下为ILI9325的8080接口的协议 从图中可以看出8080接口的协议大概流程是:先发出片选信号,然后发出命令使能或者数据使能信号,待数据建立完成后,在读写信号的上升沿写入数据或者读出数据。 CS(片选信号):低电平片选有效,高电平失能(默认为高:失能) RS(数据/命令):低电平写命令,高电平写数据(默认为高:写数据)FSMC默认为低。。。。 RD(读信号) :低电平有效,上升沿写入数据,高电平失能(默认为高,失能) WR(写信号) :低电平有效,上升沿写入数据,高电平失能(默认为高,失能) FSMC写SRAM模式如下: FSMC对于类RAM存储器的读操作过程一般是:先发出片选信号、读写信号和
[单片机]
时钟控制RCC应用与详细解析
时钟控制RCC 为什么需要时钟系统? 时钟系统就像一个中枢神经,驱动着芯片上所有的器件在同一时间按照特定的工作频率进行工作。我认为时钟系统有如下功能: ① 时钟系统相当于一个“频率适配器”。我们生活中常用的是电压适配器,全球每个国家的工频电压不太一样,我们如果到这些国家旅行不可能带适配于特定国家的电源充电器吧,这太繁琐了,要实现“一器多用”,就要有适配器的概念。在STM32中,有许多器件,这些器件在工作时需要的频率不一样,例如:GPIO工作在性能状态时其工作频率是72MHz,但是如果把那么高的频率用在ADC采样(工作的最大频率为14MHz)上就直接完犊子了,我们知道ADC是“模拟量- 数字量”,过高的频率会导致采样失真,就相当
[单片机]
stm32单片机进入休眠(STOP)模式后无法下载程序等问题解决
利用stm32单片机的休眠模式,使单片机间歇的休眠从而实现低功耗的目的。往往会出现进入休眠后无法唤醒,导致下一次程序烧不进去。通常的解决办法是:一般的开发板或单片机最小系统都会有复位键,按住复位键,点下载,然后松开复位键即可。 我遇到的问题是:误入了stm32(STM32L051C6T6)的STOP模式,又没有写入相应的唤醒方法,导致后续的程序不能下载。使用MDK5 点击load时总会出现No target connected。自己设计的最小系统又没有加入复位键。。。 有以下几种解决办法: 1、可以将单片机的NRST引脚引出来,外接复位键。(关于引脚查看可用ST官方软件STM32cubeMX,很方便) 2、通过IS
[单片机]
Ubuntu下安装Stm32的Eclipse的开发环境(1)
在Ubuntu下安装Stm32的Eclipse的开发环境(1)安装过程中发现了 然后我又在网上Ubuntu下安装Stm32的Eclipse的开发环境(2)的文章 执行 apt-get install openjdk-6-jre-headless 这些这个命令还是安装不成功 然后我就在网上找了一个下更新源的方法 很明显没有安装成功 但是能识别找到这个软件包 更新方法 https://blog.51cto.com/wellfinger/303748 我转载过了 Ubuntu下安装Stm32的Eclipse安装——ubuntu更新源(含9.10和10.04) 其中 sudo apt-get upgrade 这个该过程比较久
[单片机]
关于STM32的ADC的扫描模式
下面这张截图是 我看的 STM32参考手册的关于ADC状态寄存器ADC1_SR的资料 我经过参考网上的资料 感觉EOC位 好像是每个通道转换结束 置位。而不是像书上这样说的 通道组转换结束时置位。 就像扫描模式,应该是每一个通道转换完就置一次,而不是等所有的通道都结束了才置位的。 不知道我理解的对不对? 书上写错了的? 1L: 额!这个还真不知道 2L(版主): 回复【楼主位】 utopia779 : --------------------------------- 这个要实验一下了.以实际实验结果为准. 3L: 应该是每一个通道转换完就置一次 这样的话DMA才能在每个通道转换完立即取出数据
[单片机]
stm32 ssD1306 OLED驱动架构
#include oled.h #include stdlib.h #include oledfont.h #include delay.h //OLED的显存 //存放格式如下. // 0 1 2 3 ... 127 // 0 1 2 3 ... 127 // 0 1 2 3 ... 127 // 0 1 2 3 ... 127 // 0 1 2 3 ... 127 // 0 1 2 3 ... 127 // 0 1 2 3 ... 127 // 0 1 2 3 ... 127 u8 OLED_GRAM ; //更新显存到LCD void OLED_Re
[单片机]
STM32在线升级IAP-IAP的介绍
IAP(In Application Programming)即在应用编程,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。 通常实现IAP功能时,即用户程序运行中作自身的更新操作,需要在设计固件程序时编写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通过某种通信方式(如USB、USART)接收程序或数据,执行对第二部分代码的更新;第二个项目代码才是真正的功能代码。这两部分项目代码都同时烧录在User Flash中,当芯片上电后,首先是第一个项目代码开始运行,它作如下操作: 1)检查是否需要对第二部分代码进行更新
[单片机]
一文全面掌握stm32的GPIO知识
1 初学者重要提示 本文主要是以stm32H7系列为主。 对于不使用的引脚,推荐设置为模拟模式,悬空即可。 GPIO的速度等级高的时候,最好使能IO补偿单元。 2 GPIO功能简介 STM32H7的GPIO特性如下: 输出状态:开漏/推挽 + 上拉/下拉电阻。 通过输出数据寄存器(GPIOx_ODR)或者外设(GPIO设置为复用模式时)输出数据。 GPIO速度等级设置。 输入状态:浮空,上拉/下拉,模拟。 通过输入数据寄存器(GPIOx_IDR)或者外设(GPIO设置为复用模式)输入数据。 通过寄存器GPIOx_BSRR实现对寄存器GPIOx_ODR的位操作。 通过配置寄存器GPIOx_LCKR的锁机制,实现冻结IO口配置。
[单片机]