文档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的权威人士出来解释一下。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>