系统功耗管理---PSM模式

PSM 模式

什么是PSM 模式

PSM模式是一种比休眠模式功耗更低的低功耗模式,其硬件原理就是模组关机+RTC闹钟唤醒。与关机+RTC闹钟唤醒相比,PSM模式有以下两点不同:

  1. RTC闹钟的唤醒时间由网络下发。

  2. 进入PSM模式时,模组虽然关机,但核心网仍然保留其注网信息。因此PSM唤醒时无需重新进行网络附着,联网速度更快,且功耗更低。

PSM模式是在UE空闲一定时间后关闭信号的收发,以及AS层相关功能,这相当于部分关闭,降低了天线、射频、信令处理等功耗。

PSM模式的优点是可以长时间睡眠,但缺点是无法及时应对终端接收(移动终端、MT)服务。主要应用在远程抄表和一些对实时性要求不高的场景中。

PSM 模式原理

PSM是一种比常规休眠功耗功耗更低的模式,但其运行需要网络侧支持。

启用PSM时,需要先向基站发送请求(通过ATTACH或TA_UPDATER携带定时器信息)。基站若支持进入PSM,则会在对应的REQUEST中下发定时器信息,需要注意的是,实际PSM的参数会使用基站下发的值,并不一定和我们请求的值相同。

模组会以基站下发的值来配置定时器时间,当模组进入IDLE且ACT定时器超时,模组会关闭CPU和一切射频,此时相当于部分关机,只是保留了比关机更多的唤醒源,一般包括ACT、TAU定时器和PSM_INT。功耗一般下降到微安级别。此时由于基站已经记录UE使用PSM,不会断开此UE的连接,下次如果在同一小区内重新开机,就无需拨号,直接用原有的IP等信息,进一步减少了功耗。

当PSM TAU定时器超时、RTC_alarm到期或PSM_INT等唤醒源被触发时,模组会被唤醒。由于硬件上CPU(包括SRAM)和PA均被下电,此时并不能恢复休眠前运行状态,而是要重新走开机流程。开机后可进行网络业务,网络业务完成且RRC被释放后ACT定时器编开始计时,超时便进入PSM中。

整体流程如下:

最终,在两个定时器的作用下,模组会进行周期性的休眠,唤醒切换,但只有在唤醒的时候,才能进行网络业务,休眠时是无法响应网络寻呼的。

耗流特征如下(本示例每1min唤醒一次):

ACT和TAU定时器

ACT,又称T3324,当模组完成网络业务(即RRC连接释放时)开始计时,超时后立即进入PSM。

TAU,又称T3412,当模组完成网络业务(即RRC连接释放时)开始计时,超时后,若模组在PSM模式,会将模组唤醒。

它们的时序关系如下图:

模组收到基站下发的PSM时间后,会立即启动一个RTC闹钟和一个Timer。RTC闹钟是PSM模式的唤醒源,超时时间就是T3412的值,也就是说,经过T3412时间后,模组会被RTC唤醒,进入下一个周期。Timer的超时时间是T3324,只有其超时后模组才可能进入PSM模式,即RTC闹钟将模组唤醒后,模组会保持运行的时间为T3324。

由此可见,要想模组能正常进入PSM,T3324必须小于T3412,否则便会出现RTC闹钟已经超时,模组仍无法进入PSM模式的情况。

PSM &RTC 模式下的功耗以及各平台支持情况

PSM 唤醒源

PSM_INT

PSM_INT是唤醒PSM的引脚,此引脚一般都引出自PMIC。PSM_INT的功能是固化的,不需要额外的配置,进入PSM休眠后按照指定方式触发即可唤醒模组。

但对于ECx00E系列模组,没有专门的PSM_INT,而是由wakeup引脚实现此功能,wakeup引脚需要在休眠前进行配置。

RTC 闹钟

RTC闹钟能将模块从PSM模式下唤醒。其使用方法与模块关机时RTC闹钟的使用方法相同。

参见:RTC相关API说明

Powerkey

Powerkey也能唤醒PSM模式,作用原理和触发开机一致。

TAU Timer

上文描述过,TAU定时器超时会唤醒模组。

注意:BG95 的TAU Timer 和RTC alarm复用了同一个PMIC唤醒源,因此PSM和RTC不能同时使用

PSM 典型应用

PSM功耗虽低,但有以下缺点:

  1. PSM启动时需要走重启逻辑,应用恢复时间远远长于autosleep;

  2. 产生小区切换时,无法拿到原有的网络信息,导致出现掉网和重新注网问题,反而会使耗流上升;

  3. PSM休眠时不响应寻呼

所以PSM的应用场景一般满足以下三个条件:

  1. 定时任务间隔较长,可忽略启动时间

  2. 较少进行移动,不会频繁切换小区

  3. 对数据实时性要求不高

示例代码:

import utime
import pm
from machine import RTC
from misc import Power
import checkNet

def Business_code_example(run_time):
    i = 0
    for i in range(run_time):
        print("Business app running")
    	#Business code here  
        utime.sleep(1)
    return

def psm_try_set():
    if pm.get_psm_time()[0] == 1:#开机时获取psm是否设置,如果已经使能,则无需再次进行设置
        print("PSM has been enable, set pass")
        return 0
    else:
        return pm.set_psm_time(0,1,0,1)#T3412=10min T3324=1min

def psm_failed_handle(delay_time):
    utime.sleep(delay_time)#等待指定时长后,若模组仍未进入PSM模式,才会往下运行。此处执行PSM失败的处理逻辑,即代之以关机+RTC关机闹钟
    rtc = RTC()
    tm_rtc_tuple = rtc.datetime()
    tm_rtc_second = utime.mktime((tm_rtc_tuple[0], tm_rtc_tuple[1], tm_rtc_tuple[2],tm_rtc_tuple[4], tm_rtc_tuple[5], tm_rtc_tuple[6], 0, 0))

    alarm_second = tm_rtc_second + 600#RTC闹钟设为当前时间 + 10min
    alarm_tuple = utime.localtime(alarm_second)

    rtc.set_alarm([alarm_tuple[0], alarm_tuple[1], alarm_tuple[2], alarm_tuple[6], alarm_tuple[3], alarm_tuple[4], alarm_tuple[5], 0])
    rtc.enable_alarm(1)
 
    Power.powerDown()

if __name__ == '__main__':
    psm_failed_delay_time = 60 + 30 #PSM的 T3324超时30S后,启用错误处理逻辑
    lpm_fd = pm.create_wakelock("psm_lock", len("psm_lock")) #申请功耗锁

    stage, state = checkNet.waitNetworkReady(30)
    if stage == 3 and state == 1:
        print('Network connection successful.')
        psm_try_set() #网络连接成功时尝试设置PSM,如果PSM设置已经生效,则不用再次设置
    else:
        print('Network connection failed.')
        psm_failed_delay_time = 1 #PSM依赖网络,无网络时应立即使用RTC代替之

    pm.wakelock_lock(lpm_fd)#锁定功耗锁,防止业务运行过程中出现sleep时错误进入PSM模式
    Business_code_example(10)#业务代码运行
    
    pm.wakelock_unlock(lpm_fd)#业务运行完成后,释放功耗锁。模组空闲状态且T3324超时后,自动进入PSM
    psm_failed_handle(psm_failed_delay_time)#运行错误处理,若模组能正常进入PSM,在sleep中就进入PSM了,该处实际的处理逻辑并不会运行

点此在github中下载完整代码

如何进入PSM

需要在联网,且确认运营商支持PSM的前提下使用。根据业务需求决定ACT和TAU的周期,通过API设置即可:

参见:PSM相关API说明

PSM_INT 应用

EC600U和BG95支持此引脚,上升沿触发,进入PSM时模组PMIC会默认配置此引脚,确保触发方式正确即可在PSM模式下唤醒模组。

ECX00E系列模组使用wakeup引脚,需要额外进行配置

弱信号PSM 方案

弱信号下PSM实际并不能保证生效,因为和基站的东西实际上未必能够正常建立,更罔论请求与下发TAU和ATC定时器是否正常。
此时我们可以主动在业务中的解决,同行方案是:设定一个最大尝试联网的时间,若超过这个时间且网络仍未能正常连接,转而使用关机+RTC alarm来实现方案。

不支持PSM 的运营商的方案

如果运营商不支持PSM,基站会设法阻碍模组进入PSM。常见的行为有三种:

  1. 在模组向基站请求定时器时,直接REJECT请求(此情况很少,绝大部分为后两种)。

  2. 下发不成对的ACT和TAU定时器,不成对的定时器无法使模组进入PSM。

  3. 不下发定时器

此时,只能通过RTC闹钟定时唤醒关机来实现类似的业务需求,这种方式也能达到在无需数据交互时减少耗流。但从关机状态重新开机相比PSM多了一个注网和拨号的动作,在每次唤醒注网时都会产生更多射频功耗。

此外,ECX00E系列模组在不支持PSM时需要通过pm.forcehib()方法强制进入hibernate休眠,因为此平台关机时RTC无法维持运行。

常见问题排查

PSM设置返回True,但无法进入

基站可能不支持PSM,确认这一点的方法是从CPlog中查看基站下发的信息,需要查看的条目为:

ATTACH_REQUEST

ATTACH_ACCEPT

TA_UPDATE_REQUEST

TA_UPDATE_ACCEPT

如图,模组设置成功后,REQUEST一定会带有成对的定时器信息,我们需要关注ACCEPT中基站是否正确下发了定时器信息。

如图,网络环境不支持PSM,基站未下发成对的定时器,只下发了一个ACT定时器,这时候是不能进入PSM的:

PSM成功进入,但休眠-唤醒周期与设置的不同

同样的,查看以上CPlog条目,基站下发的定时器周期可能不等于设置的值,且模组最终以基站下发的值为准。

常见应用场景

对讲机低功耗方案

RRC快速释放:对讲机的网络业务是不固定的,随机触发的。快速释放RRC能够保证在任何一个随机时间点,都能在对讲后快速释放RRC,从而进入休眠。

tracker 低功耗方案

RRC快速释放:tracker是一个定位器,位置是不固定的,定期进行一次定位。可使用RRC快速释放减少RRC连接保持的时长,从而降低整体耗流。

表计、门磁低功耗方案

PSM,此类产品的唤醒间隔较长,且一般不会经常移动,对数据的实时性要求不高,可采用PSM。若需要在无网络或运营商不支持的情况下使用,可采用关机+RTC闹钟定时唤醒的方案。

根据功耗需求选型

uA级耗流:必须选择支持PSM或关机RTC唤醒的型号

mA级耗流:全平台支持autosleep,根据其它需求评估适合型号

待机时间推算方法

  1. 首先确定电池选型,得到电池容量。

  2. 确定模组选型,根据规格书和实际业务计算平均待机电流。如果需要准确的待机电流,应保持整机按照业务流程运行,然后使用功耗仪测试出平均待机电流。

  3. 从待机时间的计算公式:待机时间 = 电池容量/ 平均待机电流

例如:已知电池容量800mah,给ECX00E系列模组供电。ECX00E系列模组在autosleep模式下保持网络连接(LTE-FDD@64)时平均待机电流约0.64mA。则实际待机时间T=800mah/0.64mA=1250h。