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

STM32L031开发时的低功耗异常

[复制链接]
yumeii 发布时间:2019-12-26 14:27
这次说一下使用STM32L031芯片开发产品遇到低功耗异常的问题。
2 T: K9 d2 f# z4 |% n; `6 @8 o( U$ p! ^" s/ W

; _! M: n5 j; y基本软硬件及开发环境如下:
, J4 |5 [: k( S: m- v2 f
1 p7 I. h+ |* {/ Q# o/ }. r9 ~6 _
* \- k/ _5 H! }- H
硬件:STM32L031、外部晶振32.768  D5 ]0 I+ \$ P
8 P$ ~# Y# x5 t5 P9 g2 b* f2 l
3 }% o* t" \5 [+ m* `: L
软件:STM3CUBE、MDK5、HAL库5 g  g( B8 ?' Z0 k$ B; X6 K2 B

! k  a6 _6 v9 v+ P

  N, J' [2 e# y1 S9 K在产品中用到了STOP低功耗模式。在让芯片进入STOP之前,先关闭了ADC外设。
/ V9 U% O: q1 G' ~9 b! J' w! d5 i- _

6 ^! X: C! L( H8 N+ E1 Y代码是这样的:! R2 k, ~1 |* ^+ N
4 x$ X( U3 x- G+ m) K2 q
& N! ^' m' [. I  @% A
HAL_ADC_DeInit(&hadc);
# b8 m1 L6 j$ r/ _! d/ q# q1 T, m) c8 g/ J8 t1 ~6 P4 P
0 }# O1 p( Z4 u) I2 z! ^
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_STOPENTRY_WFI);( v. T$ m& \4 `) p3 m8 D

2 y' I# j% V* D  O8 Q: `
# t& g) E6 g" x
发现按照上述操作进入STOP模式后的功耗,比开机时不开启ADC模块时的功耗要大,而且发现在进STOP之前,有没有HAL_ADC_DeInit()这一句,对功耗没有任何影响。
* l, z+ ?3 A) x# g1 a  H7 L5 C+ Z3 N" f" B+ y

# S4 A5 x6 |/ K+ F2 N稍微整理下,现在的具体情况是这样的:5 f/ u* }' t5 T# l3 j- ^

9 p2 z# z% v- D" F4 j8 R& x

0 X+ ?' K2 I$ ]% v+ v芯片复位后,不初始化ADC外设、不启用ADC相关功能,进stop后芯片功耗为2.6uA。5 T, k. d0 R) P
! \7 Q3 a9 y' q# m

1 u/ G! @* z2 p$ m' m# i如果复位后初始化ADC,进入stop之前做了HAL_ADC_DeInit(&hadc)操作,功耗则为18uA。令人好奇的是,执行了HAL_ADC_DeInit()命令行,也就相当于关闭了ADC外设,进入STOP模式后功耗也应该是2.6左右。事实上差别怎么这么大呢?6 {% {1 B) q' e4 ^. i
( A; I6 P8 G' @5 x. u% h( s
8 N/ x8 m: N; a5 t3 r
难道HAL_ADC_DeInit()没有关闭ADC外设的作用?如果这样,如何在进STOP前关闭ADC外设呢?
) ^# E% h- [/ d' D
8 ~% m4 I6 F) L+ Z$ Y" s' N

  |& n6 a$ T3 @9 v+ t' P其实,HAL_ADC_DeInit(&hadc)的功能只是将ADC模块本身及相关寄存器恢复成复位初状态下的默认值,并不是用来关闭ADC外设模块的。如果使用STM32库函数的话,我们可以调用下面函数关闭ADC外设时钟以停止其功能运行。
. \3 _, C$ I1 `! q+ N
0 t. t9 A: ?0 a7 Q9 G8 p, g
5 }% w# y3 V4 Y$ P+ T* p
__HAL_RCC_ADC1_CLK_DISABLE()  ;
* F* u8 H; w3 W6 ~8 E( r9 b
) A" O2 t( q3 V3 j, x) T7 i
, t/ i% x1 h! g3 {5 \
可是,当我们在进STOP前将HAL_ADC_DeInit(&hadc)换成__HAL_RCC_ADC1_CLK_DISABLE() 后,发现功耗并无明显变化,依旧是18uA左右。那是怎么回事呢?
" L; w0 \- R& o/ V" g1 [. z5 ~1 {+ i: m3 u( a

$ T- M) L, k7 O+ }1 [4 ?之后在让芯片进入STOP前确保没有其它浮空脚存在或可能产生漏电流地方,做各个管脚的硬件确认。经过检查,我们在应用线路上并没有发现什么可疑的地方。
2 ^1 `: F' w) t
9 S0 R  Q/ X) m4 d2 p& B2 {0 Q

" ^4 q- x7 s0 B7 S+ X经过进一步地沟通了解,决定使用ADC模块并未对外部信号进行采样,只是对两个内部信号进行采样。即对内部温度和内部的参考基准电压进行采样转换。) L# V# B; S& S& Q! U
5 A( ^% i% j2 l) P

# ^4 z' B" e8 O5 v$ M现在的情况是,只要芯片复位后不做任何有关ADC的初始化,当然也包括不对上述两个内部信号的采样转换做使能配置,此时功耗就能相对明显地降下去。难道这个功耗降不下去跟开启这两个内部信号的AD转换有关?
2 S, M7 \# E% M5 ]
+ k: l' s7 p4 u" k6 a  L4 f' c
6 G6 c9 _2 M$ I- Y4 ]
循着这个思路,进一步查看STM32L0的参考手册有关内部温度传感器和内部基准参考电压的章节。我们可以发现要对这两个内部信号进行AD采样的话,有专门的针对这两个模块及对应通道的开启使能操作,换句话说,这两个内部模块并不属于ADC外设模块。当开启这两个模块后,简单地关闭ADC外设是没法对二者进行关闭的。
+ M2 n% D4 D0 f5 V: x( ^6 A7 S: J1 [$ c5 ^& D

, p1 C% D: [( q- D! z结合库代码我们也可以看到针对这两个内部信号的使能指令,即下图中红色圆圈圈出来的代码。$ E5 {  R3 d! |5 q4 J

) _- p$ ~/ F1 v9 R: E7 ^& I

5 |  ~* u3 I4 J, z 1.png
, j1 l8 M3 q0 ]- L
" {8 X+ v3 P) d1 K$ J5 a  _5 @* A, T

( A8 S! N) m% c: P# q% {6 {/ }研究到这里,基本可以大致估测到可能是因为开启了这两个内部模块后,带来了额外的功耗。在让芯片进STOP之前,即使关闭了ADC外设时钟,如果没有进一步关闭这两个地方,二者产生的功耗依然存在。
( j9 `* t5 @5 b  e: m' B! P; o: L
3 D. @8 K% @) s

+ m  u8 `# s9 c& Y0 W$ m* B/ }0 c于是,建议大家在让芯片进STOP之前,除了关闭ADC外设时钟外,将开启过的内部温度传感器通道和内部参考电压通道实施关闭操作。即运行如下两行代码:
- n4 D0 ~2 [9 Q& T1 W1 a7 C! K! Y/ \/ i% C
) B" |% {& Q; N" e  d
ADC->CCR &=(~ADC_CCR_TSEN); // Turn Off TemperatureChannel
; t. y4 W; D+ H
9 Y6 ]  L1 I4 q0 h) D

& O- g. w" ]" R$ ]ADC->CCR &=(~ADC_CCR_VREFEN); // Turn Off VrefintChannel
* v; H5 S3 [1 i+ [5 Y8 w) J$ @
; P& E3 |  p: w3 T, R

5 L; M! g. l2 E) x8 n% l9 F, ^我们在进STOP前添加上面两行代码后,STOP模式下的功耗就正常了。显然,当开启内部温度传感器和内部参考电压通道后,会增加些功耗。它们的开启和关闭是单独操作的,这点需注意。$ V7 N1 J+ t0 N9 T: \  y
# z* d# o$ x' @! ]. ]* k" x
+ k7 s/ A# n1 G% Q# R, P
当我们在调试过程中遇到类似问题时先不要着急,尽量结合手册和库代码一步步找原因,或许很快可以拨云见日。
0 e% T, Q) d# L
3 D3 n" Q3 y# `0 O! j
赞 1 收藏 1 评论2 发布时间:2019-12-26 14:27

举报

2个回答
慎微 回答时间:2019-12-26 16:05:16
thanks
yumeii 回答时间:2019-12-27 12:51:54
mikecai 发表于 2019-12-26 16:05" T! m, N; t. F+ B3 Q
thanks
5 A, V9 ?+ H+ J& Q
it's nothing

所属标签

相似技术帖

官网相关资源

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