最近正在做一个可以进行数据传输的模块。其中用到的主MCU是STM32F103系列芯片,用到的通信芯片为SIM800C(GPRS)和SIM7020C(NB-iot)。目前已经初步实现了数据传输的功能,然后在此基础上,我又加入了低功耗模式,来进行数据传输,这样大大降低了耗能。本文主要讲一下如何利用低功耗模式进行数据传输。

我们通过查询数据手册可以发现,低功耗总共有三种模式,如下图所示:

throttlestop 调节功耗 降功耗模式_SIM800c


三种模式分别为睡眠模式,停机模式,待机模式。这三种模式功耗从高到低依次为:睡眠模式>停机模式>待机模式。于是我在这里选择了使能MCU待机作为低功耗数据传输的模式。

下面我们主要看一下待机模式的进入和唤醒。其中进入待机模式很简单,库函数版本有相应的函数语句:PWR_EnterSTANDBYMode();而待机模式的唤醒可以设置四种唤醒源,我用的是RTC闹钟事件。

在编写代码的时候,我觉得我遇到最大的问题就是什么时候进入待机模式以及怎么设置RTC闹钟事件。

对于什么时候进入待机模式,一开始我把进入待机模式的函数一直放在main函数里面,这样根本行不通。于是我决定在通信模块传输完数据之后让主MCU进入待机模式,这个办法是行得通的;怎么设置闹钟事件?我们首先要了解闹钟中断是怎么工作的,只有当RTC计数器的值=闹钟中断的值时,才会发生闹钟中断。而这个闹钟中断的值是需要我们自己去设置的。还需注意一点,一般情况下,发生闹钟中断是要进入闹钟中断函数的,但是在主MCU待机模式下,此时发生闹钟中断,唤醒MCU的同时,程序也会复位,从头执行,并不会进入闹钟中断函数。

我们通过配置闹钟中断的值,可以让通信模块周期(比如相隔半个小时、一个小时、两个小时)发送数据,也可以在每个时间整点(比如6:00,7:00…)发送数据。这样我们这个数据传输模块就可以应用于水表、电表、温度测量表上面了,无需手动操作,模块会自动按照设置好的时间将采集到的数据发送到远端的服务器界面。

进行数据传输的时候唤醒主MCU,数据传输完毕后让MCU进入待机模式。大大降低了功耗,目前已经可以初步实现低功耗传输数据。

贴一张我的测试截图:

throttlestop 调节功耗 降功耗模式_数据传输_02


这张测试截图是什么意思呢?解释一下。我闹钟中断的时间设置的为整点发送。绿色字体RTC Time:2019-5-24 10:0:55,代表这个时刻上一次数据传输结束,MCU进入待机模式。绿色字体RTC Time:2019-5-24 11:0:1,代表唤醒了MCU,开始进行这一次的数据传输。

throttlestop 调节功耗 降功耗模式_SIM800c_03


这是远端服务器接收到我采集的时间的数据。我们最终要采集的肯定不会是这种数据,而是温度值,水表读数,电表读数这些。

然而我的BOSS希望我做的是:把这个模块固定到到海龟的龟壳上,然后根据海龟游弋的轨迹,采集到海龟的运动轨迹,以此来获得洋流的规律。想法是个好想法,但是能不能实现呢?还要继续努力。