打印
[STM32L0]

STM32L 低功耗模式下唤醒时间的测量

[复制链接]
1037|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
前言
某客户在使用我们的 STM32L073 芯片做项目的开发, 据他们的工程师反映在测量低功耗模式下的唤醒时间, 他们测试得到的
数据与数据手册中列出的结果不符合,而且差别很大,并且测试了很多片都是这个问题。 想咨询我们什么样的测试方法能够
得到一个符合手册规范的数值。  

使用特权

评论回复
沙发
药无尘|  楼主 | 2021-11-9 10:06 | 只看该作者
一、 测试
在这里正好选取了手边有的 STM32L053C8-Discovery 探索板。
软件里选取“…STM32Cube_FW_L0_V1.9.0\Projects\STM32L053C8-Discovery\Examples\PWR” 目录下的 PWR_STANDBY
和 PWR_STOP 这项目工程,通过这两个低功耗模式做一个说明测量唤醒时间的方法。  

1.1 PWR_STANDBY 模式
查看相应的参考手册 RM, 了解 standby 模式下的特点, 主要涉及到参考手册中的如下两个表格:
  

从这两个表格中,我们可以看到其进入低功耗模式的条件, 退出模式的条件,退出后执行的情况。 对应表格可以看出, 退出
STANDBY 模式后执行的是 RESET 复位, 唤醒的方法我们选择 WKUP 唤醒引脚的上升沿; 进入低功耗的方法有 WFI(wait for
interrupt)和 WFE(wait for event)。


使用特权

评论回复
板凳
药无尘|  楼主 | 2021-11-9 10:06 | 只看该作者
进入低功耗确认
直接打开运行“…STM32Cube_FW_L0_V1.9.0\Projects\STM32L053C8-Discovery\Examples\PWR” 目录下的
PWR_STANDBY 项目工程, 并且阅读工程目录下的 Readme.txt, 了解该项目代码是如何进入低功耗模式,以及进入低功耗
的寄存器及时钟方面的配置, 这里不再赘述,重点是唤醒时间的测量。  


将 JP4 跳线帽拔除, 将万用表调至电流档位, 串入万用表,全速运行项目代码,观测电流功耗,按下 B1 的按钮,看看电流的
差别,判断程序运行是否正常即可(进入低功耗模式前后电流) 。


使用特权

评论回复
地板
药无尘|  楼主 | 2021-11-9 10:07 | 只看该作者
唤醒波形的设置
此时程序已经能够正确的进入并能够退出低功耗模式, 但由于 Discovery 探索板上是采用机械按钮 B1 的唤醒( 通过查看该探
索板的原理图,可以发现 B1 连接到的是 MCU 的 PA0 引脚, WKUP 引脚) , 基于机械按钮在按下或释放按钮的时候, 电平
变高或变低的时候,或存在坡度(按键的抖动和按键电路中电容的影响), 这样不利于观察唤醒时间的读取, 所以可以的操
作是: 1/去除 B1 按键相关的电路,比如电容等,使得与其相连的 PA0 引脚上面没有电路,这时候可以从外部引入发波的波形
进入 PA0。 2/软件代码里配置其它的唤醒引脚输出脉冲用于唤醒; 唤醒引脚上波形的上升沿用于唤醒低功耗模式;
唤醒后的第一条语句的执行
从前面的分析可以知道, STANDBY 模式唤醒后是执行的复位操作, 即对应于 IAR 项目程序中的 Reset Handler。 在 Reset
Handler 中添加引脚状态的切换( 由低变高,或由高变低) , 引脚边沿的变化即可理解为唤醒后开始执行第一条语句的时间;
这里添加 Reset Handler 中的函数最好是汇编代码,如果是 C 语言代码的话,由于编译工具的优化,可能 C 语言的一句代码,
成为汇编语言的话会变成好几条,这就会影响唤醒时间的测量。
  
如果仅仅为了了解测试方法简化使用,可以看到 Reset_Hanlder 执行的第一个函数是 SystemInit, 所以简化一点,可以在
SystemInit 函数的开始添加如下的代码用于判断唤醒后的第一条语句:
  


使用特权

评论回复
5
药无尘|  楼主 | 2021-11-9 10:10 | 只看该作者
唤醒时间的计算
唤醒时间的测量,可以读取时间段= [唤醒引脚上波形的上升沿用于唤醒低功耗模式, 引脚边沿的变化即可理解为唤醒后开始
执行第一条语句的时间
], 也就是两个跳动边沿的时间间隔。
实验结果:
黄色的波形代码的是唤醒引脚 PA0 上的上升沿, 是用于将 MCU 从 Standby 模式下唤醒;
蓝色的波形代码的是, MCU 从 STANDBY 模式唤醒后, 执行的第一个语句翻转 IO 口,
可以看出, STANDBY 模式唤醒的时间测试结果大致为: 70us, 快速唤醒, 符合数据手册上的描述:  


1.2 PWR_STOP 模式
同样的操作步骤和上述 STANDBY 模式类似, 只是通过参考手册表格我们可以知道,唤醒 STOP 模式主要用到的是外部中断
事件, WKUP 引脚不能唤醒了, 唤醒后不是执行 RESET 服务,而是继续执行进入 STOP 模式后的下一条指令。
所以基于上述的分析: 通过打开示例程序“…STM32Cube_FW_L0_V1.9.0\Projects\STM32L053C8-
Discovery\Examples\PWR” 目录下的 PWR_STOP 项目, 主要进行修改如下四个方面:
1/ 系统时钟初始化
修改测试的条件和数据手册中的条件一致, 修改 SystemClock_Config()函数, 这里选取的是系统时钟 SYSCLK = 32MHz,
HCLK = 16MHZ = HSI;

2/ 测试端口的配置 PB12
添加 for testing 部分的代码, 配置 PB12 为 EVENTOUT 模式, 事件输出模式, 结合__SEV()指令,用于在 PB12 的引脚上输
出一个脉冲,单周期指令;

3/STOP 模式的进入

修改成如下的配置:
注意这里用到的 PWR_STOPENTRY_WFE, 而不是 PWR_STOPENTRY_WFI, 这样可以避免需要外部的中断事件唤醒处理
等的时间, 所以这里也可以发现在中断函数中, 由于配置为外部中断, 下面这个函数在原项目工程中不再起作用了。


也就是说 PA0 引脚被配置为 GPIO_MODE_EVT_FALLING, 外部事件模式,而不是外部中断模式。 PA0 的下降沿用于唤醒
STOP 模式。
4/唤醒后的第一条指令
修改 HAL_PWR_EnterSTOPMode()函数,

只添加 for testing 部分的这一条__SEV()指令; 用于唤醒后第一条执行指令也就是在 PB12 引脚上输出一个脉冲。
直接运行程序,
发现实验的结果为:
黄色波形为 PA0 的唤醒波形
蓝色波形为__SEV 指令作用于 PB12 引脚的脉冲。

所以可以看出, STOP 模式下唤醒的时间大约为 5.2us,
数据手册中的数据为 typ 4.9us, max 7 us, 符合手册的说明要求。



使用特权

评论回复
6
药无尘|  楼主 | 2021-11-9 10:10 | 只看该作者
二、 总结
通过上述的两个示例可以看出, 通常结合外部模式( 外部中断模式 External Interrupt Mode 或外部事件模式 External Event
Mode) 和__SEV()指令翻转 GPIO 口来测量低功耗模式下的唤醒时间测量。
由于外部事件模式不需要额外处理中断时间的特点, 所以利用它, 我们能够得到更精确的唤醒时间的测量, 更适合用于唤醒
后执行下一条命令的低功耗模式。  

使用特权

评论回复
7
观海| | 2021-12-4 19:28 | 只看该作者
非常不错的测量方法

使用特权

评论回复
8
guanjiaer| | 2021-12-4 19:31 | 只看该作者
请问什么叫做外部模式

使用特权

评论回复
9
heimaojingzhang| | 2021-12-4 20:03 | 只看该作者
这两种模式有什么区别吗

使用特权

评论回复
10
keaibukelian| | 2021-12-4 20:05 | 只看该作者
时间上有改善啊

使用特权

评论回复
11
tpgf| | 2021-12-4 20:07 | 只看该作者
不同模式唤醒时间不一样

使用特权

评论回复
12
labasi| | 2021-12-4 20:09 | 只看该作者
时间非常好啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

585

帖子

2

粉丝