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

【实战经验】STM32L低功耗模式唤醒时间测量

[复制链接]
zero99 发布时间:2017-7-11 13:22
STM32L低功耗模式下唤醒时间的测量

3 z0 o" p$ R  D, s/ T' d, G  R前言1 f0 `1 a" |. G; p5 R/ d6 J
某客户在使用我们的STM32L073芯片做项目的开发,据他们的工程师反映在测量低功耗模式下的唤醒时间,他们测试得到的数据与数据手册中列出的结果不符合,而且差别很大,并且测试了很多片都是这个问题。想咨询我们什么样的测试方法能够得到一个符合手册规范的数值。

3 J' |* I/ [2 V" h- k& b

4 x0 X. F/ `2 u9 n! {: o, t一、测试
2 |& u8 I5 S9 H/ s, h' X在这里正好选取了手边有的STM32L053C8-Discovery探索板。% @5 y) v0 q' M$ f  y
软件里选取“…STM32Cube_FW_L0_V1.9.0\Projects\STM32L053C8-Discovery\Examples\PWR” 目录下的PWR_STANDBY 和PWR_STOP这项目工程,通过这两个低功耗模式做一个说明测量唤醒时间的方法。

: S7 p# T' e$ v1.1 PWR_STANDBY模式5 z. h+ [' ^0 Z' J) R3 _' @
查看相应的参考手册RM,了解standby模式下的特点,主要涉及到参考手册中的如下两个表格:
' h' z8 v3 m3 Z3 M
22.jpg
! h8 P7 }- {* n. q$ C2 d2 j' t* W  e从这两个表格中,我们可以看到其进入低功耗模式的条件,退出模式的条件,退出后执行的情况。对应表格可以看出,退出STANDBY模式后执行的是RESET复位,唤醒的方法我们选择WKUP唤醒引脚的上升沿;进入低功耗的方法有WFI(wait for interrupt)和WFE(wait for event)。

- B* V9 e  ]% g& j进入低功耗确认1 g- H" C2 R4 M
直接打开运行“…STM32Cube_FW_L0_V1.9.0\Projects\STM32L053C8-Discovery\Examples\PWR” 目录下的PWR_STANDBY项目工程,并且阅读工程目录下的Readme.txt,了解该项目代码是如何进入低功耗模式,以及进入低功耗的寄存器及时钟方面的配置,这里不再赘述,重点是唤醒时间的测量。
23.jpg & u- g: j/ x" h; s( M- C
将JP4跳线帽拔除,将万用表调至电流档位,串入万用表,全速运行项目代码,观测电流功耗,按下B1的按钮,看看电流的差别,判断程序运行是否正常即可(进入低功耗模式前后电流)。

! Q. [. e8 {8 g/ \/ W+ N$ n3 y. N6 {& L唤醒波形的设置, A  L. P/ K9 J7 i, D# P
此时程序已经能够正确的进入并能够退出低功耗模式,但由于Discovery探索板上是采用机械按钮B1的唤醒(通过查看该探索板的原理图,可以发现B1连接到的是MCU的PA0引脚,WKUP引脚),基于机械按钮在按下或释放按钮的时候,电平变高或变低的时候,或存在坡度(按键的抖动和按键电路中电容的影响),这样不利于观察唤醒时间的读取,所以可以的操& [; w8 {7 s8 {, x- j
作是:1/去除B1按键相关的电路,比如电容等,使得与其相连的PA0引脚上面没有电路,这时候可以从外部引入发波的波形进入PA0。2/软件代码里配置其它的唤醒引脚输出脉冲用于唤醒;唤醒引脚上波形的上升沿用于唤醒低功耗模式;
! T, r- R' Q- k0 }" r( Y
唤醒后的第一条语句的执行6 B" ~& J2 E. F5 |
从前面的分析可以知道,STANDBY模式唤醒后是执行的复位操作,即对应于IAR项目程序中的Reset Handler。在Reset Handler中添加引脚状态的切换(由低变高,或由高变低),引脚边沿的变化即可理解为唤醒后开始执行第一条语句的时间;这里添加Reset Handler中的函数最好是汇编代码,如果是C语言代码的话,由于编译工具的优化,可能C语言的一句代码,成为汇编语言的话会变成好几条,这就会影响唤醒时间的测量。
24.jpg ( F# q/ l3 i1 h$ W
如果仅仅为了了解测试方法简化使用,可以看到Reset_Hanlder执行的第一个函数是SystemInit,所以简化一点,可以在SystemInit函数的开始添加如下的代码用于判断唤醒后的第一条语句:

! z1 i# P/ f6 C7 A' Q; A唤醒时间的计算4 c, B: d0 O( U- z& b9 p- C
唤醒时间的测量,可以读取时间段= [唤醒引脚上波形的上升沿用于唤醒低功耗模式,引脚边沿的变化即可理解为唤醒后开始执行第一条语句的时间],也就是两个跳动边沿的时间间隔。# `0 g# N/ M2 `; N: ?
实验结果:
# a6 s5 _, a% E" ^1 o黄色的波形代码的是唤醒引脚PA0上的上升沿,是用于将MCU从Standby模式下唤醒;5 l1 ~, l% L4 l2 R4 z; d: U) ^* a
蓝色的波形代码的是,MCU从STANDBY模式唤醒后,执行的第一个语句翻转IO口,! _: k' y" A, d$ ~0 U. i1 C. `
可以看出,STANDBY模式唤醒的时间测试结果大致为:70us,快速唤醒,符合数据手册上的描述:

# w4 `; y( R, Z: B  d& M( c2 q) o1.2 PWR_STOP模式
+ D$ c4 j  T# v1 h5 N+ {7 G( Q同样的操作步骤和上述STANDBY模式类似,只是通过参考手册表格我们可以知道,唤醒STOP模式主要用到的是外部中断事件,WKUP引脚不能唤醒了,唤醒后不是执行RESET服务,而是继续执行进入STOP模式后的下一条指令。# Q1 X7 \3 W7 R9 ~% d5 B7 S
所以基于上述的分析:通过打开示例程序“…STM32Cube_FW_L0_V1.9.0\Projects\STM32L053C8-Discovery\Examples\PWR” 目录下的PWR_STOP项目,主要进行修改如下四个方面:# Z. O, I! ]2 ?$ T4 O2 ]
1/ 系统时钟初始化9 v7 q# U. }* F6 x9 B: _! x
修改测试的条件和数据手册中的条件一致,修改SystemClock_Config()函数,这里选取的是系统时钟SYSCLK = 32MHz,HCLK = 16MHZ = HSI;
27.jpg
+ g$ C. z1 j$ x$ a/ o2/ 测试端口的配置PB12
/ w/ W0 d  [: Q2 o添加for testing部分的代码,配置PB12为EVENTOUT模式,事件输出模式,结合__SEV()指令,用于在PB12的引脚上输出一个脉冲,单周期指令;
28.jpg
* t4 {/ S: i2 M( X3 {1 E# h! Z3/STOP模式的进入
29.jpg . H- O( G, A- ~& C+ s. s! L! e% t6 W
修改成如下的配置:4 N, Z# `$ Y1 {5 F3 c- J& @
注意这里用到的PWR_STOPENTRY_WFE,而不是PWR_STOPENTRY_WFI,这样可以避免需要外部的中断事件唤醒处理等的时间,所以这里也可以发现在中断函数中,由于配置为外部中断,下面这个函数在原项目工程中不再起作用了。
! B# v3 |/ I3 q6 E; [" |' S
也就是说PA0引脚被配置为GPIO_MODE_EVT_FALLING,外部事件模式,而不是外部中断模式。PA0的下降沿用于唤醒STOP模式。* t2 Q& {# L: l5 H: w
4/唤醒后的第一条指令( G3 @6 r+ Q6 b
修改HAL_PWR_EnterSTOPMode()函数,
31.jpg ' g  I1 O# C  e/ i+ t& L% ^2 x
只添加for testing部分的这一条__SEV()指令;用于唤醒后第一条执行指令也就是在PB12引脚上输出一个脉冲。
6 O" v2 s- a0 S+ O- y: o+ c直接运行程序,
! f0 R4 ^+ B! `5 D5 S6 |( ^发现实验的结果为:. E1 w: E: N; V& c3 p* b- K9 r
黄色波形为PA0的唤醒波形
7 H6 a; w3 E( @: I: {7 x) l8 I蓝色波形为__SEV指令作用于PB12引脚的脉冲。

1 b2 f3 F9 y+ J. P& d
32.jpg
" @* c: T+ B5 ]/ Q) M所以可以看出,STOP模式下唤醒的时间大约为5.2us,
  ~- S  }/ ?, t7 o% m6 y数据手册中的数据为typ 4.9us,max 7 us,符合手册的说明要求。
33.jpg ' K' Z. M$ e  s

, n1 {/ L0 S, @% x1 t- _
5 s, }6 p8 O; V8 j% u6 {
二、总结. D( ^6 t( a( |1 p' |' W2 Q
通过上述的两个示例可以看出,通常结合外部模式(外部中断模式External Interrupt Mode或外部事件模式External Event Mode)和__SEV()指令翻转GPIO口来测量低功耗模式下的唤醒时间测量。  H, ~3 ^! \* Y. ?. T& A1 A
由于外部事件模式不需要额外处理中断时间的特点,所以利用它,我们能够得到更精确的唤醒时间的测量,更适合用于唤醒后执行下一条命令的低功耗模式。
6 L9 s. ^& s) |6 Y1 S
5 z2 x. |' d9 D/ Q

2 m$ m7 w- O3 c9 T: y! K, H

- ?8 Q( H3 n* U  \9 F7 v$ @& P
0 _$ u2 E3 W0 t% ]
赞 收藏 2 评论1 发布时间:2017-7-11 13:22

举报

1个回答
wolfgang 回答时间:2017-7-11 14:35:51
消灭0回复

所属标签

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