HAL_ADC_PollForConversion - 它到底是做什么用的?

HAL_ADC_PollForConversion - what exactly is it for?

我已经研究 STM32 (F103RB) 几个星期了,有一件事我不明白

HAL_ADC_PollForConversion

功能用途。我的意思是,我没有看到此功能对 ADC 读数有任何影响。这是我的代码示例:

   Version 1 (with PollForConversion on)

     while (1)
    
    {
        HAL_ADC_Start(&hadc1);
        HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
         
        uint32_t value = HAL_ADC_GetValue(&hadc1);
        float voltage = 3.3f * value / 4096.0f;
         
        printf("ADC = %lu (%.3f V)\n", value, voltage); //send the value via UART
        HAL_Delay(250);
    
        }

Version 2 (with PollForConvertion off)

     while (1)
    
    {
        HAL_ADC_Start(&hadc1);
        //HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
         
        uint32_t value = HAL_ADC_GetValue(&hadc1);
        float voltage = 3.3f * value / 4096.0f;
         
        printf("ADC = %lu (%.3f V)\n", value, voltage); //send the value via UART
        HAL_Delay(250);
    
        }

就我的观察而言,我是否使用 PollForConversion 并不重要 - UART 监视器上的读数 看起来 相同(尽管我不是 100 % 确定他们实际上 相同)。连续模式被禁用。我在这里错过了什么?

HAL_ADC_Start()启动ADC后,硬件开始ADC转换。这种转换需要一些时间。具体时间取决于您在 Cube 中的 ADC 配置,ADC 预分频器和循环计数的值越大,所需时间越长。

转换完成后,ADC硬件中的EOC标志置位,测量值存入寄存器。您可以使用 HAL_ADC_GetValue() 函数读取该值。但是,如果您在转换结束之前读取它,您可能会得到损坏的数据或先前测量的旧值。

这就是为什么你应该一直等到 EOC 标志被设置 - 这正是 HAL_ADC_PollForConversion 所做的。

在您没有轮询的示例中,您可能会在当前测量结束之前读取上一次测量的值。或者,与硬件交互的 HAL 函数可能慢到足以在设置 EOC 标志时实际读取数据。您可以将 Cube 中的 ADC 时钟周期数增加到最大值然后尝试,您应该从上次测量中得到一个值。