/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_ADC_Start(&hadc2);//配置成不连续转化情况下在这个函数里就已经把转化成功的标位清掉了,所以if(( HAL_ADC_GetState(&hadc2) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC)里的无法执行
HAL_ADC_PollForConversion(&hadc2,100);//等待常规组转化完成
if(( HAL_ADC_GetState(&hadc2) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC)//改成连续转化可以正常运行
{
ADC_Value_temp=HAL_ADC_GetValue(&hadc2);
printf("%d\r\n",ADC_Value_temp);
ADC_Value=(3.3/4096)*ADC_Value_temp;
printf("%lf\r\n",ADC_Value);
// ADC2->ISR&=0XfffD;//如果不清除标志位那就不会更新数据
// __HAL_ADC_CLEAR_FLAG(&hadc2, 0xfffd);//ADC_FLAG_EOC标志位出错了
}
HAL_Delay(500);
}
以上代码是基于单次转化模式下(ADC启动后只转化一次数据所以HAL_ADC_Start()和HAL_ADC_PollForConversion()函数要写在while(1)中,否则转化一次后不会在转化新的数据)的,不需要对标志位进行清零,因为在HAL_ADC_Start()函数中会对标志位清零
HAL_ADC_Start(&hadc2);
HAL_ADC_PollForConversion(&hadc2,100);
while (1)
{
if(( HAL_ADC_GetState(&hadc2) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC)//改成连续转化可以正常运行
{
ADC_Value_temp=HAL_ADC_GetValue(&hadc2);
printf("%d\r\n",ADC_Value_temp);
ADC_Value=(3.3/4096)*ADC_Value_temp;
printf("%lf\r\n",ADC_Value);
ADC2->ISR&=0XfffD;//如果不清除标志位那就不会更新数据
}
HAL_Delay(500);
}
以上代码是配置成连续转化模式下(只要ADC一开始转化就会不断的转化下去除非有中断或者停止ADC转化)的,可以将HAL_ADC_Start()和HAL_ADC_PollForConversion()函数放在while(1)外已启动转化。此模式下必须清除转化标志EOC位,否则ADC数据不会更新