如何使用HAL库读取和显示STM32F4的ADC值
How to Read and Show ADC value of STM32F4 using HAL Library
我有一个由 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)" 从来没有 returns "HAL_OK"。
在终端中,出现一个值。
更新
好吧,为了代码工作,我必须将 ADC 的 "Start" 放在无限循环中,并在循环的最后调用 "Stop"。
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);
}
}
作为评论中答案的补充:
调用 HAL_ADC_PollForConversion(&hadc1, 1000);
明确停止转换,即使连续转换已激活。
如果您 want/must 等待每次转换完成,则必须在等待(和读取)结果后使用 HAL_ADC_Start(&hadc1);
重新启动 ADC。
我有一个由 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)" 从来没有 returns "HAL_OK"。 在终端中,出现一个值。
更新
好吧,为了代码工作,我必须将 ADC 的 "Start" 放在无限循环中,并在循环的最后调用 "Stop"。 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);
}
}
作为评论中答案的补充:
调用 HAL_ADC_PollForConversion(&hadc1, 1000);
明确停止转换,即使连续转换已激活。
如果您 want/must 等待每次转换完成,则必须在等待(和读取)结果后使用 HAL_ADC_Start(&hadc1);
重新启动 ADC。