STMCU小助手
发布时间:2023-12-11 14:21
|
01引言 很多 STM32 系列中的 ADC 都带有自校准的功能。它提供了一个自动校准的过程,用于驱动包括 ADC 上电/掉电序列在内的所有校准动作。在这个过程中,ADC 计算出一个校准因子,并在内部应用到此 ADC 模块,直到下一次 ADC 掉电。在执行任何 ADC 操作之前必须校准,以消除芯片之间 ADC 结果的偏差。& @9 [9 g, P5 y4 g; _ % Q' O. L6 i3 O+ g% N0 c 02问题$ s4 V! N2 F: N5 h/ W 2.1. 问题详情9 m* Y* s9 Z5 M# b9 _ 客户使用 STM32U575ZIT6Q 验证 ADC4 时,使用 STM32CubeMX 配置后生成工程项目。因为使用 ADC 进行采样转换前,必须要做 ADC 的自校准。于是在 main 函数中加入自校准代码,如图 1 所示。) n0 O1 G0 E) i; o) \( z. H
图1.代码:ADC 自校准 " N- V* ]4 W8 x9 O 然而,在运行代码的情况下,发现 PC 指针最后跑到这个 Calibration Error 的Error_Handler()里。也就是说,执行自校准失败了! ( l( v4 s, R, [2 ` 5 S! K0 ?0 t( S9 b 再检查进入 Error_Handler()发生的问题,发现在执行HAL_ADCEx_Calibration_Start()时陷在了下面这个 Loop 当中,如图 2 所示。4 m3 m5 e2 @* ~1 D
图2.代码:等待 ADC 自校准完成 % I1 p8 d9 M- s4 W 也就是说,ADCAL 位被置 1 后,始终没有被硬件清 0,代表自校准始终不成功。4 S) X/ M# u4 Q8 [. S. z2 ? 4 _% t, w3 L( b; _ q9 ]- m. P 2.2. 问题分析 查看 STM32U5 的参考手册 RM0456 中关于自校准的描述。考虑到校准没有成功,那么应该看看是不是自校准需要哪些条件,而这些条件并没有成立。6 H. C5 G0 U$ R$ ~( g 于是,在 ADC 章节中的 Calibration 小节找到了这么一段话,如图 3 所示。
图3.ADC 自校准要求条件 # }* S+ {) J- ]0 x" f8 f* h9 t& A; Q. D 也就是说,在初始化自校准之前,需要保证 3 个条件:# e! q3 |+ g. S5 h u2 A' c6 F 1) ADC 的电压调整器已经使能并正常工作(ADVREGEN = 1 且 LDORDY =1) 2) ADC 没有打开(ADEN=0) 3) 自动掉电模式没有使能(AUTOFF = 0) , ~' X' ]3 E' ] q ( [' R# G1 @0 R \8 |3 x 回到刚才等待 ADC 自校准完成的代码,当指针停留到这边时,在线调试检查各个标志位情况,发现 ADVREGEN=1,ADEN=0,AUTOFF=0,LDORDY=0。所以,可以肯定的是就是 LDORDY 不为 1,也就是说 ADC 的电压调整器还没有准备好,导致了自校准无法成功并退出。 ; K7 c6 T/ y. S, |* N& r M" W 在 STM32U5 中,引入了一个新的 ADC 特性,叫 ADC 电压调整器(ADC voltageregulator)。在使用 ADC 之前,这个电压调整器必须被使能并且能够稳定工作。可以通过将 ADC_CR 寄存器中的 ADVREGEN 位置 1 来使能它,然后必须要等这个电压调整器的启动时间之后,才可以正常启动自校准或者使用 ADC。这个 LDO 有没有准备好,可以通过 ADC_ISR 寄存器中的 LDORDY 这个位来判断。LDORDY=1 才代表了 LDO 已经准备好了。 ! s4 I7 F% S0 P6 G 5 Z- q$ \$ F0 B5 ^: P* ]0 V& O$ L! O 回到客户的问题,可以知道即使 ADVREGEN 置 1 了,LDORDY 始终没有置起来,电压调整器没有启动工作,难道是 ADC 的这个电压调整器坏掉了? 9 q' G+ O% _; t, w' M$ B 别急,想到电源的问题,还不能忘了参考手册的另一个章节 :电源控制 PWR。翻到PWR 这一章,先要考虑到,与 ADC 相关的电源为 VDDA,所以要重点查看 VDDA 的内容。找到 Independent analog peripherals supply 这一小节,可以看以下关键的句子,如图 4。 " e8 Q/ ^! I, `+ I. u
图4.独立的模拟外设供电 , |$ x( |2 n% T! i @d6 w0 ]4 d5 t: H! y 从图中黄色高亮的文字,我们可以了解到,STM32U5 的 VDDA 在控制上还跟其他系列不一样,它有一个开关来选择是否隔离。芯片复位后,VDDA 提供的 ADC 和模拟开关控制在逻辑和电气上是隔离的,因此不可用。一旦 VDDA 电源存在,就必须在使用模拟外设之前,通过在 PWR_SVMCR 寄存器中将 ASV 置位来消除隔离。也就是说,要想使用ADC,必须先将 ASV 置位来消除隔离。 # E5 Q q6 ]0 U! o9 \4 w: J + w5 l1 H2 v/ w0 F6 M 在 PWR_SVMCR 寄存器的解释中,也可以看到 ASV 位的描述中要求将此位强制置 1才可以使用模拟外设,如图 5。
图5.ASV 位描述 ) _6 o5 }% ~5 z/ N7 ` ASV 的配置是没有在 STM32CubeMX 中进行配置的,所以需要在后期添加。所以,很可能就是因为没有将 ASV 置位以使能 VDDA,导致 ADC 外设被隔离,并没有得到供电,所以 ADC 的电压调整器不可能正常工作,LDORDY 也不可能为 1。1 z) ^0 Q# C; [" f2 P ' C" T" F( G+ w# t Z( o 03问题解决# N. X- c9 \. Q$ f& ^! A 在工程项目中搜索 ASV,可以找到两个 API,如图 6。
图6.VDDA 使能或禁用 API 5 a; }4 x' x- \$ L5 w 也就是说,我们需要先将 HAL_PWREx_EnableVddA()添加到代码中。因为其属于MSP 硬件配置,所以将其加到 HAL_MspInit()函数,如图 7 所示。 / f0 Q" }: R3 K7 Y# L: V
图7.修改过的 HAL_MspInit()函数 3 L8 v3 _7 P; \. D1 ^+ N2 {1 M; g* h7 J 再重新编译,然后执行指令代码,就可以看到 ADC 的自校准可以正常完成,PC 指针已经可以正常跑到自校准后面的代码了。" X* O9 B4 h6 J# n! W' t# X+ s) ^ 04小结5 X/ d( n/ k; e! {" T) P 在 STM32U5 中,为了更好地控制功耗,ADC 中加入电压调整器和 VDDA 隔离功能。这与以往的 STM32 有所不同,需要注意一下。使用 ADC 等模拟外设前,需要注意将PWR_SVMCR 寄存器中将 ASV 置位来消除隔离。 其实不仅仅是 VDDA 可以隔离,VDDIO2 也是可以的,通过 PWR_SVMCR 寄存器的IO2SV 位进行控制。 7 x. ~/ F3 ~% ] 如果仔细看过 STM32U5 的 ADC 例程,可以看到 HAL_MspInit()的内容是这么写的,如图 8 所示。- S% f+ j1 n: ^& ~( |& N) l + l) N, P. q( s1 m/ l
图8.例程的 HAL_MspInit()函数 9 y' x$ X: }, g" m9 z9 U, W 可以看到,在 MSP 初始化里,不仅使能了 VDDA,还使能了 VDDIO2。所以要使用VDDIO2 相关 I/O 的,也需要注意一下。* }2 j2 |9 B( r0 H 7 H! Q$ ~8 K% ^" b ) a& \0 W4 T3 m 转载自: STM32单片机 如有侵权请联系删除% K6 E1 ?& l B" @ ! k7 C7 T# s# _2 r3 z8 s. A- L2 U |
实战经验 | 基于 STM32U5 创建 USBx_CustomHID 通信
STM32U5 Timer+GPDMA 2D 通道实现多波形交替输出 实操方案与优化
安全篇:STM32L5/U5—— 高性能 + 高安全超低功耗 MCU
经验分享 | STM32U5 ADC+TIM+DMA 2D传输应用演示
【经验分享】LAT1496 基于 USBD库CDC Standalone例程中的一个Bug解析
STM32U5A9JDK试用---MIPI-DSI屏幕驱动
STM32U5 ADC 自校准失败终极解决:VDDA 隔离解除 + 电压调整器就绪实操指南
《STM32U3线上课程》学习笔记+STM32U3 超低功耗 MCU,超低功耗及数据安全
立即在GitHub上抢先体验面向STM32U5的最新STM32Cube HAL更新
STM32开发五大误区,新手别傻傻信了
微信公众号
手机版