前几天发过一篇帖子,叫:关于STM32 ADC自校准的个人理解文章大体说的是自校准前要先将ADON位置1,之后再校准。

本以为彻底的了解了自校准的过程,但是昨天晚上无意间看到了一个函数说明,不禁愁云又起,

<ignore_js_op> 
按照这个说明,使用这个自校准函数前应当使ADC处于掉电状态下,但是这样似乎就与英文的参考手册矛盾了。经过探查,方才知道ST的参考手册叙述文笔和结构编排是TM有多烂!

依据手册介绍,我将STM32的ADC分为三种状态:掉电状态、上电状态、工作状态。

当芯片启动运行时,ADC处于掉电状态。当第一次将ADON位设定为1时,ADC从掉电状态进入上电状态,也就是手册里说的“从掉电状态下唤醒”,这时ADON位已经为1。当我们再次设定ADON位等于1时,这时ADC会按照此时的ADC_CR1、ADC_CR2等寄存器的设置开始转换工作,也就进入了工作状态。这也就是下图红框中话的含义。
<ignore_js_op>

接下来再分析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会进入工作状态(知道的就不必往下看了)

原因就是这句话
<ignore_js_op> 
看过正点原子教程的应该都有这个印象,在ADC转换实验中原子将ADC_CR2的EXTSEL位设定为111,将EXTTRIG位设定为1,之后通过SWSTART位置1的方式来启动转换。其实根本不用这么复杂,只需要将ADON再置1就可以启动转换,无论这个转换是单个通道还是还是通道组,效果与软件触发方式完全一样。

接下来再说说规则组的连续转换。
昨天晚上一直在尝试这个,想在中断中读取多个通道的值,一直不成功,只能得到最后一个被转换通道的值,现在才发现,又TM被ST的参考手册坑!了!

关于连续转换模式,手册里是这么说的,
<ignore_js_op> 
一个规则通道被转换完毕后EOC会被置位同时进入中断。

但是,在ADC中断章节又是这么说的,
<ignore_js_op> 
一个通道组转换完毕后才进入中断,而非单个通道。这也就是说,当规则组采用中断方式时ADC_DR里必定放置的是最后被转换的那个通道的值。那么是不是上面那个连续转换模式的说明写错了。又前后翻了手册n遍发现不是。
<ignore_js_op> 
其实这里的单次转换模式和连续转换模式讲的都是针对1个通道的,而规则组多通道的转换在手册里其实是叫扫描模式(还有另外一个间断模式),然后扫描模式里再按照CONT位的不同分为单次转换模式和连续转换模式。
也就是,文档里的目录层次结构如果是这样会更利于阅读和理解。
<ignore_js_op> 
而不是像摊大饼一样全部放在同一级目录里。

现在我也才明白,为什么AN3116文档中那么强烈的建议规则通道组连续转换要使用DMA方式,因为用中断就是白瞎啊!!!!
另外,中文参考手册里关于扫描模式使用DMA的传输时间写错了
<ignore_js_op> 
正确的应该是
<ignore_js_op> 
只要ADC_DR更新就会进行传递。而ADC_DR会在每个通道转换完后就更新。同时,这里也明确指出,使用扫描模式必须使用DMA。

有句话叫:一流的翻译能把二流的文章翻译成一流的作品,二流的翻译能把一流的作品翻译成二流的文章,二流的文章如果碰到二流的翻译,只能成为三流的shit。在我看来ST属于最后这一种,尤其是 be set翻译成被设置,简直是梗到家了。

之前看着数据手册自学AVR时顺风顺水,错误和编排不当非常少,虽说STM32相比之下更复杂、产品线更长、页数更多但是参考手册里这么多明显的叙述错误和槽糕的层次结构就我这个门外汉也能看出来啊,这么多错误和含混不清简直就是残害生命、初学者的噩梦啊,撞墙的心都有了。那STM8和STVD更是一块烂豆腐,第一次见ERRATA能写那么长的。现在看ST的参考手册无论中英文都有一种哈利波特找魂器的感觉,要上下来回翻阅n次,然后将关联点组织在一起,之后再去进行逻辑分析判断正误,太累心了!!!ST为中国市场砸这么多钱就不能好好写写自己的文档吗,重新编排一下能费几个钱。中文版的文档5年都没改过了,翻译都死光了吗。各位前辈都是怎么过来的?难道因为一直在用函数库没关注过底层这些?

最后分享一个AN3116文档中提到的范例包,里面有SCAN模式DMA传输的范例。结合关于STM32 ADC自校准的个人理解中的AN3116文档一起使用“更有利于钙质吸收”。

此帖出自stm32/stm8论坛

STM32 的ADC 模式及其应用 范例.zip

2.56 MB, 下载次数: 82

关于STM32 ADC自校准的个人理解的更多相关文章

  1. STM32 ADC多通道转换DMA模式与非DMA模式两种方法(HAL库)

    一.非DMA模式(转) 说明:这个是自己刚做的时候百度出来的,不是我自己做出来的,因为感觉有用就保存下来做学习用,原文链接:https://blog.csdn.net/qq_24815615/arti ...

  2. STM32 ADC多通道规则采样和注入采样

    layout: post tags: [STM32] comments: true 文章目录 layout: post tags: [STM32] comments: true 什么是ADC? STM ...

  3. STM32—ADC多通道采集电压

    文章目录 ADC详解 程序说明 函数主体 引脚配置 ADC和DMA配置 主函数 ADC详解 前面的博客中详细介绍了STM32中ADC的相关信息,这篇博客是对ADC内容的一个总结提升,ADC的详细介绍: ...

  4. STM32 ADC 采样 频率的确定

    一 STM32 ADC 采样频率的确定 1.       : 先看一些资料,确定一下ADC 的时钟: (1),由时钟控制器提供的ADCCLK 时钟和PCLK2(APB2 时钟)同步.CLK 控制器为A ...

  5. Stm32 ADC学习

    stm32 ADC 简介 stm32的ADC是 12位逐次逼近型 模拟数字转换器;它包括18个通道,可以用来测量16个外部通道和2个内部通道.ADC转换的结果存放在16位数据寄存器(ADC规则数据寄存 ...

  6. stm32 ADC模数转换 ADC多通道 ADC DMA

    通过调节电位器,改变AD转换值和电压值 STM32F1 ADC 配置步骤 1.使能GPIO时钟和ADC时钟 2.配置引脚模式为模拟输入 3.配置ADC的分频因子 4.初始化ADC参数,ADC_Init ...

  7. STM32—ADC详解

    文章目录 一.ADC简介 二.ADC功能框图讲解 1.电压输入范围 2.输入通道 3.转换顺序 4.触发源 5.转换时间 6.数据寄存器 7.中断 8.电压转换 三.初始化结构体 四.单通道电压采集 ...

  8. STM32 ADC 测电压

    1. STM32F103 ADC 本例使用STM32F103芯片的PA1引脚测试模拟输入的电压值. 查看文档<STM32F103X.pdf>第31页,引脚定义图: 得知PA1使用ADC1的 ...

  9. stm32 ADC配置

    STM32 的 ADC 是 12 位逐次逼近型的模拟数字转换器,它有 18 个通道,可测量 16 个外部和 2 个内部信号源 各通道的 A/D 转换可以单次.连续.扫描或间断模式执行. ADC 的结果 ...

随机推荐

  1. Python 爬虫的工具列表大全

    Python 爬虫的工具列表大全 这个列表包含与网页抓取和数据处理的Python库.网络 通用 urllib -网络库(stdlib). requests -网络库. grab – 网络库(基于pyc ...

  2. DOM中offsetLeft与style.left的区别

    offsetLeft 获取的是相对于父对象的左边距 left 获取或设置相对于 具有定位属性(position定义为relative)的父对象 的左边距 如果父div的position定义为relat ...

  3. 内存直读技术DMA

    DMA(Direct Memory Access) DMA(Direct Memory Access)即直接存储器存取,是一种快速传送数据的机制. 工作原理 DMA是指外部设备不通过CPU而直接与系统 ...

  4. 使用grafana cli重置grafana密码

    Grafana CLIgrafana cli是grafana server自带的一个小巧的二进制工具,用来在运行grafana server的机器上执行命令.插件grafana cli工具允许你安装升 ...

  5. 使用scrapy爬取dota2贴吧数据并进行分析

    一直好奇贴吧里的小伙伴们在过去的时间里说的最多的词是什么,那我们就来抓取分析一下贴吧发文的标题内容,并提取分析一下,看看吧友们在说些什么. 首先我们使用scrapy对所有贴吧文章的标题进行抓取 scr ...

  6. [转]Ubuntu安装Python3.6

    Ubuntu安装Python3.6   Ubuntu默认安装了Python2.7和3.5 输入命令python

  7. ORACLE函数、连接查询、约束

    *ORDER BY 子句在SELECT语句的结尾. 使用外连接可以查询不满足连接条件的数据 with字句 字符函数lower upper initcap concat substr length in ...

  8. Ioc容器beanDefinition-Spring 源码系列(1)

    Ioc容器beanDefinition-Spring 源码系列(1) 目录: Ioc容器beanDefinition-Spring 源码(1) Ioc容器依赖注入-Spring 源码(2) Ioc容器 ...

  9. url的反向解析

    1. url的语法格式: url(regex, views, **kwargs, name) name:为地址起别名,反向解析时使用 2.反向解析 对于Django中的url反向解析,是分模板和视图的 ...

  10. 单调栈的运用-bzoj1012(代码转载-http://hzwer.com/1130.html)

    Description 现在请求你维护一个数列,要求提供以下两种操作: . 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度. . 插 ...