前几天发过一篇帖子,叫:关于STM32 ADC自校准的个人理解文章大体说的是自校准前要先将ADON位置1,之后再校准。 本以为彻底的了解了自校准的过程,但是昨天晚上无意间看到了一个函数说明,不禁愁云又起, <ignore_js_op> 依据手册介绍,我将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中断章节又是这么说的, 现在我也才明白,为什么AN3116文档中那么强烈的建议规则通道组连续转换要使用DMA方式,因为用中断就是白瞎啊!!!! 有句话叫:一流的翻译能把二流的文章翻译成一流的作品,二流的翻译能把一流的作品翻译成二流的文章,二流的文章如果碰到二流的翻译,只能成为三流的shit。在我看来ST属于最后这一种,尤其是 be set翻译成被设置,简直是梗到家了。 之前看着数据手册自学AVR时顺风顺水,错误和编排不当非常少,虽说STM32相比之下更复杂、产品线更长、页数更多但是参考手册里这么多明显的叙述错误和槽糕的层次结构就我这个门外汉也能看出来啊,这么多错误和含混不清简直就是残害生命、初学者的噩梦啊,撞墙的心都有了。那STM8和STVD更是一块烂豆腐,第一次见ERRATA能写那么长的。现在看ST的参考手册无论中英文都有一种哈利波特找魂器的感觉,要上下来回翻阅n次,然后将关联点组织在一起,之后再去进行逻辑分析判断正误,太累心了!!!ST为中国市场砸这么多钱就不能好好写写自己的文档吗,重新编排一下能费几个钱。中文版的文档5年都没改过了,翻译都死光了吗。各位前辈都是怎么过来的?难道因为一直在用函数库没关注过底层这些? 最后分享一个AN3116文档中提到的范例包,里面有SCAN模式DMA传输的范例。结合关于STM32 ADC自校准的个人理解中的AN3116文档一起使用“更有利于钙质吸收”。 此帖出自stm32/stm8论坛 |
2.56 MB, 下载次数: 82