STM32U5 ADC 自校准失败的核心原因是未解除 VDDA 隔离 ,导致 ADC 电压调整器(ADVREGEN)无法就绪(LDORDY=0),不满足自校准的前提条件。只需在初始化阶段启用 VDDA 供电、等待电压调整器稳定,即可让自校准正常执行。
1. 核心问题与现象
1.1 用户配置与异常表现
- 硬件:STM32U575ZIT6Q,使用 ADC4 进行采样;
- 软件:STM32CubeMX 生成工程,在
main函数中调用HAL_ADCEx_Calibration_Start执行自校准;
- 异常:代码卡在 “等待校准完成” 循环(
LL_ADC_IsCalibrationGoing始终返回 1),最终进入Error_Handler,自校准失败。
1.2 关键标志位状态
调试发现核心状态异常:
- ADVREGEN=1(已使能 ADC 电压调整器)、ADEN=0(ADC 未启用)、AUTOFF=0(自动掉电禁用)—— 前两个条件满足;
- LDORDY=0(ADC 电压调整器未就绪)—— 这是自校准失败的直接触发点。
2. 根本原因:STM32U5 特有的 ADC 供电与隔离机制
2.1 ADC 自校准的三个强制前提(参考手册 RM0456)
自校准启动前必须同时满足以下条件,缺一不可:
- ADC 电压调整器已使能且就绪(ADVREGEN=1 且 LDORDY=1);
- ADC 处于禁用状态(ADEN=0);
- 自动掉电模式禁用(AUTOFF=0)。
2.2 核心症结:VDDA 隔离未解除
STM32U5 为优化功耗,新增VDDA 电气隔离机制 :
- 芯片复位后,VDDA 供电的模拟外设(ADC、DAC 等)默认处于电气和逻辑隔离状态;
- 必须通过置位
PWR_SVMCR寄存器的 ASV 位(VDDA 有效位),才能解除隔离,让 VDDA 为 ADC 供电;
- 未置位 ASV 时,ADC 电压调整器无供电,无法启动,LDORDY 始终为 0,自校准无法触发。
3. 解决步骤:3 步搞定自校准
步骤 1:启用 PWR 时钟与 VDDA 供电
在HAL_MspInit函数中(硬件初始化入口),添加 VDDA 隔离解除代码(核心步骤):
void HAL_MspInit(void)
{
/* USER CODE BEGIN MspInit 0 */
/* USER CODE END MspInit 0 */
_HAL_RCC_PWR_CLK_ENABLE(); // 启用PWR时钟(必须先使能时钟才能操作寄存器)
/* System interrupt init*/
/* USER CODE BEGIN MspInit 1 */
HAL_PWREx_EnableVddA(); // 置位ASV位,解除VDDA隔离,启用VDDA供电
/* USER CODE END MspInit 1 */
}
步骤 2:等待 ADC 电压调整器就绪
在调用自校准函数前,需等待 LDORDY 置 1(电压调整器稳定),避免因未就绪导致校准失败:
// 使能ADC电压调整器
HAL_ADC_EnableVoltageRegulator(&hadc4);
// 等待电压调整器就绪(超时时间可自定义,建议≥1ms)
uint32_t wait_cnt = 0;
while (__HAL_ADC_GET_FLAG(&hadc4, ADC_FLAG_LDORDY) == RESET)
{
wait_cnt++;
if (wait_cnt > 100000) // 约1ms超时(根据系统时钟调整)
{
Error_Handler(); // 电压调整器启动失败
}
}
步骤 3:执行 ADC 自校准
电压调整器就绪后,正常调用自校准函数:
// 执行单端模式偏移校准
if (HAL_ADCEx_Calibration_Start(&hadc4, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED) != HAL_OK)
{
Error_Handler(); // 校准失败(此时大概率是其他配置问题)
}
4. 避坑关键要点
- ASV 位是核心 :STM32U5 独有的 VDDA 隔离机制,必须调用
HAL_PWREx_EnableVddA置位 ASV,否则 ADC 无供电,后续操作均无效;
- 电压调整器必须等就绪 :启用
HAL_ADC_EnableVoltageRegulator后,需等待ADC_FLAG_LDORDY置 1,不可直接启动校准;
- PWR 时钟不可漏 :操作 PWR 寄存器前必须启用
_HAL_RCC_PWR_CLK_ENABLE,否则函数调用无效;
- VDDIO2 的额外注意 :若使用 VDDIO2 相关 I/O,需同步调用
HAL_PWREx_EnableVddIO2,解除其隔离;
- 校准时机 :自校准必须在 ADC 禁用(ADEN=0)、自动掉电禁用(AUTOFF=0)时执行,CubeMX 默认配置已满足,无需额外修改。
STM32U5 ADC 自校准失败的本质是对其新增的功耗优化机制不熟悉 ——VDDA 隔离和 ADC 电压调整器是自校准的前提。按 “启用 VDDA 供电→等待电压调整器就绪→执行校准” 的流程操作,即可彻底解决问题,确保 ADC 采样精度符合设计要求。 |