前言
模组低功耗分为PMU和Modem,前者相当于MCU低功耗由程序控制,后者射频部分主要由网络决定(卡APN等)。


OpenCPU开发中,需要先了解几个通用概念,然后在实现模组不同模式下休眠。
模组挂起状态
每个task必须加osDelay();函数,这个函数不仅仅相当于延时,同时有挂起任务的功能。系统(程序)有多个任务的时候,A任务必须挂起,才能执行B任务,依次调用内核资源运行代码。同时在部分系统休眠模式下,也可以通过挂起当前任务执行休眠操作。

等待队列事件
模组在休眠期间等待外设唤醒,此时可以通过队列等待逻辑完成相关操作,队列等待函数为:xQueueReceive(queueSleep, (void *)&queueValue, WAIT_FOREVER); 该函数功能类似于MCU里面的WFI()或者LPM(); 程序会一直挂起在该位置直到唤醒源唤醒模组,然后执行下面的程序。
投票机制
投票机制是为了防止个别进程操作的过程中系统突然休眠。未调用投票机制——大家共同挂起即休眠;调用投票机制——走投票休眠逻辑。
一、休眠介绍
不同模式下休眠逻辑参考文档《Lierda NB81&MB26 OpenCPU 低功耗应用笔记》,用户也可以参考官方示例lierdaEC_DEMO_lowpower.c测试不同模式下设备功耗。
二、SLEEP1
2.1 程序运行
Sleep1模式下RAM是不掉电的,设备的所有信息不丢失。程序从Sleep1唤醒之后,可以从当前休眠位置继续执行后面的程序。这里使用FreeRTOS的softTimer定时唤醒模组,执行task中任务,打印信息确认是否模组进入休眠。



需要注意所有回调函数中不能进行串口打印,否则系统异常or无法进入低功耗。实际设备运行效果

2.2 平台注销
Sleep1模式下,如果用户已经注册了平台,需要注销平台才能进入Sleep1模式,因为模组底层有task任务轮训10mS/次,如果模组注册到平台该任务持续执行,功耗无法降到20uA。
如果用户没有注册到平台,该任务轮训不影响sleep功耗。
当前task逻辑属于移芯底层逻辑,暂不支持修改。
三、HIB模式
HIB模式下RAM和外设都已掉电,模块从HIB模式唤醒之后会从程序的main()入口处重新执行程序。1)如果用户其他功能已经做了部分处理,HIB唤醒之后想要从中间过程继续执行,可以通过睡眠前后记录Flash状态做自己的逻辑判断。2)HIB模式下外设是掉电的,所以如果用到了模组的基本外设则需要重新初始化。3)HIB模式下NB如果已经注册平台,相应的信息会记录到NB对应存储区,HIB唤醒后不需要对NB重新初始化驻网、注册,直接发送数据即可。4)HIB模式唤醒源只支持Wakeup引脚和sleepRTC(低功耗定时器)


我们以最简单的RTC周期唤醒为示例,这里只创建1个RTC(睡眠定时器),周期唤醒模组执行应用程序。



至此,简单的模组HIB模式休眠、唤醒流程已经完成。如果用户使用多个task,在每个task唤醒后可以加禁止休眠、允许休眠命令(投票),保证每个功能模块执行完成后系统在进入休眠。
参考文档《Lierda NB81&MB26 OpenCPU 低功耗应用笔记》,《NB-IoT OpenCPU介绍——移芯平台OpenCPU实验--刘宝刚》