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

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

[复制链接]
STMCU小助手 发布时间:2023-12-11 14:21
01引言0 i+ G7 r9 k2 z: U8 j3 F
很多 STM32 系列中的 ADC 都带有自校准的功能。它提供了一个自动校准的过程,用于驱动包括 ADC 上电/掉电序列在内的所有校准动作。在这个过程中,ADC 计算出一个校准因子,并在内部应用到此 ADC 模块,直到下一次 ADC 掉电。在执行任何 ADC 操作之前必须校准,以消除芯片之间 ADC 结果的偏差。
( B8 U( W  I/ A3 O4 }) ?5 Z2 ~. T0 B& a
02问题8 G5 W2 y0 W* V2 b: n3 L8 m
2.1. 问题详情
# ]. q6 ~  v- B6 ?客户使用 STM32U575ZIT6Q 验证 ADC4 时,使用 STM32CubeMX 配置后生成工程项目。因为使用 ADC 进行采样转换前,必须要做 ADC 的自校准。于是在 main 函数中加入自校准代码,如图 1 所示。3 I; n4 q, y* \
: u3 k/ D. a3 A1 m3 f. M" P
8.jpg

" j9 G4 {, M1 y7 D, `6 @# B2 h
图1.代码:ADC 自校准
0 f2 M+ ^& }+ [; a$ d
- K% b- m0 U- v8 G
然而,在运行代码的情况下,发现 PC 指针最后跑到这个 Calibration Error 的Error_Handler()里。也就是说,执行自校准失败了! 1 t3 p, f4 z$ w0 }6 _1 g6 U8 |6 Q

: n& ^+ N( w7 }# i( ~再检查进入 Error_Handler()发生的问题,发现在执行HAL_ADCEx_Calibration_Start()时陷在了下面这个 Loop 当中,如图 2 所示。
; a8 f* I2 [( ]/ |: K! {5 G+ L( b" K" N/ N. B) S
7.jpg

$ y! A% |4 O/ j' M# X* }; a! c
图2.代码:等待 ADC 自校准完成
0 g$ Q1 R' P' W' E
( w9 m' B$ V& I9 V, W+ u
也就是说,ADCAL 位被置 1 后,始终没有被硬件清 0,代表自校准始终不成功。: i! Z& J% Z& |* B2 i0 R' B
' Y0 l; ~6 U  u( e1 q9 k
2.2. 问题分析
4 _1 j- ~! t2 J3 S6 ~+ h查看 STM32U5 的参考手册 RM0456 中关于自校准的描述。考虑到校准没有成功,那么应该看看是不是自校准需要哪些条件,而这些条件并没有成立。: s" i. P# L/ T" w
于是,在 ADC 章节中的 Calibration 小节找到了这么一段话,如图 3 所示。
6 L/ F4 r( {% ~0 _% r
7 c2 I5 P/ |# M$ q1 B/ _: T
6.jpg

9 d* [! m' ?% S6 O; }
图3.ADC 自校准要求条件
4 J6 F: U2 |: A  c7 T% V3 g
2 N2 k- t, l6 w; m) \5 L/ {
也就是说,在初始化自校准之前,需要保证 3 个条件:  V5 Y8 k  `* `4 ~& ^
1) ADC 的电压调整器已经使能并正常工作(ADVREGEN = 1 且 LDORDY =1)  y+ }' P  W6 Z: n' S
2) ADC 没有打开(ADEN=0)
" G! S1 l8 o; P, t( A- A" x4 V3) 自动掉电模式没有使能(AUTOFF = 0) " i' p" ?$ M  I" J- _4 a% b$ L
  ~4 h8 R7 e$ X* k, j- Z  _5 C7 G
回到刚才等待 ADC 自校准完成的代码,当指针停留到这边时,在线调试检查各个标志位情况,发现 ADVREGEN=1,ADEN=0,AUTOFF=0,LDORDY=0。所以,可以肯定的是就是 LDORDY 不为 1,也就是说 ADC 的电压调整器还没有准备好,导致了自校准无法成功并退出。 / P$ q8 G' K0 _( x1 J+ @5 P
% P9 [, j* Z6 \8 O# O
在 STM32U5 中,引入了一个新的 ADC 特性,叫 ADC 电压调整器(ADC voltageregulator)。在使用 ADC 之前,这个电压调整器必须被使能并且能够稳定工作。可以通过将 ADC_CR 寄存器中的 ADVREGEN 位置 1 来使能它,然后必须要等这个电压调整器的启动时间之后,才可以正常启动自校准或者使用 ADC。这个 LDO 有没有准备好,可以通过 ADC_ISR 寄存器中的 LDORDY 这个位来判断。LDORDY=1 才代表了 LDO 已经准备好了。
4 e! i3 B9 s3 w3 x/ D9 q: t1 X0 h8 Y) Y. _& A0 J4 W
回到客户的问题,可以知道即使 ADVREGEN 置 1 了,LDORDY 始终没有置起来,电压调整器没有启动工作,难道是 ADC 的这个电压调整器坏掉了?
; z2 O6 w: o4 k7 n/ F9 L$ j! [1 i6 ?3 R5 ~' W2 z+ i4 `  {# J/ n' V
别急,想到电源的问题,还不能忘了参考手册的另一个章节 :电源控制 PWR。翻到PWR 这一章,先要考虑到,与 ADC 相关的电源为 VDDA,所以要重点查看 VDDA 的内容。找到 Independent analog peripherals supply 这一小节,可以看以下关键的句子,如图 4。+ \3 e0 r( f5 I! [" h# p2 h

/ B+ j& p  f2 ^6 ]
5.jpg
# d0 \4 Z; U; s  _  l
图4.独立的模拟外设供电
' P$ a) e  g5 s* e3 j# I
6 u& S$ I, }9 }9 I9 i# x3 p, o
从图中黄色高亮的文字,我们可以了解到,STM32U5 的 VDDA 在控制上还跟其他系列不一样,它有一个开关来选择是否隔离。芯片复位后,VDDA 提供的 ADC 和模拟开关控制在逻辑和电气上是隔离的,因此不可用。一旦 VDDA 电源存在,就必须在使用模拟外设之前,通过在 PWR_SVMCR 寄存器中将 ASV 置位来消除隔离。也就是说,要想使用ADC,必须先将 ASV 置位来消除隔离。
: }- P: y2 z, \' N9 B8 ^0 I
2 c. Q! i; h) D在 PWR_SVMCR 寄存器的解释中,也可以看到 ASV 位的描述中要求将此位强制置 1才可以使用模拟外设,如图 5。* m: N# [4 `. ?' B  ], F

- R6 L( O- z* ~  K- f% Q1 y
4.jpg
/ R) f7 ~2 X  C
图5.ASV 位描述

0 @' P7 i8 v4 R; G  {

1 \3 B# x. O# ]+ G6 T6 hASV 的配置是没有在 STM32CubeMX 中进行配置的,所以需要在后期添加。所以,很可能就是因为没有将 ASV 置位以使能 VDDA,导致 ADC 外设被隔离,并没有得到供电,所以 ADC 的电压调整器不可能正常工作,LDORDY 也不可能为 1。
  }% m- _8 F6 |. O( w6 Y6 k) U

( E; R5 J) t: g6 T) ~" ~03问题解决2 g5 J3 r  k) t/ Q
在工程项目中搜索 ASV,可以找到两个 API,如图 6。$ s- \/ k& s  _" a

( Z  B; p7 Z3 O& ]
3.jpg
1 M+ p$ o' W0 y) ]( b
图6.VDDA 使能或禁用 API
& G1 ?; J$ I+ H/ ~1 `: z' n8 x. S
* a: e; Y0 h8 Y8 c& Y8 @
也就是说,我们需要先将 HAL_PWREx_EnableVddA()添加到代码中。因为其属于MSP 硬件配置,所以将其加到 HAL_MspInit()函数,如图 7 所示。
# ~) ~, V: x) f4 x
& T+ I4 H) F, ?) X' W
2.jpg

) Y' R! J' C, q5 J( a5 e
图7.修改过的 HAL_MspInit()函数

: z/ S, X( b3 e  [! J- q

( c" T1 K7 g, R% G
* M: g, I: m' r1 `6 \: \
再重新编译,然后执行指令代码,就可以看到 ADC 的自校准可以正常完成,PC 指针已经可以正常跑到自校准后面的代码了。
9 _* a0 V# J1 j' L* ?* V9 J7 R8 A0 _  u% m- K' K* T
04小结
2 L, q6 Z& Z- u, ^& H% o. u在 STM32U5 中,为了更好地控制功耗,ADC 中加入电压调整器和 VDDA 隔离功能。这与以往的 STM32 有所不同,需要注意一下。使用 ADC 等模拟外设前,需要注意将PWR_SVMCR 寄存器中将 ASV 置位来消除隔离。 * P# Y4 Z: X& N3 I
) }1 B2 B# j( A( x/ p; O7 s& X
其实不仅仅是 VDDA 可以隔离,VDDIO2 也是可以的,通过 PWR_SVMCR 寄存器的IO2SV 位进行控制。$ R8 _3 h" i$ }; J2 J

% q1 V$ `8 l" c) \! g5 B! ^& b( |& w如果仔细看过 STM32U5 的 ADC 例程,可以看到 HAL_MspInit()的内容是这么写的,如图 8 所示。% {* E" P8 |( V6 c+ O: I$ k

6 ?% G2 B# q' U2 t7 \6 T
1.jpg
( h* Y  G3 u, q
图8.例程的 HAL_MspInit()函数

& m; D0 P% Z2 [* E; i

9 I! I, D3 _4 \0 I# |/ T9 I+ L* p
# O  {' L" q1 R- M. C
可以看到,在 MSP 初始化里,不仅使能了 VDDA,还使能了 VDDIO2。所以要使用VDDIO2 相关 I/O 的,也需要注意一下。
1 o; ]- w( d& L+ V2 t/ O; g# h5 C9 j( J$ r4 U; r2 m

; z7 O- K4 e1 _& y* k' }6 a9 ~转载自: STM32单片机
: Z9 G! v, U5 `: e7 I如有侵权请联系删除
' g+ L1 _% e. a  n- A
2 B) N; t$ C! `8 {0 _
  b) M$ n- Z3 U/ ]+ i
/ d0 I$ X& |7 a5 \5 \8 c
赞 收藏 评论0 发布时间:2023-12-11 14:21

举报

0个回答

所属标签

相似技术帖

官网相关资源

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