你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

奇葩STM32F051C8T6怎么关掉ADC模块,求ST的官方人士出来解析呀

[复制链接]
阳光_~~ 提问时间:2014-11-14 04:01 /
文档RM0091(DocID018940 Rev 6 官方最新的)里面只告诉了我们开启ADC模块的方法。如果按照文档来,里面的示例代码是错误的。如果按照代码来,那文档文档是错误的。
RM0091  page 925 的示例代码
ADC Calibration code example
/* (1) Ensure that ADEN = 0 */
/* (2) Clear ADEN */
/* (3) Launch the calibration by setting ADCAL */
/* (4) Wait until ADCAL=0 */
if ((ADC1->CR & ADC_CR_ADEN) != 0) /* (1) */
{
ADC1->CR &= ( uint32_t)(~ADC_CR_ADEN); /* (2) */
}
ADC1->CR |= ADC_CR_ADCAL; /* (3) */
while ((ADC1->CR & ADC_CR_ADCAL) != 0) /* (4) */
{
/* For robust implementation, add here time-out management */
}

RM0091 page 214的原话:
The calibration is initiated by software by setting bit ADCAL=1. Calibration can only be
initiated when the ADC is disabled (when ADEN=0). ADCAL bit stays at 1 during all the
calibration sequence. It is then cleared by hardware as soon the calibration completes. After
this, the calibration factor can be read from the ADC_DR register (from bits 6 to 0)

这个IF语句我的理解是
if ((ADC1->CR & ADC_CR_ADEN) != 0) /* (1) */
{
ADC1->CR &= ( uint32_t)(~ADC_CR_ADEN); /* (2) */
}

如果ADC模块ENABLE了,就DISABLE.我只能这样理解,我看不出来还能有其他的任何意思,好的这样问题就来了。

RM0091 PAGE 238:
ADC control register (ADC_CR)
寄存器里的所有的位域都是rs属性,
rs是什么意思呢,在文档的page 41 :read/set (rs) Software can read as well as set this bit. Writing ‘0’ has no effect on the bit value. 中文意思是,软件能够读和置位这个BIT,写0是无效的。

文档和里面的代码完全是矛盾的,一开始我还真信了

ADC1->CR &= ( uint32_t)(~ADC_CR_ADEN); /* (2) */这个能够DISABLE ADC module.

各种不正常,最后跟踪调试,发现有时要不在ADC校正的时候的时候卡死,要不就是在DMA方式转换等待结果的时候卡死,但是总之不正常。

一个官方的文档,里面的漏洞百出,你让我们怎么用呀,还让不让人愉快的写代码呀。

求ST的权威人士出来解释一下。

收藏 1 评论7 发布时间:2014-11-14 04:01

举报

7个回答
arm8686 回答时间:2014-11-14 11:25:21
按着手册上的意思,是硬件自动清零,这样的话,就不需要关闭。
于是,例程的写法就不对劲了。因为赋“1”没有意义。而且还有可能导致异常的发生。

看来楼主只能自己做测试了。
找找还有没有别的使能位,例如关断时钟之类的。
沐紫 回答时间:2014-11-18 14:17:29
楼主测试了么,问题如何了呢
回答时间:2014-11-18 16:41:05
官方说明,我理解是这样的,在校准之前,要先关闭AD,然后校准,校准完毕以后再开启AD,然后再读取AD的值寄存器就可以了。
楼主可有其他不同的见解?
Dylan疾风闪电 回答时间:2014-11-18 21:37:19
同意楼上意见。
adc.JPG
阳光_~~ 回答时间:2014-12-2 20:59:42

我明白你说的意思,我的ADC在进入stop mode的时候需要关掉的,按照文档里面的代码关不掉(ADC1->CR &= ( uint32_t)(~ADC_CR_ADEN); /* (2) */) ,只能在RCC里面RESET ADC的clock才行。就是由于关不掉,所以每次从stop mode wake up后,ADC校正都会出问题
Dylan疾风闪电 回答时间:2014-12-2 21:15:48
用disable外设时钟clk,不要使用reset时钟clk。
因为reset操作需要先enbale再disbale;不然寄存器的值不会被更新,一直被锁存在历史的值。
深圳小明 回答时间:2016-6-17 14:11:56
stm32f030f4,进入stop之前,关掉ADC,否则静态电流很大,800uA左右。关掉ADC之后,静态电流50uA左右。
/* 关掉ADC */
        while(ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN) == RESET);
        ADC_Cmd(ADC1, DISABLE);

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版