你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32U5 ADC 自校准不成功的问题分析

[复制链接]
STMCU小助手 发布时间:2023-12-11 14:21
01引言3 i9 f3 F' o1 d& i3 \: F4 n' L
很多 STM32 系列中的 ADC 都带有自校准的功能。它提供了一个自动校准的过程,用于驱动包括 ADC 上电/掉电序列在内的所有校准动作。在这个过程中,ADC 计算出一个校准因子,并在内部应用到此 ADC 模块,直到下一次 ADC 掉电。在执行任何 ADC 操作之前必须校准,以消除芯片之间 ADC 结果的偏差。, \5 @0 I+ F; f! C3 s# G! n; `

& X/ N; c' ?% M7 ?# R3 G  B% ]02问题
+ j0 L- F6 e5 x8 Q) L( ~! Y9 Z2.1. 问题详情# n, s2 \$ U& ^( {1 L' w
客户使用 STM32U575ZIT6Q 验证 ADC4 时,使用 STM32CubeMX 配置后生成工程项目。因为使用 ADC 进行采样转换前,必须要做 ADC 的自校准。于是在 main 函数中加入自校准代码,如图 1 所示。5 i) B* v! \# O* y; H7 ?
" r. V, Q- x( f" I; {
8.jpg

! C, W) F* @  X4 M) ]0 g) u  s
图1.代码:ADC 自校准

8 G* I9 J: ]& S$ k# U
( V0 A9 L7 B7 l, \1 C% x
然而,在运行代码的情况下,发现 PC 指针最后跑到这个 Calibration Error 的Error_Handler()里。也就是说,执行自校准失败了!
7 I$ O8 i7 D% y0 x7 z
9 y, B! z7 ?9 g0 ^2 _0 G6 l9 y再检查进入 Error_Handler()发生的问题,发现在执行HAL_ADCEx_Calibration_Start()时陷在了下面这个 Loop 当中,如图 2 所示。
& i- I( O: n& x( W* |7 Y- _9 ~6 `
' x6 X" B8 x  Z: g' |) H
7.jpg
0 z( c' }+ R% n& p* s6 x4 f
图2.代码:等待 ADC 自校准完成
" M# ]8 e6 X, B' R7 F7 [% j/ q( P" y

; |( z( |7 \# e3 s. E也就是说,ADCAL 位被置 1 后,始终没有被硬件清 0,代表自校准始终不成功。# n; d* j* t6 _& ]# l& R+ I" z
" _* X- {+ X- o: G4 D/ l2 Z1 w2 P
2.2. 问题分析
7 M9 M% r9 Z+ V& g+ ]9 S8 w查看 STM32U5 的参考手册 RM0456 中关于自校准的描述。考虑到校准没有成功,那么应该看看是不是自校准需要哪些条件,而这些条件并没有成立。
% }) d2 l0 U' N( z
于是,在 ADC 章节中的 Calibration 小节找到了这么一段话,如图 3 所示。' X  o1 ^2 d5 m" l7 c) B* b1 y7 G
7 k* a5 e" M! U. c, R
6.jpg

* U  n1 C0 \) g& d: T# U* f. g
图3.ADC 自校准要求条件

- d* g" s# f% a4 v; r- O
0 Y. V: g* _3 J+ H+ r6 y6 h8 D; H6 H
也就是说,在初始化自校准之前,需要保证 3 个条件:
& Z% b1 T% z$ Q8 S# F1) ADC 的电压调整器已经使能并正常工作(ADVREGEN = 1 且 LDORDY =1)5 t3 K! b6 ?0 o) n
2) ADC 没有打开(ADEN=0)( n* X6 L& _, J; a# \6 H0 S' Q8 w
3) 自动掉电模式没有使能(AUTOFF = 0)
/ Q: z: [; }) H' s  n7 d8 a  P8 }7 m. Q6 T; ]3 x$ B+ n
回到刚才等待 ADC 自校准完成的代码,当指针停留到这边时,在线调试检查各个标志位情况,发现 ADVREGEN=1,ADEN=0,AUTOFF=0,LDORDY=0。所以,可以肯定的是就是 LDORDY 不为 1,也就是说 ADC 的电压调整器还没有准备好,导致了自校准无法成功并退出。
3 f4 g$ D7 _% o1 n  p
9 ~( w2 u3 Y+ s/ A4 [, H在 STM32U5 中,引入了一个新的 ADC 特性,叫 ADC 电压调整器(ADC voltageregulator)。在使用 ADC 之前,这个电压调整器必须被使能并且能够稳定工作。可以通过将 ADC_CR 寄存器中的 ADVREGEN 位置 1 来使能它,然后必须要等这个电压调整器的启动时间之后,才可以正常启动自校准或者使用 ADC。这个 LDO 有没有准备好,可以通过 ADC_ISR 寄存器中的 LDORDY 这个位来判断。LDORDY=1 才代表了 LDO 已经准备好了。 - X; `* |( `) T5 Y5 b
( O7 @# L) U- L2 k) D/ b
回到客户的问题,可以知道即使 ADVREGEN 置 1 了,LDORDY 始终没有置起来,电压调整器没有启动工作,难道是 ADC 的这个电压调整器坏掉了? $ Y$ v2 F3 r6 [# _! X% s
. n/ w& k; S% ]# t! B
别急,想到电源的问题,还不能忘了参考手册的另一个章节 :电源控制 PWR。翻到PWR 这一章,先要考虑到,与 ADC 相关的电源为 VDDA,所以要重点查看 VDDA 的内容。找到 Independent analog peripherals supply 这一小节,可以看以下关键的句子,如图 4。7 a3 A: d2 u# |9 q3 [; R6 r: _
5 Y7 o5 A6 p  t6 I, E# C% G* Q
5.jpg
6 ]/ J3 B" ~: w; W- v) K/ N
图4.独立的模拟外设供电

: b- Z! G9 x' z2 q; [  }" m5 a" G

, G  c1 k" H' Q$ J从图中黄色高亮的文字,我们可以了解到,STM32U5 的 VDDA 在控制上还跟其他系列不一样,它有一个开关来选择是否隔离。芯片复位后,VDDA 提供的 ADC 和模拟开关控制在逻辑和电气上是隔离的,因此不可用。一旦 VDDA 电源存在,就必须在使用模拟外设之前,通过在 PWR_SVMCR 寄存器中将 ASV 置位来消除隔离。也就是说,要想使用ADC,必须先将 ASV 置位来消除隔离。 ' O' A; o8 S- l. Q) I

" I$ R- u- I2 ]! m- Z& {3 h在 PWR_SVMCR 寄存器的解释中,也可以看到 ASV 位的描述中要求将此位强制置 1才可以使用模拟外设,如图 5。2 m0 L8 e8 t) ^" B
1 ^' k9 n8 }5 a# [' ?6 }
4.jpg
) M4 u  A# m- _( M8 ]6 }  S7 d
图5.ASV 位描述

' d' S8 h5 K3 X* V1 L
) Q3 S2 m2 \. ]( [9 _4 Q
ASV 的配置是没有在 STM32CubeMX 中进行配置的,所以需要在后期添加。所以,很可能就是因为没有将 ASV 置位以使能 VDDA,导致 ADC 外设被隔离,并没有得到供电,所以 ADC 的电压调整器不可能正常工作,LDORDY 也不可能为 1。; Z: O# T% \; \+ E6 Q1 @9 ?- K1 ?

( {2 r) `( T( M, [03问题解决
% ?/ S7 n5 |+ B6 g% m, v- E( ^在工程项目中搜索 ASV,可以找到两个 API,如图 6。
- p5 r& C5 C. x; ?+ h, [7 V, d( i" Z; l: k, |) i3 }. P
3.jpg

0 z1 Y% z+ t& s
图6.VDDA 使能或禁用 API
  B" |* P# j4 S

1 t& c8 z" D4 I  [9 b' N4 e1 R也就是说,我们需要先将 HAL_PWREx_EnableVddA()添加到代码中。因为其属于MSP 硬件配置,所以将其加到 HAL_MspInit()函数,如图 7 所示。3 h6 m% E% u" B. }5 x
9 j- M! ~: o6 S, l
2.jpg

" b' i, w( f3 r. s- g* Z/ c6 ~) |9 @
图7.修改过的 HAL_MspInit()函数

7 |9 P4 Y) L$ [5 l5 }' ^. d6 c# F- [
* V4 l" T' _. _) [" v: f; m

- H" K0 A: ~8 d  ?- x" }再重新编译,然后执行指令代码,就可以看到 ADC 的自校准可以正常完成,PC 指针已经可以正常跑到自校准后面的代码了。* n& \4 i9 Z# o& i/ D: u

* C$ J  f% u$ E  C, M+ o04小结9 q: J, U" Z6 F$ t# R/ q: ]
在 STM32U5 中,为了更好地控制功耗,ADC 中加入电压调整器和 VDDA 隔离功能。这与以往的 STM32 有所不同,需要注意一下。使用 ADC 等模拟外设前,需要注意将PWR_SVMCR 寄存器中将 ASV 置位来消除隔离。 1 R0 Z( }% S" U: |% F

) L% x5 J  t+ Y$ T, s其实不仅仅是 VDDA 可以隔离,VDDIO2 也是可以的,通过 PWR_SVMCR 寄存器的IO2SV 位进行控制。3 r& J+ Z0 w1 k! V& U, M

3 K3 P! d2 K; i  Z% }5 t7 I如果仔细看过 STM32U5 的 ADC 例程,可以看到 HAL_MspInit()的内容是这么写的,如图 8 所示。7 P, `6 c9 y: Y) u
: u# S+ P" q  ]& V- _3 u. b: H* H
1.jpg

8 v6 P- C& Q5 _! U: c
图8.例程的 HAL_MspInit()函数

" B- [7 @$ H4 d. ]+ ]- e8 ~0 i
8 i5 u5 ^+ B0 y+ m/ Q% M9 ?

: B+ I$ q! M; ?
可以看到,在 MSP 初始化里,不仅使能了 VDDA,还使能了 VDDIO2。所以要使用VDDIO2 相关 I/O 的,也需要注意一下。" l& e# ]$ E5 `- Y7 y& j# S

9 _7 F, @4 V: G+ r& W& p  ~

2 r+ w3 @' N4 S" X' u# m转载自: STM32单片机7 r( s. ]& k) q
如有侵权请联系删除
+ {2 F' _4 ]4 S4 E) l; x* ^% Z' J7 S, E/ B: ]: I

) F: x& D% W( M8 [& _2 u
% x& T  |" B6 e* k0 s
收藏 评论0 发布时间:2023-12-11 14:21

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版