EC616系列模组OpenCPU低功耗

前言

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

模组低功耗分解图
不同模式下Ram/IO状态

      OpenCPU开发中,需要先了解几个通用概念,然后在实现模组不同模式下休眠。

模组挂起状态

       每个task必须osDelay();函数,这个函数不仅仅相当于延时,同时有挂起任务的功能。系统(程序)有多个任务的时候,A任务必须挂起,才能执行B任务,依次调用内核资源运行代码。同时在部分系统休眠模式下,也可以通过挂起当前任务执行休眠操作。

task挂起,系统相互交错执行其他任务

等待队列事件

        模组在休眠期间等待外设唤醒,此时可以通过队列等待逻辑完成相关操作,队列等待函数为: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中任务,打印信息确认是否模组进入休眠。

系统初始化
sleep1休眠设置
task挂起等待队列唤醒

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

Sleep1模式下softTimer唤醒10S/次

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(低功耗定时器)

HIB模式初始化
HIB模式下运行不同task

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

HIB模式参数配置
xQueueReceive等待时模组就会进入不同的休眠状态
周期进入RTC,模组都是从main()入口执行程序

      至此,简单的模组HIB模式休眠、唤醒流程已经完成。如果用户使用多个task,在每个task唤醒后可以加禁止休眠、允许休眠命令(投票),保证每个功能模块执行完成后系统在进入休眠。


参考文档《Lierda NB81&MB26 OpenCPU 低功耗应用笔记》,《NB-IoT OpenCPU介绍——移芯平台OpenCPU实验--刘宝刚》

你可能感兴趣的:(EC616系列模组OpenCPU低功耗)