该文档是本人做一个睡眠+RTC唤醒的低功耗项目总结心得,如有出入请指出。
STM32L提供5种低功耗模式:低功耗运行模式、睡眠模式、低功耗睡眠模式、停止模式、待机模式。
待机模式电流最低,但是待机模式时MCU处于不受控制的状态,所有的IO都工作在高阻抗的状态下,只有几个专用的引脚能够将mcu唤醒,而且每次唤醒相当于系统复位,RAM中的数据全部丢失,在有外部器件连接的情况下,器件引脚可能会吸收大量的电流,反而达不到低功耗要求。所以最好别用待机模式。
待机模式时MCU有一些缺点,就选择了停止模式。停止模式的功耗仅次于待机模式。在STOP模式下,PLL、HSI、HSE都被停止,RAM和寄存器的值保留。
网上有些开发经验说,外部器件能用IO口供电的就尽量用IO口供电,在stop模式下,CPU的IO口的状态是保持的,这样外围器件的供电开关很容易控制。像外部存储芯片可以用IO口供电。有些外围芯片不适合用IO口供电的,像有些射频芯片,因为这些射频芯片上电启动要相当长的时间。(此经验未验证)
如果MCU外围有器件连接,且没有用IO供电,一定要将CPU与器件相连的IO口设置成适当的模式,否则这些引脚可能会吸收很大的电流。ST公司给的例程中建议设置成模拟输入,但是我MCU的IO口都设置成模拟输入功耗达不到理想要求。经过多次实验,总结为没有用到的IO口设置为模拟输入,有用到MCU的IO口要根据外围器件在MCU处于停止状态时的电平。外围器件高时,MCU在进入停止状态时,就设置输出模式,电平为高,反之设置为低。所以产品说明书中应该要注明当模块设置为休眠状态时,各个引脚的电平,客户如果用产品做二次开发时,他们自己MCU跟产品对接的IO电平要一致。
RTC唤醒时,在RTC中断中要清除一下标志; 在官方网的例子RTC唤醒时,RTC中断函数中没有清除唤醒标志位。调试分析:刚开始用官方例子时调试待机模式+RTC定时唤醒时,第一次进入RTC时功耗为3.多uA,第二次进入RTC时就5.8uA左右,以后都是5.8左右uA。每次进入RTC的初始化时一样,所以当时就觉得可能是在第一次退出RTC时,哪里没有处理好,经过多次调试,清除了唤醒标志位后,功耗就降下来。