参考资料

3.1 RTC + Stop Mode[5]
进低功耗前的配置:
- 如果有独立看门狗,需要在上电初始化时,通过修改FLASH寄存器的相关位,使看门狗在进入stop模式后停止计数,就不会引起看门狗复位了
- 对应的外设SPI,调用对应外设的对应DeInit函数,要注意的是17版的库,SPI的DeInit函数有BUG,需要按照我另一篇文章(STM32L4退出低功耗后SPI读写出错)进行修改,不然低功耗唤醒后,SPI读写会异常调用函数:
- 外设ADC,需要关闭,不然会增加功耗,
- usart 关闭调用函数:
- 定时器,可以关闭也可以不关闭,不受影响 调用函数: HAL_TIM_Base_Stop_IT(&htim2);
- 设置唤醒管脚和RTC唤醒时钟
- 调用进入低功耗的函数,进低功耗
出低功耗后的配置:
- 恢复时钟配置(若是用的MSI时钟可以不进行配置)
注意:与睡眠模式不一样,系统从停止模式被唤醒时,是使用 HSI 作为系统时钟的,在 STM32F407 中,HSI 时钟一般为 16MHz,与我们常用的 168MHz 相关太远,它会影响各种外设的工作频率。所以在系统从停止模式唤醒后,若希望各种外设恢复正常的工作状态,就要恢复停止模式前使用的系统时钟。
- GPIO初始化
- 配置外设SPI,USART,ADC,定时器,并开启中断
- 关闭 RTC 周期唤醒(防止在程序正常运行时,进入RTC周期唤醒中断)
3.2 uart 中断 + stop mode
外部中断也可以用来唤醒MCU,需要提供一个下降沿用以把MCU从低功耗中唤醒
以直接使用串口的RX作为外部中断引脚唤醒,使用串口3的RX也即是PB11引脚。
需要先配置IO口为外部中断模式:

在进入低功耗模式之前一定要先配置,这样才能够正常唤醒。
3.3 调试模式
1. 打印信息
- 进入低功耗调试模式
- 全速运行, 可以看到debug连接没有断掉, 此时进入了低功耗函数
- 可以通过调试窗口的stop来验证, 可以看到一直停在下面WFI里
- stop之后再单步或者全速运行, 就会从WFI跳出继续向下运行。 所以执行_WFI()函数时, 必须是全速执行, 不可以单步执行。
调试模式时独立看门狗问题
__HAL_DBGMCU_FREEZE_IWDG() 冻结看门狗,此时在调试模式下看门狗就不会复位
__HAL_DBGMCU_UNFREEZE_IWDG()恢复看门狗
总结
设计低功耗主要从以下几方面着手:
1、用户需要根据最低电源消耗、最快速启动时间和可用的唤醒源等条件,选定一个最佳的低功耗模式。可以使用的低功耗方式有休眠模式,待机模式,停机模式。
2、选择了低功耗方式后就是关闭可以关闭的外设时钟。
3、降低系统主频。
4、注意I/O的状态。
如果此 IO 口带上拉,请设置为高电平输出或者高阻态输入;
如果此 IO 口带下拉,请设置为低电平输出或者高阻态输入;
5、注意 IO 和 外设IC 的链接。
6、测低功耗的时候,一定不要连接调试器,更不能边调试边测电流。
7、只能保证单片机在休眠期间的功耗,至于电路板上的其他IC、电阻、电容的功耗不是单片机程序能控制的,所以首先要在电路板上实现一个单片机最小系统来做测试。具体就是电路板只贴单片机及其最小依赖的外围元器件,把程序灌入单片机,观察单片机的休眠功耗。
功耗主要来自这几个地方:
- HSE / LSE 的外部晶振功耗肯定比相对应的HSI / MSI / LSI要高
- 尽量关闭PLL,这个东西消耗电流达到了200uA
- 运行主频是很耗电的,够用就好,尽量使用HSE 4M的方式,实际中我使用8M进行分频的
- HCLK也很耗电,对其分频可以节省电能
- 电压也与功耗 有关,虽然关系不大,也是可见的关系,3.3V比1.8V的电压,功耗还是大了很多
- 外部功耗大硬件电路可以设计MOS管进行开关控制,用到时打开,休眠考虑关闭
- 启动方式可能会影响功耗?目前时从Flash中启动,从SRAM启动应该功耗会低一点。目前没做测试,有待更新
FAQs
1. 无法烧录系统
注意:当系统处于睡眠模式低功耗状态时(包括后面讲解的停止模式及待机模式),使用DAP下载器是无法给芯片下载程序的,所以下载程序时要先把系统唤醒。或者使用如下方法:按着板子的复位按键,使系统处于复位状态,然后点击电脑端的下载按钮下载程序,这时再释放复位按键,就能正常给板子下载程序了。
2. 滴答定时器启动和停止
有报道是滴答定时器会将单片机从停止模式唤醒,可以使用暂停滴答时钟避免。