Lazy loaded image
🌉 开发框架搭建
二、函数接口说明
Words 3833Read Time 10 min
2024-10-23
2025-4-21
type
date
slug
category
icon
password
 
本节介绍STM32F4和STM32L4系列低功耗进入、唤醒、调试相关接口,并分析常见使用问题。

参考资料

  1. Description of STM32L4/L4+ HAL and low-layer drivers - User manual
  1. [野火]STM32 HAL库开发实战指南——基于野火F4系列开发板 — [野火]STM32 HAL库开发实战指南——基于野火F4系列开发板 文档 第 41 章 电源管理—实现低功耗
  1. STM32F1低功耗总结(休眠模式,待机模式,停机模式) (安富莱电子)
  1. STM32低功耗待机模式+ WKUP引脚的上升沿来唤醒
  1. STM32独立看门狗IWDG和休眠(低功耗)共存那些事儿

2.1 低功耗进入接口

2.1.1 休眠模式(sleep mode)入口函数

对于STM32F4系列

  • 第一个参数指定sleep mode 下,调压器状态为主调压器还是低功耗调压器。
    • 第二个参数指定进入sleep mode 指令类型,是PWR_SLEEPENTRY_WFI: WFI 指令进入睡眠模,还是PWR_SLEEPENTRY_WFE: WFE 指令进入睡眠模式。
      ⚠️
      注意事项
      1. 休眠模式下,所有I/O引脚保持运行模式状态
      1. 进行休眠模式前,systick停止,以防systick中断唤醒休眠模式(需用户主动操作)
      1. STM32F4系列不使用用Regulator 参数,只支持PWR_MAINREGULATOR_ON,这里接口保留,是为了和低功耗芯片STM32L系列保持一致。

      对于STM32L4系列

      第一个参数 regulator 表示采用哪一种 sleep 模式, sleep 和 low-power sleep mode。
      第二个参数 SLEEPEntry 表示的是我们采用哪一种 SleepEntry 模式,PWR_SLEEPENTRY_WFI 和PWR_SLEEPENTRY_WFE。
      ⚠️
      注意事项在函数接口注释部分,主要有如下几点
      1. 进入低功耗休眠模式(Low-power Sleep Mode)需要从低功耗运行模式进入。若调用前未进入Low-power运行,用户需配置 Flash 为掉电模式(设置 FLASH_ACR 寄存器中的 SLEEP_PD 位 HAL_FLASHEx_EnableRunPowerDown()),时钟降低到 2MHz 以下,再进入低功耗休眠模式。
      1. 从低功耗休眠模式(Low-power Sleep Mode)退出,进入的是Low-power运行模式,若要进入运行模式,可以执行 HAL_PWREx_DisableLowPowerRunMode() API。
      1. 休眠模式下,所有I/O引脚保持运行模式状态。
      1. 休眠模式下,systick 停止,以防 systick 中断唤醒休眠模式。
      notion image

      2.1.2 停止模式(stop mode)入口函数

      对于STM32F4系列

      参数配置选项和说明参考 Sleep Mode。
      ⚠️
      1. 停止模式下,所有I/O引脚保持运行模式状态。
      1. 退出停止模式,系统时钟选择的是HSI RC。
      1. 调压器选择主调压器还是低功耗调压器不同,会影响唤醒时间和功耗。低功耗调压器意味着唤醒时间延长。
      1. 为了进一步降低功耗,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系列

      ⚠️
      注意事项
      1. 通过 HAL_PWREx_EnableSRAM2ContentRetention()保存SRAM2数据,此时低功耗调压器打开。见下图红框内容。
      1. I/O状态可配置为三种状态(状态设置灵活,降低板载外设功耗)
        1. 模拟状态,关闭数字电路以降低功耗和数字噪声
        2. 上拉 HAL_PWREx_EnableGPIOPullUp()
        3. 下拉HAL_PWREx_EnableGPIOPullDown()
        4. 为了保证进入待机模式,I/O配置生效,需使能配置 HAL_PWREx_EnablePullUpPullDownConfig()
      notion image
      notion image
      待机模式详细说明参考上一篇2.2.3小节。

      2.1.4 其他函数接口

      对于STM32F4系列

      • OverDrive模式允许微控制器在更高的时钟频率下运行,核心电压会略微提高,以支持更高的运行频率。适用于需要更高计算能力的应用,如复杂的信号处理、图像处理或其他需要高吞吐量的任务。

      对于STM32L4系列

      1. 使能/失能备份域访问(RTC寄存器、RTC备份数据寄存器)
        1. ⚠️
          RTCSEL(RTC时钟源选择)或LSEON位(开启或关闭LSE)的操作之前,必须禁用备份域的保护。
      1. 使能/失能唤醒引脚
          • 设置默认的极性,即在高电平(上升沿)检测时唤醒 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_PINxPWR_WAKEUP_PINx_HIGH 等价
          • 如果你想启用唤醒引脚1,并且在引脚电平从低变高时唤醒MCU,你可以使用默认值PWR_WAKEUP_PIN1或显式指定PWR_WAKEUP_PIN1_HIGH
          • 如果你想启用唤醒引脚2,并且在引脚电平从高变低时唤醒MCU,你应该使用PWR_WAKEUP_PIN2_LOW
      1. 设置异常模式返回线程模式进入休眠(from Handler mode to Thread mode)
        1. 设置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 复用功能唤醒标志安全清零顺序:
      1. 禁止 RTC 唤醒中断(RTC_CR 寄存器中的 WUTIE 位)
      1. 将 RTC 唤醒 (WUTF) 标志清零
      1. 将 PWR 唤醒 (WUF) 标志清零
      1. 使能 RTC 唤醒中断
      1. 重新进入低功耗模式

      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 提供时钟。
      notion image
      notion image
      notion image
      STM32L4和STM32F4系列接口一致
      • HAL_DBGMCU_EnableDBGStopMode,就可以在 Stop 模式下进行调试。
      • HAL_DBGMCU_EnableDBGSleepMode 在 Sleep 模式下进行调试
      • HAL_DBGMCU_EnableDBGStandbyMode 在待机模式下进行调试

      2.4 低功耗下使用看门狗

      1. 采用调试模式关闭内核的功能来关闭看门狗计数;
      1. 休眠时采用时钟唤醒来喂狗后继续休眠;
      1. 用基于系统时钟的窗口看门狗WWDG
       
      第一种方法对STM32L476无效;
      第二种方案太折腾了,影响RTC使用且费电;
      第三种方案喂狗间隔太短。
      上一篇
      模板设计模式:让你的代码结构更清晰
      下一篇
      Guide to Linux System

      Comments
      Loading...