[STM32F1] 在CubeIDE生成的代码中遇到ADC HAL_ERROR

[复制链接]
115|1
yunfu1117 发表于 2025-8-31 22:43 | 显示全部楼层 |阅读模式
用CubeIDE配置工具生成大部分代码和HAL调用。进行让ADC采样工作。单次测量。

代码如下:
HAL_ADC_Start(&hadc3);
HAL_ADC_PollForConversion(&hadc3, 5000);
sine = HAL_ADC_GetValue(&hadc3) - 512;
HAL_ADC_Stop(&hadc3);
经过大量debug排查后,怀疑HAL_ADC_Start调用。在HAL中,当执行以下代码行时:

/* 启用ADC外设 */
tmp_hal_status = ADC_Enable(hadc);

tmp_hal_status显示HAL_ERROR并返回,而没有启动ADC测量。
有人提到检查ADC的时钟设置。在SystemClock配置中完成:
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

/** 电源配置更新使能
*/
HAL_PWREx_ConfigSupply(PWR_DIRECT_SMPS_SUPPLY);

/** 配置主内部稳压器输出电压
*/
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}

/** 根据RCC_OscInitTypeDef结构体中的指定参数初始化RCC振荡器
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_DIV1;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLM = 12;
RCC_OscInitStruct.PLL.PLLN = 150;
RCC_OscInitStruct.PLL.PLLP = 2;
RCC_OscInitStruct.PLL.PLLQ = 2;
RCC_OscInitStruct.PLL.PLLR = 2;
RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
RCC_OscInitStruct.PLL.PLLFRACN = 0;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}

/** 初始化CPU、AHB和APB总线时钟
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
|RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;

if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSI, RCC_MCODIV_1);
}

在代码中没找到到ADC时钟的设置位置。是时钟问题么?

星辰大海不退缩 发表于 2025-8-31 22:46 | 显示全部楼层
大概率是时钟问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

51

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部