上周完成了一个小项目,项目涉及到stm32的低功耗的待机模式,特在此记录下32的待机模式。

    芯片:STM32f030F4

    库:HAL库

    唤醒方式:用RTC和PA0的上升沿唤醒

先来看下低功耗模式下的情况(只看停止跟待机):

停止模式

停止模式在保留SRAM和寄存器内容的同时实现了非常低的功耗。

1.8V域中的所有时钟停止,PLL、HSI RC和禁用HSE晶体振荡器。电压调节器也可以安装在正常或低功率模式。

该设备可以被任何一条exti线路从停止模式唤醒。

exti行源可以是16个外部行和rtc之一。

待机模式

待机模式用于实现最低功耗。内部关闭电压调节器,使整个1.8V域断电。

这个PLL、HSI RC和HSE晶体振荡器也关闭。

进入后待机模式、SRAM和寄存器内容丢失,但RTC域和备用电路中的寄存器除外。

当外部复位(NRST管脚)、IWDG复位时,设备退出待机模式。

Wkup管脚上的上升沿,或发生RTC事件。

 

可以看出待机模式跟停止模式差不多,其实功耗上停机配置的好的话也就比待机高一些,不过停止模式的唤醒方式的选择可以更自由,寄存器的数据也可以保存,所以我感觉停机模式更适合大多产品的需求,但是今天我只对待机模式的一些注意事项进行提出。

待机模式的进入很方便,只需要调用一句HAL_PWR_EnterSTANDBYMode()就可以进入待机模式了,待机模式唤醒就相当于复位,它之前的数据会全部丢失,所以要注意自己程序运行的时候,如有某些状态量一定要保存,那就保存进flash,唤醒的时候就去读取它。待机模式下所有IO口会处于高阻态,但不是说高阻态就是最省电的,跟电路设计还有一定的联系,当你进入待机发现电流跟手册上相差挺大的时候考虑下我的解决方法。

解决方法:其实这里可以考虑下把不使用的I/O口在休眠前都设置为模拟输入。原因:

ESP32C3 保持连接 低功耗 esp32低功耗模式_ESP32C3 保持连接 低功耗

额外的I/O电流消耗是由于I/O配置为输入,如果中间电压水平由外部施加。

这种电流消耗是由输入施密特引起的。

用于区分输入值的触发电路。除非此特定配置

根据应用程序的要求,可以通过配置这些I/O处于模拟模式。这是典型的ADC输入引脚的情况,应该是配置为模拟输入。

ESP32C3 保持连接 低功耗 esp32低功耗模式_ESP32C3 保持连接 低功耗_02

条件:典型和最大电流消耗

在以下条件下放置MCU:

•所有I/O引脚都处于模拟输入模式

•所有外围设备均被禁用,除非明确提及。

所以:官方其实也是在这个模式下测出的数据,实验证明,确实设置为模拟输入,电流跟手册上描写的差不多。

(也别忘了 __HAL_RCC_PWR_CLK_ENABLE();使能PWR时钟,这个能降功耗,唤醒之后要清除唤醒标志位)

 

如果功耗还是跟手册有区别,就要考虑供电电压,温度的影响。其实也可以通过供电电压的降低来降低功耗,STM32f030F4手册没有电压的对比,这里放下STM32F103C8的对比图:

ESP32C3 保持连接 低功耗 esp32低功耗模式_STM32_03

 

ESP32C3 保持连接 低功耗 esp32低功耗模式_STM32_04

要想让stm32进入更低功耗的状态,还需要考虑唤醒方式的种类和个数,比如在待机模式下,看门狗,RTC都是用内部40kHz的时钟,还有PA0外部中断的唤醒,如果全部模式都打开的话,功耗也会上升,所以要根据自己项目来设定唤醒模式,唤醒方式少一点,功耗就能低一点,总的来说就是这么些注意事项。

 

还有在使用RTC唤醒的时候要注意一下,如果你是cubeMx创建的工程每次唤醒RTC都是会重新初始化从0开始的计时的,这可能对一些人是好事,对一些人就不是那么好了,这个网上有很多解决方法,这里说一下闹钟的配置:

ESP32C3 保持连接 低功耗 esp32低功耗模式_STM32_05

这里是要1小时唤醒一次,下面的配置就要设置上,要用到的设置为DISABLE,没用到的设置为ENABLE。

使用内部时钟的RTC时钟40KHz往往是不准的,所以你们可以自己去调节参数,让它秒中断跑的更精准。

ESP32C3 保持连接 低功耗 esp32低功耗模式_待机模式_06

大概就是这样了,低功耗待机模式总结下:

1、使能PWR时钟 __HAL_RCC_PWR_CLK_ENABLE();

2、配置I/O口为模拟输入

3、再进入待机模式