基于rt-thread功耗调优与PM管理实战经验分享-驱动篇

基础篇 概念,基础,理解什么是功耗

调试篇 开始搭环境,动手调起来

驱动篇 想要调功耗,代码也要有

系统篇  如何利用rtos或PM框架,配合PMS线程,管理功耗

实战篇  具体问题的实战思考与解决思路
日志篇  通过console log_file parse_log,搭建功耗日志输出与解析
收尾篇  高调做好功耗,低调掌握知识的回顾。

 

        本篇为驱动篇:若要问我,搞驱动,不就是指导其他人这么搞,那么写,就完事了吗?还要自己码代码不成?

如果公司里,这些底层的干活的就是你自己,你难道说,你不适合这个岗位?

 

        废话不多,先来看看驱动的问题!开关一个LED,都是驱动。驱动就是借助软件,驱使硬件工作。软件,也叫固件,最终转化为机器识别的东西。芯片内部好比是一座城市。

 

开始与硬件打交道!!

 

一、开关驱动:

假设有如下的图:

基于rt-thread功耗调优与PM管理实战经验分享-驱动篇

 

分析如下:

(1)LR1 红色 LED电源 +5V_B直接控制,电源电压在,LED LR1红灯就会亮。开关控制,需要控制+5V_B电源的开关。

(2)LG1 LY1 绿色与黄色LED,使用PNP三极管控制,则可以通过MCU 的GPIO 引脚控制。控制逻辑为:

RXD3   TXD3 为高电平时(3.3V),LED 绿色与黄色不亮(PNP三极管不导通)

RXD3   TXD3 为低电平时(3.3V),LED 绿色与黄色亮起来(PNP三极管导通)

(3)总结,只有导通的回路,才会产生电流。

通过上述的实例,说明:不是电源(电压)存在,就有电流产生,电流产生需要有电流回路,且回路导通。

(4)功耗深入分析1:是不是PNP三级管不导通时,电流就为0?No,需要看手册,或许还有极低(nA级)漏电流!!管子用多了,也会累计电流来。

(5)功耗深入分析2:控制端的电压,若为1.8V,能否控制PNP管子开关?答:根据PNP三极管的特性,低电压,可以让PNP导通。1.8V,PNP管子无法完全关闭,所以,硬件设计时,需要注意MCU供电电压与外设电压的匹配。防止电流往MCU端内灌!!

 

二、外部上拉电阻:

 

基于rt-thread功耗调优与PM管理实战经验分享-驱动篇

 

分析:I2C总线,总线空闲时是否会有漏电流?

(1)I2C总线,一般会把SCL SDA (MCU端),配置成OD(开漏输出)方式。这样,外部必须接上拉电阻,保证电平的切换。

(2)OD输出,I2C默认总线空闲时为高(MCU端高阻态),高电平为外部上拉电阻拉起来的。因为MCU是OD高阻态,所以,I2C总线空闲时,基本上漏电很小(nA级)。

(3)异常分析:如果异常出现,SCL SDA,出现持续的低电平?所以,也可以在不使用总线时,把I2C 总线的两个引脚配置为float 输入或analog 模拟态。

(4)I2C 总线控制完了,I2C外设呢?当然,也不能一直供电,所以硬件设计时,需要有引脚控制 I2C外设的电源,关闭I2C芯片的电源,整个I2C设备,就可以完全管理好功耗了。

(5)总结:SPI UART CAN  等,都是MCU 引脚与 外部器件连接的,控制方式,都可以划分为:电源部分与引脚部分。

 

三、硬件设计BUG案例分析

什么是经验,经历过,体验过,总结过,如此而已!

 

基于rt-thread功耗调优与PM管理实战经验分享-驱动篇

 

(1)上图中,LED的作用,本来是指示继电器的开关的,但是:设计错误,造成LED常亮!!

(2)这样软件控制继电器的开关,并不能控制LED的关闭,造成持续的漏电!!

 

 

 

基于rt-thread功耗调优与PM管理实战经验分享-驱动篇

 

(1)上图分析:修复了软件不能控制的LED指示灯。只有在继电器开关导通时,LED才会亮。

(2)控制功耗,就可以通过控制继电器的开关(引脚RY1),即可

MCU 端: RY1  高电平,继电器工作

MUC端: RY1低电平,继电器不导通,LED关闭,不会产生漏电?(三极管关闭时,nA级漏电流)

 

四、GPIO 输入功耗分析:

 

【ADC 采样】

 

温湿度、电池电压、甚至某些器件的参考电压、ID,都通过 单片机 AD采样的方式获取。

如下图:

 

基于rt-thread功耗调优与PM管理实战经验分享-驱动篇

 

分析:

(1)ADC1 会接到MCU 端的 AD采样,AD采样引脚默认配置为模拟输入(INPUT),漏电很小!!

(2)MCU ADC一般会有内部的时钟与处理模块,当AD不采样后,最好关闭内部的AD控制器。

(3)如图AD采样是电阻分压式,想要彻底的关闭AD,还要控制电源(例图上没有控制,会产生持续的漏电流)。

(4)分析,AD硬件上,需要提供采样电源的控制,保证采样回路可以断开(如果是VBAT常电 ad采样?采样用的分压电阻,可以适当改大!!。)

 

【按键】

基于rt-thread功耗调优与PM管理实战经验分享-驱动篇

 

分析

(1)一般按键,直接接到MCU引脚,外部有上拉电阻,MCU内部就不要在配置上下拉(尤其是下拉,会有漏电)

(2)一般按键会配置成中端,注意中端的触发方式(上拉,一般是下降沿触发,上拉,一般是上升沿触发)

(3)想实现按键的按下与弹起,其实外部上拉电阻不需要,MCU内部配置好上拉电阻(最好不要配置内部下拉!)

 

 

五、MCU 部分

MCU电源控制,一般分为常电,自杀式断电两种方式。

自杀式断电,硬件需要有关断自己电源的开关。

常电:为了让MCU(满频)降低功耗,一般采用:

(1)降频工作

(2)间歇性工作(运行+睡眠)

 

分析:

(1)降频工作后,需要考虑其他外设的时钟的变化

(2)运行+睡眠,如何切换模式?需要了解MCU本身的工作模式、电源模式。

(3)睡眠时,不只是要处理MCU,还要看外设的电源状态。

 

以下为寻找STM32L4 的电源模式:

 

(1)首先下载STM32L4 系列的参数手册(数据手册datasheet 参考手册 reference )

(2)通过标签,找到:Power Control 章节,理论上,芯片用多了,要多看看官方的手册与文档。

 

 

基于rt-thread功耗调优与PM管理实战经验分享-驱动篇

 

 

 

基于rt-thread功耗调优与PM管理实战经验分享-驱动篇

 

 

 

基于rt-thread功耗调优与PM管理实战经验分享-驱动篇

 

有了这些,大概清楚了模式的切换,模式的进入与退出的条件。

找到芯片官方提供的HAL库(标准库等),看一下各个模式的进入函数,可以开始设计模式切换了。

 

目前STM32L4系列,

(1)None  不改变模式,满频

(2)LPSleep(LPrun),芯片内部使用LP的调压器(类似芯片内部的LDO,如外部供电1.8V,内核电压1.2V)。

(3)STOP(Stop0/1/2),关闭的不同,建议超低功耗使用STOP2.

(4)Standby(shutdown),几个uA的差别,建议系统需要假关机时实现。特殊的唤醒方式(wakeup引脚,rtc alarm等),唤醒后重启!!

 

六、其他特殊的外设电源功耗控制

我印象较深的是PSRAM(类似于MCU扩展的外部RAM),作用是扩大RAM用。是一个独立的芯片,如果使用PSRAM时,说明你的运行的程序较复杂,有一些数据、GUI等保存在外部RAM里,内部的RAM不够大。

(1)睡眠时,PSRAM下电,优势是漏电流极低,缺点是:初始化+数据的丢失,恢复起来类似于重启!!

(2)PSRAM不下电,低功耗运行。正常PSARM空闲时,PSRAM本身功耗并不高,几十微安左右。但我实际真正测量下来,发现有上百微安的电流。

(3)原来与MCU 引脚连接,MCU会产生漏电。如MCU配置的内部上下拉电阻等。这部分,还不能完全配置成0或1,需要根据PSRAM手册,保证PSRAM数据正常、下次访问没问题的情况下,配置与PSRAM相关的引脚(细心!!)。

 

NFC (卡模拟,可以用于门禁、公交等)

项目上,可能需要系统关机(睡眠),都要能刷卡,所以,NFC是常供电。这部分的MCU引脚也要处理,睡眠时,NFC可以产生中断,关机后,就只供电。

 

调NFC功耗的重点是:让官方提供NFC 超低功耗的固件!!

 

好了,先总结这些,后面继续补充,包括该格式与错别字!!