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

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

[复制链接]
STMCU小助手 发布时间:2022-3-5 22:33
前言
9 J' M3 }1 i( r2 E9 o% w1 X) A某客户在使用我们的 STM32L073 芯片做项目的开发,据他们的工程师反映在测量低功耗模式下的唤醒时间,他们测试得到的数据与数据手册中列出的结果不符合,而且差别很大,并且测试了很多片都是这个问题。想咨询我们什么样的测试方法能够得到一个符合手册规范的数值。: x# q" ^2 P3 G

1 l4 m9 Q4 g, s( }0 h一、测试
% q5 ?2 d( i( I7 U4 H& S* f; N在这里正好选取了手边有的 STM32L053C8-Discovery 探索板。0 p# s, l, y% g/ c: P3 l
软件里选取“…STM32Cube_FW_L0_V1.9.0\Projects\STM32L053C8-Discovery\Examples\PWR” 目录下的 PWR_STANDBY和 PWR_STOP 这项目工程,通过这两个低功耗模式做一个说明测量唤醒时间的方法。
: j8 g. o8 w5 F: p8 ^$ G+ a% F' N1.1 PWR_STANDBY 模式8 K* Y( Y, y4 h! K
查看相应的参考手册 RM,了解 standby 模式下的特点,主要涉及到参考手册中的如下两个表格:. ]' J8 x( A& r& D

; m/ G7 ~3 L/ N2 r1 ` [Z)A]LJRF${(~0H22W$U(OD.png / o0 e4 C7 ~  I, g" v

. f  J8 ^! C; k6 O9 K PY@_5NO1MMEVH}GGN8JR_4A.png ; z3 s  k: |( y

+ K  N9 A0 Q) g3 E; C' `) n! T从这两个表格中,我们可以看到其进入低功耗模式的条件,退出模式的条件,退出后执行的情况。对应表格可以看出,退出STANDBY 模式后执行的是 RESET 复位,唤醒的方法我们选择 WKUP 唤醒引脚的上升沿;进入低功耗的方法有 WFI(wait for interrupt)和 WFE(wait for event)。
$ K" i. h7 L9 U, f1 T$ O% z% K$ F; E" c' Q# r
进入低功耗确认
" r) @& [! `4 m0 Y6 W5 q! ^直接打开运行“…STM32Cube_FW_L0_V1.9.0\Projects\STM32L053C8-Discovery\Examples\PWR” 目录下的PWR_STANDBY 项目工程,并且阅读工程目录下的 Readme.txt,了解该项目代码是如何进入低功耗模式,以及进入低功耗的寄存器及时钟方面的配置,这里不再赘述,重点是唤醒时间的测量。
$ l* m2 C; c9 ?6 c1 G: @- ^: k
/ y: [# H* z9 ]7 k5 e1 [" B $)QKXR9}_DLPF)L%M4D8IRQ.png ' X1 \6 Z, t" a: u) X
4 D6 T9 Y& p. [4 n# P; ?6 m* C
将 JP4 跳线帽拔除,将万用表调至电流档位,串入万用表,全速运行项目代码,观测电流功耗,按下 B1 的按钮,看看电流的差别,判断程序运行是否正常即可(进入低功耗模式前后电流)。
/ @* s* h1 H, u, Y/ a' F4 q( J" h5 o" m" j* ~% i+ D) P, ?
唤醒波形的设置
- u2 q* M9 A' I3 D- x1 t* c此时程序已经能够正确的进入并能够退出低功耗模式,但由于 Discovery 探索板上是采用机械按钮 B1 的唤醒(通过查看该探索板的原理图,可以发现 B1 连接到的是 MCU 的 PA0 引脚,WKUP 引脚),基于机械按钮在按下或释放按钮的时候,电平变高或变低的时候,或存在坡度(按键的抖动和按键电路中电容的影响),这样不利于观察唤醒时间的读取,所以可以的操作是:1/去除 B1 按键相关的电路,比如电容等,使得与其相连的 PA0 引脚上面没有电路,这时候可以从外部引入发波的波形进入 PA0。2/软件代码里配置其它的唤醒引脚输出脉冲用于唤醒;唤醒引脚上波形的上升沿用于唤醒低功耗模式;& Y8 ]) g+ @" _4 d1 W8 ]+ ?+ M
7 a$ j  E  a( e& q! a/ e9 s
唤醒后的第一条语句的执行# g" H/ x" F3 J: d( V' i
从前面的分析可以知道,STANDBY 模式唤醒后是执行的复位操作,即对应于 IAR 项目程序中的 Reset Handler。在 Reset Handler 中添加引脚状态的切换(由低变高,或由高变低),引脚边沿的变化即可理解为唤醒后开始执行第一条语句的时间;这里添加 Reset Handler 中的函数最好是汇编代码,如果是 C 语言代码的话,由于编译工具的优化,可能 C 语言的一句代码,成为汇编语言的话会变成好几条,这就会影响唤醒时间的测量。
( j7 J" \% M  [' h& Q/ J. f
+ I# F9 M: B  |3 C/ ^ IK3YTE0UJ[{3PR@6FW4K(PM.png 3 V0 o8 C4 E. O3 n# F: E/ Z8 w
5 _* t, U/ a8 T+ q
如果仅仅为了了解测试方法简化使用,可以看到 Reset_Hanlder 执行的第一个函数是 SystemInit,所以简化一点,可以在SystemInit 函数的开始添加如下的代码用于判断唤醒后的第一条语句:
+ B2 X% f2 W; _* q9 ^. {3 b
9 {) X+ g) r5 J" |. \, q+ q$ { L7R~VAHS7[P)LK@9%WKMQ19.png # o: @* g- R4 k& K5 J+ ~. U7 O. Q
4 t* R7 j& U; V/ |# U! T
唤醒时间的计算
6 a" v- F/ u' E: g! m. U- ?唤醒时间的测量,可以读取时间段= [唤醒引脚上波形的上升沿用于唤醒低功耗模式,引脚边沿的变化即可理解为唤醒后开始执行第一条语句的时间],也就是两个跳动边沿的时间间隔。
( B4 a6 t/ U" A* ^+ s% l实验结果:( U( e4 i( \" Z$ g3 q, @7 T  v7 g; q; J: G
黄色的波形代码的是唤醒引脚 PA0 上的上升沿,是用于将 MCU 从 Standby 模式下唤醒;' ^( ]- s# H+ g1 I# d
蓝色的波形代码的是,MCU 从 STANDBY 模式唤醒后,执行的第一个语句翻转 IO 口,
# C  D. D+ q+ p可以看出,STANDBY 模式唤醒的时间测试结果大致为:70us,快速唤醒,符合数据手册上的描述:
% U" \$ d* H( u: F. V% b
' S: S9 v  c' i/ W0 y1 v' r+ Y U)51R_@3LPUF[EMCF(0GF1U.png / I3 P* s$ p2 F8 ~0 o

# K7 Z* V! F! n( W5 Q6 A1.2 PWR_STOP 模式1 a  ?3 w8 q4 E
同样的操作步骤和上述 STANDBY 模式类似,只是通过参考手册表格我们可以知道,唤醒 STOP 模式主要用到的是外部中断事件,WKUP 引脚不能唤醒了,唤醒后不是执行 RESET 服务,而是继续执行进入 STOP 模式后的下一条指令。
. x  D! z3 X( `所以基于上述的分析:通过打开示例程序“…STM32Cube_FW_L0_V1.9.0\Projects\STM32L053C8-Discovery\Examples\PWR” 目录下的 PWR_STOP 项目,主要进行修改如下四个方面:8 w1 d, H& J4 H: G6 |
1/ 系统时钟初始化* S/ t# Z6 n& ~# x) S' B3 g  G
修改测试的条件和数据手册中的条件一致,修改 SystemClock_Config()函数,这里选取的是系统时钟 SYSCLK = 32MHz,HCLK = 16MHZ = HSI;
* B' Q% f0 z7 W+ y/ h  T9 B7 J2 Z* D/ }" e" g* H/ t: h- _5 }
X$!)SR%_3V98%HWYTV3]W.png
! x4 O* T5 }, V7 Y
- c" A( q- a: J$ Z) A1 N2/ 测试端口的配置 PB12
) ]* o: L. c- d2 j$ U& K7 R添加 for testing 部分的代码,配置 PB12 为 EVENTOUT 模式,事件输出模式,结合__SEV()指令,用于在 PB12 的引脚上输出一个脉冲,单周期指令;
6 y: @' O9 T5 F* I0 n
# {' e" s  q4 }6 h* N' u* {* [ RY)XIGR~$XUPJF3(_}[VCB6.png 9 L, G) |& Q$ X4 c6 o) D

1 q- n+ O8 `. H4 A1 q1 n3/STOP 模式的进入
1 H( k: [7 H0 }; U+ C2 @2 Q. c* d! ]& J5 g2 p% q) I' C; O: ^; y+ h  a
57R0PU`JRAU]D]4_7DS@Q(F.png
- t* N# }' R* T( t$ d0 l
. g1 N$ u+ K3 P修改成如下的配置:
" m. w, n! g2 e5 c: G注意这里用到的 PWR_STOPENTRY_WFE,而不是 PWR_STOPENTRY_WFI,这样可以避免需要外部的中断事件唤醒处理等的时间,所以这里也可以发现在中断函数中,由于配置为外部中断,下面这个函数在原项目工程中不再起作用了。1 `, y* B7 C, `! o5 O3 B! \

7 f" X3 s% u  Q# Y0 C$ |
/ j; C1 j$ T& q 4SJQ268EO{UZFN{FXMJ4VG1.png 1 s8 j1 r, {' t; V, L
  ?# K) j5 k, c7 K4 Z1 ^
[TDC%~ALIX0Q6MF@SSJWI2S.png
7 q# F% C7 |9 B/ b3 s& h+ T: {  C9 K% M) F5 b4 e
也就是说 PA0 引脚被配置为 GPIO_MODE_EVT_FALLING,外部事件模式,而不是外部中断模式。PA0 的下降沿用于唤醒STOP 模式。8 J* N8 ~1 ?4 C) f7 ?" V
4/唤醒后的第一条指令0 V0 j0 ]1 c1 j8 D+ e! v4 x1 w
修改 HAL_PWR_EnterSTOPMode()函数,2 r/ K) s* a. C5 ^/ m! o" I; ^( A
6 R2 u, e# v6 V: G5 u9 g
GF0VVW1N@Y0PCD{L`CS$_KF.png 2 x5 T* @3 b* ]" v

+ ]$ w( U0 F# D, ^" G2 Z: B$ e只添加 for testing 部分的这一条__SEV()指令;用于唤醒后第一条执行指令也就是在 PB12 引脚上输出一个脉冲。直接运行程序,
" u3 h: v% o! X( _发现实验的结果为:
) j, R4 i8 R7 }: s) a, T+ d! M6 D黄色波形为 PA0 的唤醒波形* e7 t7 y! v2 y+ u/ P. _
蓝色波形为__SEV 指令作用于 PB12 引脚的脉冲。' R+ f6 s* R9 @( p& e- D
$ |7 `7 z4 r2 H. B  K; x& o
{){Q])UL)A3`CPP7YJ@XD3S.png , r3 j( ]) V* L5 y7 j9 D* ]
% X1 }# \) m" I3 v; n" R
所以可以看出,STOP 模式下唤醒的时间大约为 5.2us,1 o8 F* I0 m9 s# v; h. X" J+ p
数据手册中的数据为 typ 4.9us,max 7 us,符合手册的说明要求。. F+ m  O! w2 @# N, a2 w7 j8 I6 R

# Z; s; j2 o  b# J) Q A0@7SXX}Q9NAYR4DAO1M3YJ.png
9 N+ T% y; r/ }$ y' X, p* [5 ^1 N( O0 \0 A8 |* j/ y2 V" F
二、总结
2 q0 i1 b& W1 n! `0 L3 i通过上述的两个示例可以看出,通常结合外部模式(外部中断模式 External Interrupt Mode 或外部事件模式 External Event Mode)和__SEV()指令翻转 GPIO 口来测量低功耗模式下的唤醒时间测量。- n9 s2 T4 T9 B
由于外部事件模式不需要额外处理中断时间的特点,所以利用它,我们能够得到更精确的唤醒时间的测量,更适合用于唤醒后执行下一条命令的低功耗模式。6 z8 f5 U% ^/ o( R! d

6 N6 r- z: v6 X3 L$ I/ A/ j$ ]3 `9 X1 m1 j. M! r
赞 收藏 评论0 发布时间:2022-3-5 22:33

举报

0个回答

所属标签

相似技术帖

官网相关资源

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