使用 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;