Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
PM电源管理
功耗调优
基于RT-Thread功耗调优与PM管理实战经验分享-实战篇
发布于 2020-10-18 13:56:42 浏览:1846
订阅该版
[tocm] [RT-Thread 电源管理与功耗调优系列 - 目录](https://club.rt-thread.org/ask/article/3419.html) [基础篇 概念,基础,理解什么是功耗](https://club.rt-thread.org/ask/article/2282.html) [调试篇 开始搭环境,动手调起来](https://club.rt-thread.org/ask/article/2283.html) [驱动篇 想要调功耗,代码也要有](https://club.rt-thread.org/ask/article/2284.html) [系统篇 如何利用rtos或PM框架,配合PMS线程,管理功耗](https://club.rt-thread.org/ask/article/2285.html) [实战篇 具体问题的实战思考与解决思路](https://club.rt-thread.org/ask/article/2286.html) [日志篇 功耗日志文件输出与解析](https://club.rt-thread.org/ask/article/2288.html) [收尾篇 高调做好功耗,低调掌握知识的回顾](https://club.rt-thread.org/ask/article/2289.html) [进阶:RT-Thread精通PM功耗调优 系列](https://club.rt-thread.org/ask/article/2296.html) [上手:产品功耗管理与调优经验分享 系列](https://club.rt-thread.org/ask/article/2707.html) [应用:PM组件应用与经验分享 系列](https://club.rt-thread.org/ask/article/292.html) 本篇为实战篇。 实践是检验真理的唯一标准。 ## 背景 * 功耗调优涉及到多个方面的知识与经验。 * 消费类电子,如穿戴设备手表、手环、PDA等,为了迎合大众需要,会有各种需求,健康运动、GPS定位、时间、体积小巧等。这些电子设备,大部分都使用锂电池供电。 * 如果电池一直供电,电量很快就会耗光,室外运动等一般需要有几天甚至更长久的工作与待机时间要求,待机并非关机,而是周期性或根据突发事件,立即唤醒并执行某些操作,唤醒后根据需要再次睡眠。 * 其他产品,如电视机等,在使用时会手动打开,不使用时耗电部分关闭等,待机期间除了唤醒开机,不再处理其他事情,PM电源管理作用就不明显。 还有其他电子产品,如交通信号机,7*24小时 市电供应,不需要考虑待机、低功耗,对PM 要求更低。 * 并不是所有设备都需要PM电源管理,只有那些使用电池供电、对功耗要求严格的电子产品,才会引入PM(电源管理)模块。 ## PM管理什么? (1)保证正常模式下,各个模块性能最佳 (2)保证低功耗模式下,根据场景,让功耗降至最低。 (3)保证睡眠模式下,可以唤醒,保持最低功耗。 (4)保证各个模式切换可靠。 (5)保证平均电流(电池供电电压一般不会变化剧烈)最低。 (6)软关机模式下功耗最低。 ## 评价标准: (1)系统待机功耗最低,功耗的关键字:【电流】 (2)系统性能满足需求情况下功耗最低,重点:【满足性能】 (3)整机功耗满足指标。重点:是【整机功耗】 ## 管理内容: (1)线程的管理,睡眠模式与正常模式切换。大家都在工作,凭什么直接停止与睡眠? (2)模块功能的开关逻辑,保证多次开、多次关,驱动正常,功耗正常。有些驱动,开关几次,出问题了? (3)MCU睡眠前,保证外设全部可靠关闭。外设关了一部分,睡眠?功耗很高! (4)MCU唤醒后,保证外设,时钟等,快速恢复成睡眠前状态。不能唤醒的睡眠,是死机! (5)多次的睡眠、唤醒,压力测试正常。必须的。 (6)管理唤醒源,处理完事情后的处理。多个唤醒源,多个唤醒模式的处理。 (7)协调线程直接操作外设或底层驱动。关闭一些需要时间的外设,需要线程环境。 (8)管理与模块不直接相关GPIO PINS,蚊子腿也是肉!! (9)保证某些按需打开关闭模块或业务的正常执行。有些外设不常开,但开了,做完事情,注意及时关闭。 ## 管理难点: (1)底层驱动可靠性,如某些模块,不能快速的进行开关。 (2)模块开关,分为逻辑部分、电源部分,保证关闭后,唤醒能快速恢复。 (3)线程由于业务或关闭异常,不能立即挂起,或不能进入挂起,系统不能睡眠 (4)系统睡眠(MCU 停止前),其他外设因为开关异常,导致部分GPIO PINS 未正常关闭产生漏电。 (5)唤醒到恢复,时间过长,睡眠与唤醒,切换开销较大。 ## 开始PM管理的实战! * PM管理的重点,是管理功耗,调低功耗,运行功耗、待机功耗、整机功耗,调至最低,还要保证业务正常。 * 调功耗是一段较慢长、枯燥,不断踩坑、不断挖坑、不断填坑的过程。 * 至于说前期大家都不重视,你进入项目时,对整个项目不太熟悉,这种现象,太正常了。 * 哪家公司,研发产品,那么的成熟?研发一直是个多人协作的工作。 ## 问题讲解 (1)引脚中断配置错误,引起的问题分析 【问题描述】:使用TP(触摸屏)时,TP有个gpio中断,当你滑动触摸屏时,会产生中断。这个中断,一般会配置为上升沿或是下降沿触发。这个中断,开机时,已经初始化正常了。GUI界面滑动的流畅性,本来就不太好。一天,我想优化功耗,加入了睡眠模式。 睡眠前,我把TP的所有引脚,用的HAL库,改为了analog(模拟态),功耗降的很满意,唤醒后,我又恢复了TP的所有引脚,但并没有跟之前配置一一做对比。改完,发现TP能用。还有其他的代码,一起上了库。 过几天,同事反映,TP卡顿,最后,把我的睡眠函数注释掉就不卡了。原来,我把TP中断触发的边沿搞配反了。 【问题解决】:修复配错的TP中断。 【问题总结】:有些粗心,是可以避免的,有些错误,极难的定位。因此,搞功耗,会与驱动、业务息息相关。不能大意,每个引脚,都要认真的校对。 (2)STOP2睡眠,时钟切换问题 【问题描述】:STM32L4是有STOP2模式的,超低功耗,就靠它,进入这个模式,MCU功耗达到1uA左右。STOP1是100uA左右,所以,要用STOP2。但STOP2是把大部分的时钟给关了的。造成唤醒后,系统只用MSI(内部4Mhz)跑。所以要做恢复时钟的动作。 我仔细看了参考手册,认为,唤醒时,配置只要跟开机时的时钟配置一致,就可以了吧。我试了下,确实可以。后来,出现了重启问题(看门狗重启)。 这个问题最终发现:是唤醒后的时钟配置问题。 【问题解释】:进入STOP2时,如果没有其他的中断或中断pending,可以正常进入STOP2,并且唤醒后,重新配置时钟,没有任何的问题。 问题出在,systick 1ms一次的中断,偶尔会打断stop2,也就是进入stop2后,没有(hold)保持住,立即退出。这时,系统时钟还是开着PLL的,再次配置PLL,STM32 HAL库直接while(1)出错。 但睡眠过程是关全局中断响应的,所以,最终导致看门狗不能喂狗,重启。 【问题解决】唤醒时,反初始化DeInit所有时钟,在重新配置时钟,虽然时间长了点,但靠谱。 (3)STM32L4 看门狗,开了关不了? 【问题分析】看门狗,本来是程序死机后,就可以重启系统的,可是,进入STOP2、StandBy模式,如果不能及时喂狗,重启怎么办? 原来,STM32 参考手册里,可以在sleep时冻结看门狗。 【解决方法】配置看门狗,修改STM32 的选项字节,在STOP2 Standby模式下,冻结freeze 看门狗。 (4)MCO配置错误,造成异常 STM32L4 有个引脚,可以配置成MCO(时钟输出),比如,有另一个芯片,需要时钟源,32KHz,这时,不用晶振,可以把STM32L4 的MCO引脚接过去,配置MCO。 【问题描述】因为睡眠,我把MCO关了!!唤醒后,我把MCO打开了,但我又把MCO引脚配置为普通GPIO,并配置初始低电平。这时,等于STM32L4 内部的一路时钟,被拉到GND了。 【问题解决】配置好MCO引脚, ``` GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Alternate = GPIO_AF0_MCO; 要改为【复用】功能 ``` (5)USB接口耗电问题: 【问题分析】一直觉得整机功耗偏高,因为其他的外设,也不好判断是否都完全关闭,所以,一直忽略这个问题,USB作为U盘功能,挺有用的。后来,发现,关闭USB控制器后,电流降低了200uA左右。 【问题解决】USB功能,产品后,就不会再用,所以,增加关闭的接口。睡眠时,关闭。 (6)loadswitch引起的漏电问题 【问题描述】loadswitch一般作为小电流的开关,类似于MOS管,dcdc过来的电压,基本稳定了,这时,加个loadswitch,可以实现多路电源的开关。但loadswitch有个特点,为了达到快速开关(极速us级)的目的,在关闭后,输出端开启了【放电回路】。 关闭后,输出立即降低。 此时,有一路I2C,默认配置了内部上拉电阻,并且也有外部上拉电阻。造成了放电回路!!! 电流从STM32L4【内部上拉电阻触发 50K左右】->【外部上拉电阻 4K左右】->【关闭的loadswitch 放电回路】->GND。 造成了30uA左右的漏电。 【问题解决】移除I2C总线内部配置的多余的上拉电阻。 (7)Standby 模式下:也可以配置内部上下拉电阻的问题 【问题描述】有一些loadswitch电源开关,如库仑计供电,想在假关机情况下Standby模式,保持供电,但是,Standby模式,配置失效,所有的引脚,全为analog模拟态了。还好,standby模式下,有专用的上下拉。 【原因】函数用错! ``` HAL_PWREx_EnableGPIOPullUp(PWR_GPIO_A, PWR_GPIO_BIT_0); (正确) HAL_PWREx_EnableGPIOPullUp(PWR_GPIO_A, 0);(错误) ``` 【问题解决】使用正确的配置。但这样不生效,还要加上一句: ``` HAL_PWREx_EnablePullUpPullDownConfig();(Standby模式下:生效) ``` 【新问题】这个上Standby模式配置的上下拉,唤醒后,软件重启,依旧有效 【新问题解决】开机后,在关闭Standby模式下的内部上下拉,因为只有关机时,才需要 ``` HAL_PWREx_DisablePullUpPullDownConfig(); (关闭Standby模式下的上下拉) ``` (8)第一次开机,发现睡眠stop2模式功耗异常,断一次电,重新上电,就正常了 这个问题,困扰了我一段时间,总觉得哪里不对劲,但是,STOP2或是Standby模式,调试又不太好使,还担心j-link引起的漏电。 【问题解决】原来stm32 有个调试寄存器,DBG。这个在第一次烧写代码后,有效,目的是在睡眠时,也可以调试板子,怪不得我debug时,程序还有时能跑。一量stm32内核电压,依旧还在。 所以,在开机后(代码已经烧写完),处理DBG寄存器即可。 ``` void rt_pm_disable_dbgmcu(void) { HAL_DBGMCU_DisableDBGStopMode(); HAL_DBGMCU_DisableDBGSleepMode(); HAL_DBGMCU_DisableDBGStandbyMode(); } ``` (9)线程执行环境问题:msh运行,不总是完美 【问题描述】有时,为了验证睡眠,总是想主动的切换,这时,写个MSH 命令,是简单的很,但是,一旦进入睡眠,唤醒后,总会出各种问题,功耗也不太正常。反复的查看测试程序,没找到什么原因。 【问题解决】后来,我通过消息机制,把睡眠的(包括唤醒)测试代码,放在一个其他线程里,如自己建的PMS线程,发现一切正常。 (10)STM32 固件库(老版本)引起的中断问题 【问题描述】如果想关闭GPIO中断,调用rt-thread提供的引脚接口,会发现,关闭中断时,会反初始化这个引脚。 STM32 gpio中断都是分组的, EXIT 0 , 1, 2, 3, 4,中断线PA0~PG0都可以触发(只能陪置一个生效)。 之前的固件库,先把引脚配置改了,再关中断线,造成引脚切到默认的GPIOA上,如果GPIOA的引脚,正好是一个浮动的电平,切此时中断线未关闭瞬间,会产生中断误触发。 【解决方法】ST已经更新了固件库,解决了次问题。 好吧,问题还很多,其他的问题,暂不深究,只是提一下,有时间补充。 (11)STM32 外接PSRAM,睡眠时,PSRAM不关电,FSMC总线漏电问题。 (12)WFI下,想节省功耗(此时时钟全开),关闭部分时钟的问题,优化运行功耗。 (13)外设多次关闭,偶尔发生失败,造成睡眠时的漏电问题(可以判断关闭返回值,关闭多次)。 (14)多机通信,关机时,通知其他模块关机(没成功,其他模块关机失败怎么办?) (15)内核供电,1.8V 通过LDO的方式,转为1.2V,是否可以外接1.2V(DCDC效率高) (16)TP、NFC固件功耗高的问题(找厂家,要超低功耗的固件)。 (17)一些大电流的模块,如蓝牙,连接时不断开,会一直耗电问题,超时关闭问题,关闭策略问题。 等等。。 功耗问题,伴随着项目的结束。 【待续、待补充】
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
张世争
学以致用
文章
132
回答
818
被采纳
179
关注TA
发私信
相关文章
1
STM32F103的低功耗
2
最近用rtthread系统下AD采样并低功耗,中断响应不及时
3
rt-thread低功耗休眠应用问题请教
4
关于RTT对低功耗的支持
5
RT-Thread怎么休眠实现低功耗。
6
RT-Thread V3.0支持的低功耗,OS会自行进入吗?
7
关于RTThread3.0低功耗休眠模式
8
RTT3.0的bsp包中哪些MCU自带低功耗定时器?
9
关于低功耗上次说针对L4出个BSP的,怎么迟迟不见呀
10
低功耗问题。
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
FAL
RTC
rt-smart
I2C_IIC
cubemx
UART
ESP8266
WIZnet_W5500
BSP
ota在线升级
PWM
flash
packages_软件包
freemodbus
潘多拉开发板_Pandora
ADC
GD32
定时器
编译报错
flashDB
keil_MDK
socket
中断
rt_mq_消息队列_msg_queue
Debug
ulog
SFUD
msh
C++_cpp
at_device
本月问答贡献
出出啊
1524
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
818
个答案
179
次被采纳
crystal266
555
个答案
162
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
1
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
2
次点赞
crystal266
2
篇文章
1
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部