- 模块休眠有两种概念:
2 | 没有进入飞行模式的休眠,下文称之为“浅休眠” |
- 深休眠:
代码中调用misc.setflymode(true)进入深休眠, 调用misc.setflymode(false)退出深休眠。 深休眠状态下,会关闭语音和数据业务的协议栈,所以不能收发短信, 不能通话,不能上网进行数据传输,可以正常操作GPIO, 可以正常操作定时器。深休眠状态下的单模块功耗为1mAh, 如果还有GPS,UART等外设在运行,功耗另算。
- 浅休眠:
一般情况下,用户是不需要写代码去控制进入或者退出浅休眠状态, 系统自动控制进入和退出浅休眠 浅休眠状态下,不会关闭语音和数据业务的协议栈, 所以可以收发短信,可以通话,可以上网进行数据传输,可以正常操作GPIO,可以正常操作定时器 进入浅休眠状态后,收发短信时,会自动退出浅休眠,收发短信结束后,会立即自动进入浅休眠。 进入浅休眠状态后,通话时,会自动退出浅休眠,通话结束后,会立即自动进入浅休眠。 进入浅休眠状态后,数据传输时,会自动退出浅休眠,数据传输结束后,会立即自动进入浅休眠。 浅休眠状态下的单模块功耗为3.3mAh,如果还有GPS,UART等外设在运行,功耗另算。
进入浅休眠状态后,UART无法正常工作,必须先退出浅休眠,UART才能正常收发数据
脚本中有pm.wake和pm.sleep接口,这两个接口是控制浅休眠的,在什么情况下使用这两个接口呢,举例说明:
第一种场景:
UART接了外设,如果项目对功耗没有要求,可以直接写一行代码pm.wake("myuartwake"),这样软件永远不会进入浅休眠,UART可以一直正常收发数据如果项目要求低功耗,除了uart接外设之外,还要有一个gpio中断,接在外设上:
2. | 模块检测到gpio中断后,调用代码pm.wake("myuartwake"),如果此时模块处于浅休眠状态,则会退出浅休眠;然后再uart.setup |
3. | uart就可以调用uart.read和uart.write正常收发数据 |
4. | 在uart不需要工作时,模块软件调用代码uart.close,然后再调用pm.sleep("myuartwake"),就可以进入浅休眠 |
- 第二种场景:
只有单模块功能,没有UART、SPI、I2C等外设,例如:只用到了通话, 短信,gprs数据传输,模块内部集成的gps功能,这种情况下pm.wake 和pm.sleep接口是没有任何意义的,因为软件中的所有功能都是自动去控制 进入和退出浅休眠,并不会因为代码中执行pm.sleep而降低系统功耗,但 是可能会因为代码中执行pm.wake而增加功耗,这种情况下如果想降低功耗, 只能在软件逻辑上进行处理,例如降低gprs数据传输频率,减少gps 开启时间等。