0

使用 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。我怀疑我以错误的方式使用 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;
4

1 回答 1

0

问题在于

  • 您在由中断处理程序运行HAL_Delay()的执行上下文中调用。HAL_ADC_ConvCpltCallback()这意味着您正在阻止主循环和中断的执行(优先级不大于该 ADC 中断)半秒!

  • 据我所知,ADC 处于一次性模式(不是扫描或连续模式)。如果发现在转换完成回调中设置了 GPIO F2,HAL_ADC_Start_IT()则不会发生对的调用,并且 ADC 保持静止。

于 2020-04-25T15:22:19.917 回答