STM32U5 ADC 自校准失败的核心原因是未解除 VDDA 隔离,导致 ADC 电压调整器(ADVREGEN)无法就绪(LDORDY=0),不满足自校准的前提条件。只需在初始化阶段启用 VDDA 供电、等待电压调整器稳定,即可让自校准正常执行。
资料获取:【应用笔记】STM32U5 ADC自校准不成功的问题分析
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 隔离解除代码(核心步骤):
步骤 2:等待 ADC 电压调整器就绪
在调用自校准函数前,需等待 LDORDY 置 1(电压调整器稳定),避免因未就绪导致校准失败:
步骤 3:执行 ADC 自校准
电压调整器就绪后,正常调用自校准函数:
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 采样精度符合设计要求。
阅读全文
707