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

【经验分享】STM32L 低功耗模式下唤醒时间的测量

[复制链接]
STMCU小助手 发布时间:2022-3-5 22:33
前言2 I7 E  d( |4 J9 \6 x  O2 y0 ^
某客户在使用我们的 STM32L073 芯片做项目的开发,据他们的工程师反映在测量低功耗模式下的唤醒时间,他们测试得到的数据与数据手册中列出的结果不符合,而且差别很大,并且测试了很多片都是这个问题。想咨询我们什么样的测试方法能够得到一个符合手册规范的数值。! \& g* h/ e* r9 _& p4 |7 d
2 z3 T: m& `  I9 c
一、测试: _5 W1 m7 G1 X$ a( U1 X
在这里正好选取了手边有的 STM32L053C8-Discovery 探索板。
# O5 _: T7 e: d& f6 \软件里选取“…STM32Cube_FW_L0_V1.9.0\Projects\STM32L053C8-Discovery\Examples\PWR” 目录下的 PWR_STANDBY和 PWR_STOP 这项目工程,通过这两个低功耗模式做一个说明测量唤醒时间的方法。: {& |7 s/ y& O' ~0 X& a
1.1 PWR_STANDBY 模式
. h4 R  L% C8 p" }3 P/ H查看相应的参考手册 RM,了解 standby 模式下的特点,主要涉及到参考手册中的如下两个表格:
5 y/ O$ y! n4 I! Q4 O6 S4 ?6 R0 f( c# f" L9 T2 l$ B
[Z)A]LJRF${(~0H22W$U(OD.png . \1 X# V9 n& n6 z& O4 I( G, j
9 T3 H6 {, r+ X  }  u/ F( h% r
PY@_5NO1MMEVH}GGN8JR_4A.png / H. H; ]: O0 z. E

" j: Y7 b" p& ?+ h3 \从这两个表格中,我们可以看到其进入低功耗模式的条件,退出模式的条件,退出后执行的情况。对应表格可以看出,退出STANDBY 模式后执行的是 RESET 复位,唤醒的方法我们选择 WKUP 唤醒引脚的上升沿;进入低功耗的方法有 WFI(wait for interrupt)和 WFE(wait for event)。6 J4 w9 n+ Q9 M/ r

7 G" m+ v- @+ K$ _进入低功耗确认
7 Y0 _; U/ d6 O, q' x$ S9 s7 P7 R直接打开运行“…STM32Cube_FW_L0_V1.9.0\Projects\STM32L053C8-Discovery\Examples\PWR” 目录下的PWR_STANDBY 项目工程,并且阅读工程目录下的 Readme.txt,了解该项目代码是如何进入低功耗模式,以及进入低功耗的寄存器及时钟方面的配置,这里不再赘述,重点是唤醒时间的测量。
) e6 I+ t3 f9 Q) X) }* s0 J+ |# C
- R- u. m4 p& J $)QKXR9}_DLPF)L%M4D8IRQ.png
3 m8 \5 O& C8 }: l# S3 F* }
3 x: ^/ ~5 }# g将 JP4 跳线帽拔除,将万用表调至电流档位,串入万用表,全速运行项目代码,观测电流功耗,按下 B1 的按钮,看看电流的差别,判断程序运行是否正常即可(进入低功耗模式前后电流)。- N- Q, r9 E) W( m! c9 p# g0 Y0 z

8 K5 A: t& ]9 l3 B" g唤醒波形的设置& p! p: w  v* k4 E2 C- \1 y% r
此时程序已经能够正确的进入并能够退出低功耗模式,但由于 Discovery 探索板上是采用机械按钮 B1 的唤醒(通过查看该探索板的原理图,可以发现 B1 连接到的是 MCU 的 PA0 引脚,WKUP 引脚),基于机械按钮在按下或释放按钮的时候,电平变高或变低的时候,或存在坡度(按键的抖动和按键电路中电容的影响),这样不利于观察唤醒时间的读取,所以可以的操作是:1/去除 B1 按键相关的电路,比如电容等,使得与其相连的 PA0 引脚上面没有电路,这时候可以从外部引入发波的波形进入 PA0。2/软件代码里配置其它的唤醒引脚输出脉冲用于唤醒;唤醒引脚上波形的上升沿用于唤醒低功耗模式;5 O( a! W7 B" S; Z" W

. v( ?) s: d) O2 |$ Y( a3 k' b; B唤醒后的第一条语句的执行% p, h9 U* h3 }( t! o* R
从前面的分析可以知道,STANDBY 模式唤醒后是执行的复位操作,即对应于 IAR 项目程序中的 Reset Handler。在 Reset Handler 中添加引脚状态的切换(由低变高,或由高变低),引脚边沿的变化即可理解为唤醒后开始执行第一条语句的时间;这里添加 Reset Handler 中的函数最好是汇编代码,如果是 C 语言代码的话,由于编译工具的优化,可能 C 语言的一句代码,成为汇编语言的话会变成好几条,这就会影响唤醒时间的测量。
. g" ~9 b3 Y9 e3 p7 c- t
& Q, ~$ r) n( s6 V4 j IK3YTE0UJ[{3PR@6FW4K(PM.png : m# i' n3 o. h6 y% R
  E) T4 }4 m% u4 q0 @
如果仅仅为了了解测试方法简化使用,可以看到 Reset_Hanlder 执行的第一个函数是 SystemInit,所以简化一点,可以在SystemInit 函数的开始添加如下的代码用于判断唤醒后的第一条语句:& ~# G* q( x" z8 \. l

6 D& D: t$ ^0 c  M! t6 W- B L7R~VAHS7[P)LK@9%WKMQ19.png
% h( _& I2 h3 z  G8 d; o
  B+ o7 I/ _  Q唤醒时间的计算) M& R. w% _& e0 N1 F% q
唤醒时间的测量,可以读取时间段= [唤醒引脚上波形的上升沿用于唤醒低功耗模式,引脚边沿的变化即可理解为唤醒后开始执行第一条语句的时间],也就是两个跳动边沿的时间间隔。
  n6 z5 z+ V: F6 w实验结果:' S. ]' \3 I. s4 X
黄色的波形代码的是唤醒引脚 PA0 上的上升沿,是用于将 MCU 从 Standby 模式下唤醒;
# g9 {/ ~' y, H/ z! Y蓝色的波形代码的是,MCU 从 STANDBY 模式唤醒后,执行的第一个语句翻转 IO 口,1 H& P7 Q9 I+ m2 H; d' Z9 \' B, G
可以看出,STANDBY 模式唤醒的时间测试结果大致为:70us,快速唤醒,符合数据手册上的描述:
' `! r% g( C- P/ p+ V3 X8 Y: g; p. |( p3 z! R
U)51R_@3LPUF[EMCF(0GF1U.png
( k6 f" m' g  y. V/ x, o% A6 f5 c
, g" I- a4 ]$ f( }& i1.2 PWR_STOP 模式9 y  R( U: `8 L" _1 A% C
同样的操作步骤和上述 STANDBY 模式类似,只是通过参考手册表格我们可以知道,唤醒 STOP 模式主要用到的是外部中断事件,WKUP 引脚不能唤醒了,唤醒后不是执行 RESET 服务,而是继续执行进入 STOP 模式后的下一条指令。
6 }( u, _7 L" M4 }7 a- `所以基于上述的分析:通过打开示例程序“…STM32Cube_FW_L0_V1.9.0\Projects\STM32L053C8-Discovery\Examples\PWR” 目录下的 PWR_STOP 项目,主要进行修改如下四个方面:
& B' D; [1 }+ t' ]1/ 系统时钟初始化  f+ t! O1 ]0 g6 i* A) w
修改测试的条件和数据手册中的条件一致,修改 SystemClock_Config()函数,这里选取的是系统时钟 SYSCLK = 32MHz,HCLK = 16MHZ = HSI;
/ v: E) ]# h9 t- e( {8 J/ w# y+ R  U
; w5 k1 T$ l6 b5 U7 r) b$ O X$!)SR%_3V98%HWYTV3]W.png
4 T" _" \: O6 l* t
6 s: n! s/ C$ l: }2/ 测试端口的配置 PB12, [0 C  L& V, z* Z, L: k
添加 for testing 部分的代码,配置 PB12 为 EVENTOUT 模式,事件输出模式,结合__SEV()指令,用于在 PB12 的引脚上输出一个脉冲,单周期指令;2 V, C; x  R! v. r. j8 X

$ X$ h5 O2 G4 x1 ^1 K3 H) J RY)XIGR~$XUPJF3(_}[VCB6.png & `0 x; g7 A, [. E5 ]" H0 k

7 u8 L6 `0 X8 m$ T1 l3/STOP 模式的进入
, n7 w  }) I$ J6 [4 z3 t. ?" W* a& y
57R0PU`JRAU]D]4_7DS@Q(F.png , w' Y8 @; Q* V

- A9 f$ N" W$ a" v/ x修改成如下的配置:
: u. p1 h( v9 @& Q* `+ r注意这里用到的 PWR_STOPENTRY_WFE,而不是 PWR_STOPENTRY_WFI,这样可以避免需要外部的中断事件唤醒处理等的时间,所以这里也可以发现在中断函数中,由于配置为外部中断,下面这个函数在原项目工程中不再起作用了。2 e( G+ Y/ L  L- U8 Z  N$ _

1 c  p: l6 n# k7 b3 w+ S) u7 d% @
$ v: |6 f4 s8 J! z" _, o; q 4SJQ268EO{UZFN{FXMJ4VG1.png
* b3 ]7 u5 {* A/ W" R7 {3 D
* |% V- w# F: r7 o9 D [TDC%~ALIX0Q6MF@SSJWI2S.png % }2 p1 \4 Z6 k

  `1 P# o, j$ }7 P& `也就是说 PA0 引脚被配置为 GPIO_MODE_EVT_FALLING,外部事件模式,而不是外部中断模式。PA0 的下降沿用于唤醒STOP 模式。
7 q2 k$ U- C. H) I# Y' N4/唤醒后的第一条指令0 S, W  E5 f# [9 I3 {9 K4 d
修改 HAL_PWR_EnterSTOPMode()函数,
% Q; Y+ V; A4 W7 C4 J( r' v$ g& P4 G
GF0VVW1N@Y0PCD{L`CS$_KF.png # O& _& g( J# M+ b( ?
7 w/ y" n- ]; }' |4 t" _/ ^$ E9 B, h
只添加 for testing 部分的这一条__SEV()指令;用于唤醒后第一条执行指令也就是在 PB12 引脚上输出一个脉冲。直接运行程序,
2 E/ k' k$ T1 M发现实验的结果为:
9 g) b3 X, H9 {% z3 P+ }/ I' {黄色波形为 PA0 的唤醒波形
. O/ q. O( `$ x+ t. X( h蓝色波形为__SEV 指令作用于 PB12 引脚的脉冲。
0 G; R9 j8 o/ q! W( j/ n4 K5 m6 b" a
{){Q])UL)A3`CPP7YJ@XD3S.png * F9 }+ C, w- f2 I! }! P
) v  G3 p- @% _% i! G7 F
所以可以看出,STOP 模式下唤醒的时间大约为 5.2us,
! S9 J, Z( ]0 a* L2 V数据手册中的数据为 typ 4.9us,max 7 us,符合手册的说明要求。" t- X  w  N8 \4 E1 W
0 ?' C+ K2 N9 f3 Q5 F
A0@7SXX}Q9NAYR4DAO1M3YJ.png
$ O' F& h  C" C; B. }6 X6 c- W) F( v% R
二、总结
. b9 S- O1 f) p$ Q' Z通过上述的两个示例可以看出,通常结合外部模式(外部中断模式 External Interrupt Mode 或外部事件模式 External Event Mode)和__SEV()指令翻转 GPIO 口来测量低功耗模式下的唤醒时间测量。
% P) X7 p* }. _+ Z  [( y1 ]: u8 M9 ^由于外部事件模式不需要额外处理中断时间的特点,所以利用它,我们能够得到更精确的唤醒时间的测量,更适合用于唤醒后执行下一条命令的低功耗模式。
! m) q! i. {" x$ {; c, W0 Q  r& \" I$ Z

3 E' s& F7 \# ?' N* ?! o% o3 W7 @7 U
收藏 评论0 发布时间:2022-3-5 22:33

举报

0个回答

所属标签

相似分享

官网相关资源

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