低功耗模式
我使用低功耗模式(Low-power mode)是Stop 2 mode。在这个模式下消耗的电流是最低的,我是实测8μA

进入低功耗前的准备

首先,并不是使用了hal库的HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI) 这个函数就可以达到这么低的功耗。那应该准备什么呢?
第一
把所有开启的外设先失能,再把引脚设为模拟输入或者浮空输入,(注:如果是引脚接的是led灯,也可以设置为输出),最后关闭外设时钟。例如我使用了SPI

__HAL_SPI_DISABLE(hspi);
 __HAL_RCC_SPI1_CLK_DISABLE();
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);

来自于HAL_SPI_DeInit()

第二
把所有未使用的I/O设为模拟输入,官方也是这样处理的。

第三

根据L4参考手册P149

android 设置项开启Doze低功耗模式 进入低功耗模式_低功耗


失能PVD、PVM以及VREFBUF。但我只关闭了PVD,VREFBUF。第四

关闭或者挂起SysTick定时器。根据L4参考手册P150

android 设置项开启Doze低功耗模式 进入低功耗模式_上拉电阻_02


所有中悬挂断标志都要清除,挂起或者关闭SysTick定时器就不会产生中断标志。第五

当退出低功耗时,要重设时钟,但我们可以通过STOPWUCK 来设置,就不用再次设置系统时钟了,但使用外设要重新初始化,RTC和看门狗就不用了。根据L4参考手册P188

android 设置项开启Doze低功耗模式 进入低功耗模式_低功耗_03


注:使用MSI的话,在低功耗模式下时钟频率要小于等于4MHz。

第六
如果还不能进入的话,就要去检查原理图了,是否有其他消耗电流的地方。我这恰恰遇到了一个,一个gpio引脚用来提供传感器电源,外面却带有一个上拉电阻,不管我设置成什么模式必定会消耗电流。当我去掉这上拉电阻,进入低功耗时,电流从400μA降到了8μA.

进入低功耗

前面都准备好了,接下来就简单了。

__HAL_RCC_PWR_CLK_ENABLE();	//运行电源管理时钟
HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);    	//进入stop 2 mode

判断是否进入低功耗看是否程序停了下来。
判断是否达到低功耗的标准测功耗是否符合该模式下的功耗。
并不是进入了低功耗就代表达到了低功耗的标准。