按下按钮时从STM32 ADC获取读数

问题描述 投票:0回答:1

使用CubeIDE和STM32F4板,我试图开始ADC转换,并根据ADC值使两个LED之一闪烁-如果该值小于某个限制,则一个LED应当闪烁而另一个保持熄灭,但如果ADC值大于我设置的限制,则另一个LED应当闪烁。当我按下按钮时,应该会发生这种情况,并且闪烁应该持续到按下按钮为止。

因此,我有4个引脚-两个(G2和D8)GPIO输出,用于使LED闪烁,一个(A0)引脚为模拟输入,一个(F2)GPIO输入为按钮。设置为上拉,并通过按钮连接至GND。

相关代码是

/* USER CODE BEGIN 0 */
uint32_t adcVal;
/* USER CODE END 0 */
  /* USER CODE BEGIN 2 */
//HAL_ADC_Start(&hadc1);
HAL_ADC_Start_IT (&hadc1);
  /* USER CODE END 2 */
/* USER CODE BEGIN 4 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
    adcVal = HAL_ADC_GetValue(&hadc1);
    if (!HAL_GPIO_ReadPin(GPIOF, GPIO_PIN_2)) {
        HAL_ADC_Start_IT (&hadc1);
        adcVal = HAL_ADC_GetValue(&hadc1);
        if (adcVal > 2000) {HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_8); HAL_GPIO_WritePin(GPIOG, GPIO_PIN_2, GPIO_PIN_RESET);}
        else {HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_2); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_8, GPIO_PIN_RESET);}
        HAL_Delay(500);
        //HAL_ADC_Start_IT (&hadc1);
    }
    else {HAL_GPIO_WritePin(GPIOG, GPIO_PIN_2, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_8, GPIO_PIN_RESET);}
}
/* USER CODE END 4 */

我没有在while(1)循环中放任何东西。

[编译时,我没有收到任何错误或警告,当我运行代码时,F2引脚被设置为高电平(当我用测试仪对其进行测量时为3V,而在按下按钮时变为零),但是LED却没有。尽管对A0施加了电压,但t根本没有反应。我怀疑我以错误的方式使用了ADC。我希望ADC保持空闲状态,并在连接到该按钮的引脚变为低电平时读取并转换一个值。

当我将与GPIO相关的行放到while(1)循环中时,它也不起作用。这可能是一个简单的错误,但是有人可以告诉我它在哪里吗?

我从自动生成的代码中找到了这样的行

/*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_8, GPIO_PIN_RESET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOG, GPIO_PIN_2, GPIO_PIN_RESET);

但是当我评论他们时,它没有帮助。我还添加了ADC设置,也许问题出在这里:

  hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
  hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  hadc1.Init.ScanConvMode = DISABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 1;
  hadc1.Init.DMAContinuousRequests = DISABLE;
  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
stm32 stm32cubeide
1个回答
0
投票

问题在于

© www.soinside.com 2019 - 2024. All rights reserved.