type
date
slug
category
icon
password
参考资料2.1 低功耗进入接口2.1.1 休眠模式(sleep mode)入口函数对于STM32F4系列对于STM32L4系列2.1.2 停止模式(stop mode)入口函数对于STM32F4系列对于STM32L4系列2.1.3 待机模式(standy mode)入口函数对于STM32F4系列对于STM32L4系列2.1.4 其他函数接口对于STM32F4系列对于STM32L4系列2.2 低功耗唤醒接口2.2.1 RTC 唤醒2.2.2 外部中断唤醒2.3 进入调试模式2.4 低功耗下使用看门狗
本节介绍STM32F4和STM32L4系列低功耗进入、唤醒、调试相关接口,并分析常见使用问题。
参考资料
- [野火]STM32 HAL库开发实战指南——基于野火F4系列开发板 — [野火]STM32 HAL库开发实战指南——基于野火F4系列开发板 文档 第 41 章 电源管理—实现低功耗
- STM32F1低功耗总结(休眠模式,待机模式,停机模式) (安富莱电子)
2.1 低功耗进入接口
2.1.1 休眠模式(sleep mode)入口函数
对于STM32F4系列
- 第一个参数指定sleep mode 下,调压器状态为主调压器还是低功耗调压器。
- 第二个参数指定进入sleep mode 指令类型,是PWR_SLEEPENTRY_WFI: WFI 指令进入睡眠模,还是PWR_SLEEPENTRY_WFE: WFE 指令进入睡眠模式。
注意事项
- 休眠模式下,所有I/O引脚保持运行模式状态
- 进行休眠模式前,systick停止,以防systick中断唤醒休眠模式(需用户主动操作)
- STM32F4系列不使用用Regulator 参数,只支持PWR_MAINREGULATOR_ON,这里接口保留,是为了和低功耗芯片STM32L系列保持一致。
对于STM32L4系列
第一个参数 regulator 表示采用哪一种 sleep 模式, sleep 和 low-power sleep mode。
第二个参数 SLEEPEntry 表示的是我们采用哪一种 SleepEntry 模式,PWR_SLEEPENTRY_WFI 和PWR_SLEEPENTRY_WFE。
注意事项在函数接口注释部分,主要有如下几点
- 进入低功耗休眠模式(
Low-power Sleep Mode
)需要从低功耗运行模式进入。若调用前未进入Low-power运行,用户需配置 Flash 为掉电模式(设置FLASH_ACR
寄存器中的SLEEP_PD
位HAL_FLASHEx_EnableRunPowerDown()
),时钟降低到 2MHz 以下,再进入低功耗休眠模式。
- 从低功耗休眠模式(
Low-power Sleep Mode
)退出,进入的是Low-power运行模式,若要进入运行模式,可以执行HAL_PWREx_DisableLowPowerRunMode()
API。
- 休眠模式下,所有I/O引脚保持运行模式状态。
- 休眠模式下,systick 停止,以防 systick 中断唤醒休眠模式。

2.1.2 停止模式(stop mode)入口函数
对于STM32F4系列
参数配置选项和说明参考 Sleep Mode。
- 停止模式下,所有I/O引脚保持运行模式状态。
- 退出停止模式,系统时钟选择的是HSI RC。
- 调压器选择主调压器还是低功耗调压器不同,会影响唤醒时间和功耗。低功耗调压器意味着唤醒时间延长。
- 为了进一步降低功耗,Flash可通过
HAL_PWREx_EnableFlashPowerDown()
接口设置为掉电模式,从停止模式唤醒后,调用HAL_PWREx_DisableFlashPowerDown()
恢复。
对于STM32L4系列
L4系列PWR通用API提供如下接口,优点是方便移植。
- STOP0模式下,Regulator 设置为
PWR_MAINREGULATOR_ON
主调压器打开,STOP1模式下,调压器设置为PWR_LOWPOWERREGULATOR_ON
低功耗调压器打开。
- STOPEntry 指定唤醒方式为中断还是事件。
PWR拓展API中还提供了直接如下接口,无序配置调压器。
停止模式详细说明参考上一篇2.2.3小节。
2.1.3 待机模式(standy mode)入口函数
对于STM32F4系列
在待机模式下,微控制器的几乎所有I/O引脚都处于高阻态(高阻抗),这意味着它们不驱动任何输出,也不消耗电流。以下引脚在待机模式下不处于高阻态,具体取决于它们的配置:
- 复位引脚(Reset pad):
- 始终可用,用于复位微控制器。
- RTC_AF1引脚(PC13):
- 如果配置为篡改(tamper)、时间戳(time-stamp)、RTC报警输出(RTC Alarm out)或RTC时钟校准输出(RTC clock calibration out),则该引脚不处于高阻态。
- RTC_AF2引脚(PI8):
- 如果配置为篡改(tamper)或时间戳(time-stamp),则该引脚不处于高阻态。
- 唤醒引脚1(WKUP pin 1,PA0):
- 如果启用了唤醒功能,则该引脚不处于高阻态。
对于STM32L4系列
注意事项
- 通过 HAL_PWREx_EnableSRAM2ContentRetention()保存SRAM2数据,此时低功耗调压器打开。见下图红框内容。
- I/O状态可配置为三种状态(状态设置灵活,降低板载外设功耗)
- 模拟状态,关闭数字电路以降低功耗和数字噪声
- 上拉 HAL_PWREx_EnableGPIOPullUp()
- 下拉HAL_PWREx_EnableGPIOPullDown()
- 为了保证进入待机模式,I/O配置生效,需使能配置 HAL_PWREx_EnablePullUpPullDownConfig()


待机模式详细说明参考上一篇2.2.3小节。
2.1.4 其他函数接口
对于STM32F4系列
- OverDrive模式允许微控制器在更高的时钟频率下运行,核心电压会略微提高,以支持更高的运行频率。适用于需要更高计算能力的应用,如复杂的信号处理、图像处理或其他需要高吞吐量的任务。
对于STM32L4系列
- 使能/失能备份域访问(RTC寄存器、RTC备份数据寄存器)
RTCSEL(RTC时钟源选择)或LSEON位(开启或关闭LSE)的操作之前,必须禁用备份域的保护。
- 使能/失能唤醒引脚
- 设置默认的极性,即在高电平(上升沿)检测时唤醒
PWR_WAKEUP_PIN1
,PWR_WAKEUP_PIN2
,PWR_WAKEUP_PIN3
,PWR_WAKEUP_PIN4
,PWR_WAKEUP_PIN5
- 显示指定:指定启用的引脚和选择的极性
PWR_WAKEUP_PIN1_HIGH
或PWR_WAKEUP_PIN1_LOW
PWR_WAKEUP_PIN2_HIGH
或PWR_WAKEUP_PIN2_LOW
PWR_WAKEUP_PIN3_HIGH
或PWR_WAKEUP_PIN3_LOW
PWR_WAKEUP_PIN4_HIGH
或PWR_WAKEUP_PIN4_LOW
PWR_WAKEUP_PIN5_HIGH
或PWR_WAKEUP_PIN5_LOW
PWR_WAKEUP_PINx
和PWR_WAKEUP_PINx_HIGH
等价- 如果你想启用唤醒引脚1,并且在引脚电平从低变高时唤醒MCU,你可以使用默认值
PWR_WAKEUP_PIN1
或显式指定PWR_WAKEUP_PIN1_HIGH
。 - 如果你想启用唤醒引脚2,并且在引脚电平从高变低时唤醒MCU,你应该使用
PWR_WAKEUP_PIN2_LOW
。
- 设置异常模式返回线程模式进入休眠(from Handler mode to Thread mode)
设置SCR(System Control Register)寄存器中的SLEEPONEXIT位来控制处理器在中断处理结束后重新进入睡眠模式。设置这个位非常有用,特别是在处理器主要依赖中断来执行任务的情况下。
2.2 低功耗唤醒接口
MCU进入低功耗之后, 以极低的功耗维持着系统“活着”, 但是醒过来是需要一定条件的, 比如定个“闹钟”, 按键“按一下”等, 目前常用的“正常的”唤醒方式有以下几种:
1、 RTC 定时唤醒;
2、 外部中断唤醒(按键或者通讯唤醒) ;
3、 特殊唤醒引脚唤醒(某些引脚具有专门的唤醒功能) 。
下面, 我们再来看一看如何通过RTC和外部中断唤醒MCU。
2.2.1 RTC 唤醒
RTC 复用功能包括 RTC 闹钟(闹钟 A 和闹钟 B)、RTC 唤醒事件、RTC 入侵事件和 RTC 时间戳事件。这些 RTC 复用功能可将系统从停止和待机低功耗模式唤醒。
通过使用 RTC 闹钟或 RTC 唤醒事件,无需依赖外部中断即可将系统从低功耗模式唤醒(自动唤醒模式)。
RTC 提供了可编程时基,便于定期从停止或待机模式唤醒器件。
- 低功耗 32.768 kHz 外部晶振 (LSE OSC):此时钟源提供的时基非常精确,功耗也非常低(典型条件下功耗小于 1 μA)
- 低功耗内部 RC 振荡器 (LSI RC):此时钟源的优势在于可以节省 32.768 kHz 晶振的成本。此内部 RC 振荡器非常省电。
第一种方案可以使用RTC闹钟,实现按天唤醒,或按星期唤醒,当然RTC与Shutdown和Standy结合可以实现超低低功耗0.4uA左右,并加上这两种模式的唤醒复位的特性,也可实现周期唤醒,就是这样每唤醒一次都需要系统配置相应的RTC寄存器,时间长了可能对MCU有损坏。
第二种方案在就是使用wake计数器周期唤醒,搭配STOP模式,唤醒周期方便调节,精确度为S,电流达到1.4uA
RTC 复用功能唤醒标志安全清零顺序:
- 禁止 RTC 唤醒中断(RTC_CR 寄存器中的 WUTIE 位)
- 将 RTC 唤醒 (WUTF) 标志清零
- 将 PWR 唤醒 (WUF) 标志清零
- 使能 RTC 唤醒中断
- 重新进入低功耗模式
2.2.2 外部中断唤醒
唤醒中断事件配置
注意:有反馈使用HAL库 STM32CubeL4 V1.13.0 唤醒中断设置函数错误,参考stm32L476 rtc中断进不去的bug解决方法。
2.3 进入调试模式
参考1《STM32F407, 429参考手册(中文)》 p1259 - 33.16.1 对低功耗模式的调试支持
参考2 STM32L47xxx, STM32L48xxx, STM32L49xxx and STM32L4Axxx advanced Arm<Sup>®</Sup>-based 32-bit MCUs - Reference manual 48.16 MCU debug component (DBGMCU)。MCU调试特性STM32L4和STM32F4系列相似。
默认情况下,如果使用调试功能时应用程序将 MCU 置于停止模式或待机模式,调试连接将中断。这是因为 Cortex™-M4F 内核时钟停止了。不过,通过设置 DBGMCU_CR 寄存器中的一些配置位,即使 MCU 进入低功耗模式,仍可使用软件对其进行调试。
调试主机首先必须设置一些调试配置寄存器,以更改低功耗模式行为:
- 在睡眠模式下,调试主机必须事先将 DBGMCU_CR 寄存器的 DBG_SLEEP 位置 1。这样便可为 HCLK 和 FCLK 提供相同的时钟(之前配置的系统时钟)。
- 在停止模式下,调试主机必须事先将 DBG_STOP 位置 1。这样便可使能内部 RC 振荡器时钟,以在停止模式下为 FCLK 和 HCLK 提供时钟。



STM32L4和STM32F4系列接口一致
- HAL_DBGMCU_EnableDBGStopMode,就可以在 Stop 模式下进行调试。
- HAL_DBGMCU_EnableDBGSleepMode 在 Sleep 模式下进行调试
- HAL_DBGMCU_EnableDBGStandbyMode 在待机模式下进行调试
2.4 低功耗下使用看门狗
- 采用调试模式关闭内核的功能来关闭看门狗计数;
- 休眠时采用时钟唤醒来喂狗后继续休眠;
- 用基于系统时钟的窗口看门狗WWDG
第一种方法对STM32L476无效;
第二种方案太折腾了,影响RTC使用且费电;
第三种方案喂狗间隔太短。
- Author:felixfixit
- URL:http://www.felixmicrospace.top/13ab5fe6478243a08029eab29d30a951
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!