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

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

[复制链接]
STMCU小助手 发布时间:2023-12-11 14:21
01引言( k5 m6 ~* l$ E3 m
很多 STM32 系列中的 ADC 都带有自校准的功能。它提供了一个自动校准的过程,用于驱动包括 ADC 上电/掉电序列在内的所有校准动作。在这个过程中,ADC 计算出一个校准因子,并在内部应用到此 ADC 模块,直到下一次 ADC 掉电。在执行任何 ADC 操作之前必须校准,以消除芯片之间 ADC 结果的偏差。5 @5 J# ~& r8 U( f( j' P; _
' b; H% F0 _& f& I6 m: B
02问题
7 A+ d- Q5 ]& Z$ ?3 @; M: ]% V/ E6 j2.1. 问题详情
* [4 B1 i) X% V$ g( a7 @客户使用 STM32U575ZIT6Q 验证 ADC4 时,使用 STM32CubeMX 配置后生成工程项目。因为使用 ADC 进行采样转换前,必须要做 ADC 的自校准。于是在 main 函数中加入自校准代码,如图 1 所示。% C2 t) t+ \# ^5 B1 [

) b( _& q, x" _7 e6 E
8.jpg

3 R5 D& g* j1 C8 w1 d
图1.代码:ADC 自校准

& a# ~' _; q" h5 F
- @' _! ^) e# n1 \
然而,在运行代码的情况下,发现 PC 指针最后跑到这个 Calibration Error 的Error_Handler()里。也就是说,执行自校准失败了!
  S+ o5 R6 h. [& P+ _9 T+ B3 m" z5 \
7 g+ ^+ r6 R& b& v再检查进入 Error_Handler()发生的问题,发现在执行HAL_ADCEx_Calibration_Start()时陷在了下面这个 Loop 当中,如图 2 所示。
6 L, I" U* N0 o
4 C+ _% {1 ]3 }, w- J. z! j" g- Y
7.jpg
  Z+ n* c' h' I: d9 J+ F
图2.代码:等待 ADC 自校准完成

* a' x2 }- L) a7 C+ g
9 `/ A' J# v, f$ R, m% A0 P
也就是说,ADCAL 位被置 1 后,始终没有被硬件清 0,代表自校准始终不成功。( b  l* ~8 m4 L9 U: J1 Q

& a0 ^) A4 j6 [. i2.2. 问题分析& w5 a9 M% T# E
查看 STM32U5 的参考手册 RM0456 中关于自校准的描述。考虑到校准没有成功,那么应该看看是不是自校准需要哪些条件,而这些条件并没有成立。
. k9 r! s3 O# B8 N) h9 U
于是,在 ADC 章节中的 Calibration 小节找到了这么一段话,如图 3 所示。& B; T; A: w1 e/ {  A* ^

& k2 O! d& ^5 L0 _
6.jpg
1 Q2 u3 W2 r! `2 p  s
图3.ADC 自校准要求条件

8 F- P& @0 `% u6 ^! z
# x% T# d' e! X$ {1 H
也就是说,在初始化自校准之前,需要保证 3 个条件:
3 q0 i8 D* @% T1) ADC 的电压调整器已经使能并正常工作(ADVREGEN = 1 且 LDORDY =1)
4 ~3 y* @; ?  o6 i2) ADC 没有打开(ADEN=0)
5 e# T$ ~. `" I6 z3) 自动掉电模式没有使能(AUTOFF = 0)
9 o" ]! q  L* c# I, Z, F
+ a" E  B% E+ v( K; n# v回到刚才等待 ADC 自校准完成的代码,当指针停留到这边时,在线调试检查各个标志位情况,发现 ADVREGEN=1,ADEN=0,AUTOFF=0,LDORDY=0。所以,可以肯定的是就是 LDORDY 不为 1,也就是说 ADC 的电压调整器还没有准备好,导致了自校准无法成功并退出。
- J% I% ^. x8 Q/ g% h
2 j3 R  k& V6 p% [) V在 STM32U5 中,引入了一个新的 ADC 特性,叫 ADC 电压调整器(ADC voltageregulator)。在使用 ADC 之前,这个电压调整器必须被使能并且能够稳定工作。可以通过将 ADC_CR 寄存器中的 ADVREGEN 位置 1 来使能它,然后必须要等这个电压调整器的启动时间之后,才可以正常启动自校准或者使用 ADC。这个 LDO 有没有准备好,可以通过 ADC_ISR 寄存器中的 LDORDY 这个位来判断。LDORDY=1 才代表了 LDO 已经准备好了。 ; }% k$ t0 C; B1 c! a$ L6 F

  D$ Y9 z$ P# G- Z/ Q# V1 Z回到客户的问题,可以知道即使 ADVREGEN 置 1 了,LDORDY 始终没有置起来,电压调整器没有启动工作,难道是 ADC 的这个电压调整器坏掉了? ' [0 d8 j4 E7 T9 `& |, {& W

. B* Y+ Z, G$ P别急,想到电源的问题,还不能忘了参考手册的另一个章节 :电源控制 PWR。翻到PWR 这一章,先要考虑到,与 ADC 相关的电源为 VDDA,所以要重点查看 VDDA 的内容。找到 Independent analog peripherals supply 这一小节,可以看以下关键的句子,如图 4。7 V& `+ z& F/ h$ m/ M3 C) N

$ }/ Y3 c7 D5 ^, j4 N
5.jpg

6 ]" y) E, a! w, H6 p
图4.独立的模拟外设供电
' e* b- R% I" S5 a. {
8 Z- H* w9 d7 d
从图中黄色高亮的文字,我们可以了解到,STM32U5 的 VDDA 在控制上还跟其他系列不一样,它有一个开关来选择是否隔离。芯片复位后,VDDA 提供的 ADC 和模拟开关控制在逻辑和电气上是隔离的,因此不可用。一旦 VDDA 电源存在,就必须在使用模拟外设之前,通过在 PWR_SVMCR 寄存器中将 ASV 置位来消除隔离。也就是说,要想使用ADC,必须先将 ASV 置位来消除隔离。 ! a) C  v* q4 v  [4 q: p% ]" N
7 o! q$ ]4 O9 s$ p0 S
在 PWR_SVMCR 寄存器的解释中,也可以看到 ASV 位的描述中要求将此位强制置 1才可以使用模拟外设,如图 5。9 \# c  s. g& r

: i6 `2 Z- X7 U* w
4.jpg

. L& n) {% ^: D  `
图5.ASV 位描述
4 F1 E6 t% G+ l0 n
( h4 C( _" `) I+ V0 q9 D' W  ^+ H" |
ASV 的配置是没有在 STM32CubeMX 中进行配置的,所以需要在后期添加。所以,很可能就是因为没有将 ASV 置位以使能 VDDA,导致 ADC 外设被隔离,并没有得到供电,所以 ADC 的电压调整器不可能正常工作,LDORDY 也不可能为 1。$ }0 E; Q, h+ [  H
* O( K% E1 H0 H  u7 }3 m
03问题解决) ^$ x/ a0 j+ J9 M- H+ r4 a
在工程项目中搜索 ASV,可以找到两个 API,如图 6。( ]' j7 a5 X# R# X# k1 x

8 b* p% ^4 b+ H$ f9 R4 _
3.jpg
. |9 V! C4 Q/ Y. g! ^  b
图6.VDDA 使能或禁用 API

: p- s; q1 w5 O5 X3 p
6 @. {' R8 d  Z7 W. R1 }
也就是说,我们需要先将 HAL_PWREx_EnableVddA()添加到代码中。因为其属于MSP 硬件配置,所以将其加到 HAL_MspInit()函数,如图 7 所示。( L  W6 p. k" K. @7 G; r6 K. t# ]

0 q: ?8 E4 O6 P( x- _7 |
2.jpg

% u4 ~; e. U+ K/ Y" P4 J
图7.修改过的 HAL_MspInit()函数

4 ]" Z, [9 ]# ]( h* i2 H* N0 R

# E, w6 A/ r, w, _) T" v
8 b: E- T7 B5 B' M! ]+ c
再重新编译,然后执行指令代码,就可以看到 ADC 的自校准可以正常完成,PC 指针已经可以正常跑到自校准后面的代码了。2 P# ?  ~& n9 ^8 E# P, t6 C' b7 i

, ^0 o# B2 j7 g& Q04小结
* J* d% d" Y4 y: M$ P在 STM32U5 中,为了更好地控制功耗,ADC 中加入电压调整器和 VDDA 隔离功能。这与以往的 STM32 有所不同,需要注意一下。使用 ADC 等模拟外设前,需要注意将PWR_SVMCR 寄存器中将 ASV 置位来消除隔离。
6 g+ P6 {1 L+ }4 ?0 B; [
2 e  o5 i- [0 e) U/ x其实不仅仅是 VDDA 可以隔离,VDDIO2 也是可以的,通过 PWR_SVMCR 寄存器的IO2SV 位进行控制。% T2 W4 F: B1 k% t
/ y1 X0 B9 f! g" ?$ j
如果仔细看过 STM32U5 的 ADC 例程,可以看到 HAL_MspInit()的内容是这么写的,如图 8 所示。& Y' w* B% V8 J

4 u- [" l6 S6 e: ~2 a7 G
1.jpg
/ K/ U0 P( t# M+ C" c3 c: r9 }7 ]
图8.例程的 HAL_MspInit()函数

* l/ c( o# E- p# `: V
4 k% H7 ?7 y/ R) F3 \0 x/ |5 o

2 E2 [; r" `- i& A( B) B) @
可以看到,在 MSP 初始化里,不仅使能了 VDDA,还使能了 VDDIO2。所以要使用VDDIO2 相关 I/O 的,也需要注意一下。4 h3 F, i* H, w
: x% D% r3 j. \% S  N4 Q

$ ~; i9 |( d* C3 w$ P- K转载自: STM32单片机% e" j' u' h( K( H
如有侵权请联系删除
) L6 T. c7 P4 X: o5 T; C- \0 ]% H* M
& {  N2 Q! K3 q
; g) p) k  ]; h+ t1 |4 }, \
收藏 评论0 发布时间:2023-12-11 14:21

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版