低功耗模式
我使用低功耗模式(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
失能PVD、PVM以及VREFBUF。但我只关闭了PVD,VREFBUF。第四
关闭或者挂起SysTick定时器。根据L4参考手册P150
所有中悬挂断标志都要清除,挂起或者关闭SysTick定时器就不会产生中断标志。第五
当退出低功耗时,要重设时钟,但我们可以通过STOPWUCK 来设置,就不用再次设置系统时钟了,但使用外设要重新初始化,RTC和看门狗就不用了。根据L4参考手册P188
注:使用MSI的话,在低功耗模式下时钟频率要小于等于4MHz。
第六
如果还不能进入的话,就要去检查原理图了,是否有其他消耗电流的地方。我这恰恰遇到了一个,一个gpio引脚用来提供传感器电源,外面却带有一个上拉电阻,不管我设置成什么模式必定会消耗电流。当我去掉这上拉电阻,进入低功耗时,电流从400μA降到了8μA.
进入低功耗
前面都准备好了,接下来就简单了。
__HAL_RCC_PWR_CLK_ENABLE(); //运行电源管理时钟
HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI); //进入stop 2 mode
判断是否进入低功耗看是否程序停了下来。
判断是否达到低功耗的标准测功耗是否符合该模式下的功耗。
并不是进入了低功耗就代表达到了低功耗的标准。