使用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;
问题在于