如何使用HAL库读取和显示STM32F4的ADC值

时间:2019-10-16 18:21:00

标签: c adc stm32f4

我有一个由STMCubeMX生成的代码,在其中我使用门户网站PA0(如ADC输入)。我正在尝试使用C中的STM的HAL库读取此输入,并使用CDC将值传输到USB端口。参见主要内容,我尝试在其中获取数据并显示以下内容:

#include "main.h"
#include "usb_device.h"
#include "usbd_cdc_if.h"

ADC_HandleTypeDef hadc1;
void SystemClock_Config(void);
static void MX_ADC1_Init(void);

int main(void)
{
    uint8_t buffer[8];

    HAL_Init();
    SystemClock_Config();
    MX_USB_DEVICE_Init();
    MX_ADC1_Init();

    HAL_ADC_Start(&hadc1);

    while (1)
    {
        HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_14);
        HAL_ADC_PollForConversion(&hadc1, 1000);
        sprintf((char*)buffer,"%d\n",(int)HAL_ADC_GetValue(&hadc1));
        //HAL_Delay(500);
        CDC_Transmit_FS(buffer,8);
    }
}

调试代码时,我看到函数“ HAL_ADC_PollForConversion(&hadc1,1000)”从不返回“ HAL_OK”。 在终端中,出现一个值。

更新

好吧,为使代码有效,我必须将ADC的“开始”置于无限循环内,并将“停止”的调用置于循环的最后。 Ps:Adc正在连续转换模式下运行。

int main(void)
{
    uint8_t buffer[8];

    HAL_Init();
    SystemClock_Config();
    MX_USB_DEVICE_Init();
    MX_ADC1_Init();

    while (1)
    {
        HAL_ADC_Start(&hadc1);
        HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_14);
        HAL_ADC_PollForConversion(&hadc1, 1000);
        sprintf((char*)buffer,"%d\n",(int)HAL_ADC_GetValue(&hadc1));
        //HAL_Delay(500);
        CDC_Transmit_FS(buffer,8);
        HAL_ADC_Stop(&hadc1);
}

}

1 个答案:

答案 0 :(得分:1)

作为评论中答案的补充:

即使激活了连续转换,对HAL_ADC_PollForConversion(&hadc1, 1000);的调用也会明确停止转换。

如果您希望/必须等待每个转换完成,则必须在等待(并读取)结果后使用HAL_ADC_Start(&hadc1);重新启动ADC。