Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
PM电源管理
功耗调优
RT-Thread精通PM功耗调优 - 引脚篇
发布于 2020-11-09 13:00:46 浏览:1403
订阅该版
[tocm] [RT-Thread 电源管理与功耗调优系列 - 目录](https://club.rt-thread.org/ask/article/3419.html) [RT-Thread精通PM功耗调优 - 思想篇](https://club.rt-thread.org/ask/article/2296.html) [RT-Thread精通PM功耗调优 - lptimer篇](https://club.rt-thread.org/ask/article/2300.html) [RT-Thread精通PM功耗调优 - 引脚篇](https://club.rt-thread.org/ask/article/2304.html) [RT-Thread精通PM功耗调优 - 线程篇](https://club.rt-thread.org/ask/article/2305.html) [RT-Thread精通PM功耗调优 - 外设篇](https://club.rt-thread.org/ask/article/2307.html) [RT-Thread精通PM功耗调优 - Tickless篇](https://club.rt-thread.org/ask/article/2324.html) [RT-Thread精通PM功耗调优 - 专用LOG篇](https://club.rt-thread.org/ask/article/2338.html) [基础:RT-Thread PM管理实战 系列](https://club.rt-thread.org/ask/article/2282.html) [上手:产品功耗管理与调优经验分享 系列](https://club.rt-thread.org/ask/article/2707.html) [应用:PM组件应用与经验分享 系列](https://club.rt-thread.org/ask/article/292.html) ## 背景 * 本篇主要讲一下基于rt-thread PM框架下,如何管理MCU的引脚,从而配合各个睡眠模式,达到极低功耗的目标,又能保证,各个模式,正常的睡眠、唤醒、切换。 * 大部分的嵌入式软件开发,一般只关心业务的实现,驱动开发,只关心正常打开就可以了,因为要干活嘛,基本上没有关闭的必要。 * 后来,我们开始关心功耗了,关闭了LCD、关闭了BT、关闭了GPS。。然后发现,功耗还有1~10个毫安左右!!这时,就要开始引脚管理了。 ## 思路 * 开始搞功耗,搭好环境,稳压直流可调电源代替电池供电,最好能显示电压、电流(高精度的据说几十万一台!),普通可调的电源,也问题不大。 * 万用表(精细调优,最好配置的好点,如福禄克)。 * 一些驱动代码,引脚处理代码,原理图,有丝印图(PCB文件)更好。 * 硬件设计之初,需要有更良好的接口。(软件叫API:应用程序接口),硬件嘛,就叫HWI硬件调试接口吧。 * 如一个跳线排针,如一个测试点,焊盘,如一个0欧电阻(用于一路电源的通断),体力活,细心活,必要时,焊线,拆器件。 * HWI设计之初,需要跟硬件的讲清楚。都装到壳子里了,板子很小,无任何测试点,无法用电源代替电池供电调试,你让我调功耗? ## 管理引脚 * ### 问:我业务不跑了,CPU不就停下来了吗?用了那什么Tickless模式,不就搞定了功耗? 答: * 处理管理引脚,前期为了配合功耗拆解,后面代码肯定是要上库的。 * Tickless模式也好、Standby STOP2模式也好,都是MCU本身的,你的产品,不会只有MCU本身吧? * 电源LDO loadswitch有没有?外设如uart、 rs485、I2C、SPI、使用的GPIO引脚、等等,有没有?如果都没有,恭喜你,引脚不用管理,如果有,就要考虑你的引脚是干什么的,睡眠时(深睡眠),引脚怎么配,唤醒后(叫醒干活),引脚又怎么配。 ## 管理方法: * 不同的引脚,有不同的配置方法,睡眠前的处理方法,保证不漏电,唤醒后的处理方法,保证系统正常工作。 * 只在深度睡眠(DEEPSLEEP)模式,做大量的引脚处理,并且这个DEEPSLEEP模式,设计上,是不允许频繁唤醒的(1ms一次,还能睡的踏实?)频繁唤醒的电源模式,请使用轻睡眠模式。 * 轻睡眠模式下:可以处理部分引脚,电源开关的引脚,最好不要处理,有电容的存在,供电不可能频繁的马上开,马上关。 ## 睡眠前的处理 * 就叫gpio_pins_deinit()吧,把各个引脚归类,与模块挂钩的,要求驱动在关闭外设时,一同处理掉(STM32L4系列,引脚一般配置为ANALOG模式)。如果引脚配置为ANALOG模式,中途唤醒后,外设还能工作?请看下面:唤醒后的引脚处理。 * 我的项目,引脚都是与模块相关的,LCD、TP、BT、NFC、SPI、I2C、PWR_EN等等,都交给管理模块驱动的管理了,OK,全关了,电流是否1uA?No,接着查。 * 有些引脚,必须要固定的电平,需要配置成默认的上拉、或下拉,是否有漏电?电流拆解方法:先配置成输出LOW,看下电流,在配置成输出HIGH,看下电流。保证不漏电即可。 * 引脚一般配置为:模拟态(analog,OD)、PP输出low(特殊情况下,可以用下拉)、输出高(请用内部上拉)。 * gpio_pins_deinit(),放在那里执行?放在电源模式的deepsleep处理的位置: ```c void I2C1_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = { 0 }; __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_I2C1_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } void I2C1_GPIO_DeInit(void) { GPIO_InitTypeDef GPIO_InitStruct = { 0 }; __HAL_RCC_GPIOB_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } void gpio_pins_deinit(void) { I2C1_GPIO_DeInit(); } void gpio_pins_init(void) { I2C1_GPIO_Init(); } ``` ```c case PM_SLEEP_MODE_DEEP: /* Enter STOP 2 mode */ HAL_PWREx_DisableLowPowerRunMode(); gpio_pins_deinit(); //gpio pins deinit!! lpuart1_wakeup_enable(); __HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_STOP_WAKEUPCLOCK_HSI); HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI); /* Re-configure the system clock */ //HAL_RCC_DeInit(); //SystemClock_Config(); //SystemClock_Config_fromSTOP(); SystemClock_80M(); gpio_pins_init(); //gpio pins init!! lpuart1_wakeup_disable(); //SystemClock_ReConfig(pm->run_mode); break; ``` ## 唤醒处理 引脚处理:gpio_pins_init() * ### 问:外设电源进入DEEPSLEEP后关闭,唤醒后第一时间打开,是这样吗? 答:根据业务处理需求。外设分为(1)一直开着(2)按需开着(3)频繁开关(4)业务需要,根据业务。 * ### 问:啥是业务? 答:问下产品管理者(PM,项目管理) * ### 问:我待机前LCD打开,唤醒后,根据不同的唤醒源,我不一定开LCD的,怎么办? 答:LCD管理,是要有一套管理机制的,需要打开时,就打开,如按键了,我要亮屏,打开。如其他中断,通讯一下,就继续睡眠,唤醒后不用打开。 * ### 问:打开后,引脚怎么配置? 答:配置一般根据开机初始化来,特殊的引脚,需要尝试。目标是不影响驱动的操作,如唤醒前,是高电平,唤醒后,你可以配置成PP(推挽输出),可以配置为高点平。有些总线,不清楚之前的电平?FSMC总线,一般配置为内部上拉。 ## 备注 * 功耗拆解,你需要一张表格: 如下 | 编号 | 整机 ON | 整机 OFF | LCD本身功耗| | --------- | ------ | -------- | ------- | | LCD| 45mA | 4.9mA| 40mA | | TP| 4.9mA | 2.42mA| 2.48mA | | Tickless| 2.72mA | 0.42mA| 降低2.3mA | | UART| 0.42mA | 0.13mA| 降低0.3mA | * 如我的板子,关闭LCD与TP,只需要处理下UART,电流就到达100uA左右了,当然,板子越复杂,表格数据越不靠谱(越要验证交叉影响),但表格的内容,对调试功耗,越重要,把握好方向,总是对的。 ## 排除引脚漏电 ```c STM 所有引脚反初始化,用于除外部模块外,MCU端最低功耗验证 void pwr_key_wakeup_enable(FunctionalState b_on) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB); __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1_LOW); HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1); if (b_on == DISABLE) { GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } else { GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1_LOW); } } /* MSH Test Case:DeInit All GPIO PINS */ void gpio_all_deinit(void) { GPIO_InitTypeDef GPIO_InitStruct = { 0 }; __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB); __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOE_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_All; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); __HAL_RCC_PWR_CLK_ENABLE(); } ``` ## 总结 还是不清楚如何配置引脚? * 引脚配置完,死机了? * 引脚配置完,唤醒后外设不能正常工作? * 引脚不动,一切OK? ### 重点:查数据与参考手册,外设的手册,多尝试,熟悉你的引脚配置。
3
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
张世争
学以致用
文章
131
回答
801
被采纳
173
关注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
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部