今天学习STM32的AD转换,在数据手册中看到这样一句话“启动校准前,ADC必须处于关电状态(ADON=’0’)超过至少两个ADC时钟周期。”,英文原句是这样的“Before starting a calibration, the ADC must have been in power-off state(ADON bit = '0') for at least two ADC clock cycles.”。然而,STM32固件库中给出的例程代码如下所示。
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/* Enable ADC1 reset calibration register */
ADC_ResetCalibration(ADC1);
/* Check the end of ADC1 reset calibration register */
while(ADC_GetResetCalibrationStatus(ADC1));
/* Start ADC1 calibration */
ADC_StartCalibration(ADC1);
/* Check the end of ADC1 calibration */
while(ADC_GetCalibrationStatus(ADC1));
/* Start ADC1 Software Conversion */
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
程序中使用ADC_Cmd(ADC1, ENABLE);使能了ADC1,即将ADON位设置为了1,然后复位并启动了校准,这样看来是与手册上相违背的,于是我把上面代码的第一条语句放到了最后一条语句之前,结果运行后程序停在了while(ADC_GetResetCalibrationStatus(ADC1));这条语句不往下执行。折腾了半天,发现我看的数据手册上是错的,官网在2017年9月发布的版本上是这样写的“Before starting a calibration, the ADC must have been in power-on state(ADON='1') for at least two ADC clock cycles.”,即在启动校准之前,ADON必须置位至少两个ADC时钟周期,所以说例程中的写法是正确的。
上面的问题解决了,那么程序是怎么实现ADON='1'两个ADC时钟周期后启动校准的?通过仿真发现,程序从执行完ADC_Cmd(ADC1, ENABLE);到即将执行ADC_StartCalibra tion(ADC1);中间的时间为5us(芯片为stm32f103,系统时钟为72MHz),若设置ADC时钟为9MHz时,两个ADC时钟周期为2/9us,所以说到启动校准的时候,时间已经远远过了两个ADC时钟周期,所以这个问题的解答也算是隐藏在了程序本身之中了。