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

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

[复制链接]
STMCU小助手 发布时间:2023-12-11 14:21
01引言% R( W: S% w, f/ w' I: L) `/ Q$ s
很多 STM32 系列中的 ADC 都带有自校准的功能。它提供了一个自动校准的过程,用于驱动包括 ADC 上电/掉电序列在内的所有校准动作。在这个过程中,ADC 计算出一个校准因子,并在内部应用到此 ADC 模块,直到下一次 ADC 掉电。在执行任何 ADC 操作之前必须校准,以消除芯片之间 ADC 结果的偏差。# F" \. {% j% A+ g7 a2 q/ Z
. ~* {/ r; r; u  h" N% ~
02问题; F7 U" ?; _- q6 v' F' W
2.1. 问题详情1 M# D; E2 V# I% M; C
客户使用 STM32U575ZIT6Q 验证 ADC4 时,使用 STM32CubeMX 配置后生成工程项目。因为使用 ADC 进行采样转换前,必须要做 ADC 的自校准。于是在 main 函数中加入自校准代码,如图 1 所示。6 y0 V. f5 i# B5 u$ O$ G9 H$ u

( b) \8 d" r) F$ S
8.jpg
# R8 i; j7 L9 S) Y5 @
图1.代码:ADC 自校准

6 d1 n/ F4 Z7 M  A  R
/ X$ k  c' P5 r
然而,在运行代码的情况下,发现 PC 指针最后跑到这个 Calibration Error 的Error_Handler()里。也就是说,执行自校准失败了! " F! {9 t* i9 i7 ~- E9 B1 {3 x9 ?

) s: g6 z: C  @再检查进入 Error_Handler()发生的问题,发现在执行HAL_ADCEx_Calibration_Start()时陷在了下面这个 Loop 当中,如图 2 所示。
% U: \; e4 o1 |) |7 M( ^' _5 e* D1 \% }6 x0 Q& W4 ?8 |1 b
7.jpg

+ l" j, U& |/ P7 Z7 A* u. R. h
图2.代码:等待 ADC 自校准完成
. H7 W4 v3 P8 y8 K
8 O  ?! @  m. L' n; x7 g$ }
也就是说,ADCAL 位被置 1 后,始终没有被硬件清 0,代表自校准始终不成功。! y. |4 c; B: }) _  E8 b& v
0 J. y7 R1 f9 Z7 P4 D' m
2.2. 问题分析1 Q% Q2 S- l6 E
查看 STM32U5 的参考手册 RM0456 中关于自校准的描述。考虑到校准没有成功,那么应该看看是不是自校准需要哪些条件,而这些条件并没有成立。4 ?3 Z8 V; |- s$ ?7 y! a
于是,在 ADC 章节中的 Calibration 小节找到了这么一段话,如图 3 所示。4 ?/ H2 P9 \+ a! \4 A
: V3 N% f3 t6 Y: D, p" x5 I
6.jpg

9 D# j1 s5 j0 U$ H
图3.ADC 自校准要求条件

" L/ `1 N9 @) E0 H/ \0 ~6 X: `

  d/ r7 z, y2 f6 }# u也就是说,在初始化自校准之前,需要保证 3 个条件:, s; G+ p5 H9 B6 N( H" @  j
1) ADC 的电压调整器已经使能并正常工作(ADVREGEN = 1 且 LDORDY =1)
5 E/ O3 h& m; I& ]' k" v2) ADC 没有打开(ADEN=0)
) R( q  r) ^" D7 x3) 自动掉电模式没有使能(AUTOFF = 0) 7 \" v& A2 x# n; t

* \) i% O! T$ t2 |回到刚才等待 ADC 自校准完成的代码,当指针停留到这边时,在线调试检查各个标志位情况,发现 ADVREGEN=1,ADEN=0,AUTOFF=0,LDORDY=0。所以,可以肯定的是就是 LDORDY 不为 1,也就是说 ADC 的电压调整器还没有准备好,导致了自校准无法成功并退出。 : V( x; P2 P1 q, y6 H
8 R; P4 Y5 x- Y5 E" T
在 STM32U5 中,引入了一个新的 ADC 特性,叫 ADC 电压调整器(ADC voltageregulator)。在使用 ADC 之前,这个电压调整器必须被使能并且能够稳定工作。可以通过将 ADC_CR 寄存器中的 ADVREGEN 位置 1 来使能它,然后必须要等这个电压调整器的启动时间之后,才可以正常启动自校准或者使用 ADC。这个 LDO 有没有准备好,可以通过 ADC_ISR 寄存器中的 LDORDY 这个位来判断。LDORDY=1 才代表了 LDO 已经准备好了。 ' H6 S- D9 R$ e* p& q) x' z
1 R9 b' A2 J6 w' D/ [2 v' y
回到客户的问题,可以知道即使 ADVREGEN 置 1 了,LDORDY 始终没有置起来,电压调整器没有启动工作,难道是 ADC 的这个电压调整器坏掉了? ( [" X1 b0 s  I* c/ K# r: L- d( @
6 x  u/ }, v4 e& X# }/ v! p: A$ s
别急,想到电源的问题,还不能忘了参考手册的另一个章节 :电源控制 PWR。翻到PWR 这一章,先要考虑到,与 ADC 相关的电源为 VDDA,所以要重点查看 VDDA 的内容。找到 Independent analog peripherals supply 这一小节,可以看以下关键的句子,如图 4。& c$ ^( q7 Q1 B6 z% L: D
$ W; {% R! E0 b
5.jpg
* J2 e- ^+ @0 o( {9 I# J/ I$ d
图4.独立的模拟外设供电
+ b1 H) G5 e) y0 J, t

/ D0 o6 @/ J; [: ^4 J% C8 B) W从图中黄色高亮的文字,我们可以了解到,STM32U5 的 VDDA 在控制上还跟其他系列不一样,它有一个开关来选择是否隔离。芯片复位后,VDDA 提供的 ADC 和模拟开关控制在逻辑和电气上是隔离的,因此不可用。一旦 VDDA 电源存在,就必须在使用模拟外设之前,通过在 PWR_SVMCR 寄存器中将 ASV 置位来消除隔离。也就是说,要想使用ADC,必须先将 ASV 置位来消除隔离。
# I9 v: |/ @; G% [1 w2 W
$ g2 ~) e: L. x& f在 PWR_SVMCR 寄存器的解释中,也可以看到 ASV 位的描述中要求将此位强制置 1才可以使用模拟外设,如图 5。- {* f9 g/ c" C8 l

% X& [% h. k# ]& `1 e! G
4.jpg
8 X; r0 G0 L$ Q4 n
图5.ASV 位描述

) W! m4 i4 t" }- x/ H' s

7 Z7 s8 `7 D! _$ \& q" B% c. FASV 的配置是没有在 STM32CubeMX 中进行配置的,所以需要在后期添加。所以,很可能就是因为没有将 ASV 置位以使能 VDDA,导致 ADC 外设被隔离,并没有得到供电,所以 ADC 的电压调整器不可能正常工作,LDORDY 也不可能为 1。- t0 Y! m) D) M8 M2 }$ p

! o: G. K- J. M' J9 e. ^9 [03问题解决7 G; q( o! e+ A7 E' H
在工程项目中搜索 ASV,可以找到两个 API,如图 6。8 f- ^% Z/ e# D  F1 P9 G3 \0 i

) T6 G2 F4 \0 O$ x$ L, O
3.jpg
+ B$ e3 P+ B" h
图6.VDDA 使能或禁用 API
& J" o6 X9 \% |7 j$ C0 V- b0 X

8 E! c9 D# d0 ]2 C2 M4 }2 q8 M1 [也就是说,我们需要先将 HAL_PWREx_EnableVddA()添加到代码中。因为其属于MSP 硬件配置,所以将其加到 HAL_MspInit()函数,如图 7 所示。+ B# V9 J' E+ J, y- _8 [4 N4 q
* z; p! Q/ `* T3 ~
2.jpg
5 p+ Y/ v. z0 o3 E, [& Q
图7.修改过的 HAL_MspInit()函数

1 x* X8 m3 R- A, I3 d  N! B

$ N: M" k. n+ m) m* B
' Q. K$ ^0 Y0 N* |
再重新编译,然后执行指令代码,就可以看到 ADC 的自校准可以正常完成,PC 指针已经可以正常跑到自校准后面的代码了。9 v: Z- V) S* j9 M; O  K1 l
( I/ d( x: A+ o/ \4 o+ ~
04小结, w! }1 C3 P$ `5 X: o0 W! d2 M- q
在 STM32U5 中,为了更好地控制功耗,ADC 中加入电压调整器和 VDDA 隔离功能。这与以往的 STM32 有所不同,需要注意一下。使用 ADC 等模拟外设前,需要注意将PWR_SVMCR 寄存器中将 ASV 置位来消除隔离。
8 t+ u9 m$ i0 j( ]: U* q* y6 J; t
其实不仅仅是 VDDA 可以隔离,VDDIO2 也是可以的,通过 PWR_SVMCR 寄存器的IO2SV 位进行控制。
0 u( V7 ^8 Q, ]8 V$ {& f3 @
2 j5 c; k6 O: w* E6 c如果仔细看过 STM32U5 的 ADC 例程,可以看到 HAL_MspInit()的内容是这么写的,如图 8 所示。
% {- Y# i' H5 v2 Z( c
$ H5 T( r: J% d* R$ |9 Z5 p
1.jpg

/ Y9 Z; c3 D1 d5 w! _
图8.例程的 HAL_MspInit()函数
$ f; l5 Q7 p3 `# S# [* j
( t6 j2 {- N; o2 B# y. p  H8 _+ m

' @# @# c0 a' y7 _
可以看到,在 MSP 初始化里,不仅使能了 VDDA,还使能了 VDDIO2。所以要使用VDDIO2 相关 I/O 的,也需要注意一下。
7 {. Q: F. A5 }, z5 @" x9 _4 v* Y# J# M8 T0 ]
7 g" H* j- [0 i' V1 Z+ ~* q2 u
转载自: STM32单片机
/ i8 V, G, ]: e如有侵权请联系删除  a4 ^7 |1 }8 s- h7 D' x' f( L9 b
9 o: v! c5 D0 s# ^/ e* b% L( d9 p
; V/ q# A0 j% ^. X

4 |4 l/ M- N2 U, u
赞 收藏 评论0 发布时间:2023-12-11 14:21

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版