当前位置: 首页 > ai >正文

STM32低功耗模式

本文参考:STM32F10XXX参考手册,具体细节可自行去官网下载查看。

1. 为什么要使用低功耗模式?

  • 延长电池寿命(例如:传感器节点、可穿戴设备)
  • 降低系统发热量
  • 在非关键任务阶段减少能耗,提高整体能效

2. STM32F10x系统电源框图

STM32的工作电压(VDD)为2.0~3.6V。通过内置的电压调节器提供所需的1.8V电源
当主电源VDD掉电后,通过VBAT脚为实时时钟(RTC)和备份寄存器提供电源。

在这里插入图片描述

3. PWR电源控制寄存器简介

PWR(Power Control)电源控制负责管理STM32内部的电源供电部分,可以实现可编程电压监测器和低功耗模式的功能。
可编程电压监测器(PVD)可以监控VDD电源电压,当VDD下降到PVD阀值以下或上升到PVD阀值之上时,PVD会触发中断,用于执行紧急关闭任务。

在这里插入图片描述

电源控制/状态寄存器(PWR_CSR)中的PVDO标志用来表明VDD是高于还是低于PVD的电压阀值。该事件在内部连接到外部中断的第16线,如果该中断在外部中断寄存器中是使能的,该事件就会产生中断。

4. STM32 的低功耗模式分类

在系统或电源复位以后,微控制器处于运行状态。当CPU不需继续运行时,可以利用多种低功耗模式来节省功耗,例如等待某个外部事件时。用户需要根据最低电源消耗、最快速启动时间和可用的唤醒源等条件,选定一个最佳的低功耗模式。

STM32F10xxx有三种低功耗模式:
● 睡眠模式(Cortex™-M3内核停止,所有外设包括Cortex-M3核心的外设,如NVIC、系统时钟(SysTick)等仍在运行)
● 停止模式(所有的时钟都已停止)
● 待机模式(1.8V电源关闭)
在这里插入图片描述

此外,在运行模式下,可以通过以下方式中的一种降低功耗:
● 降低系统时钟
● 关闭APB和AHB总线上未被使用的外设时钟。
使用下面三种方式之前务必需要打开PWR的时钟。

__HAL_RCC_PWR_CLK_ENABLE();

4.1 睡眠模式

  1. 执行完WFI/WFE指令后,STM32进入睡眠模式,程序暂停运行,唤醒后程序从暂停的地方继续运行
  2. SLEEPONEXIT位决定STM32执行完WFI或WFE后,是立刻进入睡眠,还是等STM32从最低优先级的中断处理程序中退出时进入睡眠
  3. 在睡眠模式下,所有的I/O引脚都保持它们在运行模式时的状态
  4. WFI指令进入睡眠模式,可被任意一个NVIC响应的中断唤醒
  5. WFE指令进入睡眠模式,可被唤醒事件唤醒
/*** @brief Enters Sleep mode.* @note  In Sleep mode, all I/O pins keep the same state as in Run mode.* @param Regulator: Regulator state as no effect in SLEEP mode -  allows to support portability from legacy software* @param SLEEPEntry: Specifies if SLEEP mode is entered with WFI or WFE instruction.*           When WFI entry is used, tick interrupt have to be disabled if not desired as *           the interrupt wake up source.*           This parameter can be one of the following values:*            @arg PWR_SLEEPENTRY_WFI: enter SLEEP mode with WFI instruction*            @arg PWR_SLEEPENTRY_WFE: enter SLEEP mode with WFE instruction* @retval None*/
void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry)

其中在该接口上,Regulator并没有使用,SLEEPEntry可以选择WFI(等待中断)或者WFE(等待事件)两种模式,一般使用配置WFI即可。

4.2 停止模式

  1. 执行完WFI/WFE指令后,STM32进入停止模式,程序暂停运行,唤醒后程序从暂停的地方继续运行
  2. 1.8V供电区域的所有时钟都被停止,PLL、HSI和HSE被禁止,SRAM和寄存器内容被保留下来
  3. 在停止模式下,所有的I/O引脚都保持它们在运行模式时的状态
  4. 当一个中断或唤醒事件导致退出停止模式时,HSI被选为系统时钟
  5. 当电压调节器处于低功耗模式下,系统从停止模式退出时,会有一段额外的启动延时
  6. WFI指令进入停止模式,可被任意一个EXTI中断唤醒
  7. WFE指令进入停止模式,可被任意一个EXTI事件唤醒
/*** @brief Enters Stop mode. * @note  In Stop mode, all I/O pins keep the same state as in Run mode.* @note  When exiting Stop mode by using an interrupt or a wakeup event,*        HSI RC oscillator is selected as system clock.* @note  When the voltage regulator operates in low power mode, an additional*         startup delay is incurred when waking up from Stop mode. *         By keeping the internal regulator ON during Stop mode, the consumption*         is higher although the startup time is reduced.    * @param Regulator: Specifies the regulator state in Stop mode.*          This parameter can be one of the following values:*            @arg PWR_MAINREGULATOR_ON: Stop mode with regulator ON*            @arg PWR_LOWPOWERREGULATOR_ON: Stop mode with low power regulator ON* @param STOPEntry: Specifies if Stop mode in entered with WFI or WFE instruction.*          This parameter can be one of the following values:*            @arg PWR_STOPENTRY_WFI: Enter Stop mode with WFI instruction*            @arg PWR_STOPENTRY_WFE: Enter Stop mode with WFE instruction   * @retval None*/
void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry)//example
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFI);

停止模式可以选择电压调节器开启或者是低功耗,使用过程没有什么差别,两种方式差别主要是低功耗消耗能量更少,并且同样有WFI和WFE两种模式。

当一个中断或唤醒事件导致退出停止模式时,HSI被选为系统时钟,因此当退出停止模式的时候,需要在唤醒的中断或者事件回调函数中重新初始化系统主频,否则会导致系统工作异常。

4.3 待机模式

  1. 执行完WFI/WFE指令后,STM32进入待机模式,唤醒后程序从头开始运行
  2. 整个1.8V供电区域被断电,PLL、HSI和HSE也被断电,SRAM和寄存器内容丢失,只有备份的寄存器和待机电路维持供电
  3. 在待机模式下,所有的I/O引脚变为高阻态(浮空输入)
  4. WKUP引脚的上升沿、RTC闹钟事件的上升沿、NRST引脚上外部复位、IWDG复位退出待机模式
/*** @brief Enters Standby mode.* @note  In Standby mode, all I/O pins are high impedance except for:*          - Reset pad (still available) *          - TAMPER pin if configured for tamper or calibration out.*          - WKUP pin (PA0) if enabled.* @retval None*/
void HAL_PWR_EnterSTANDBYMode(void)

直接调用该接口即可进行待机模式,待机模式只有四种事件能够将其唤醒,如上一句话所说,因此需要配置所需的唤醒方式。

实际测试采用WKUP上升沿以及RTC闹钟事件两种方式。

  1. WKUP上升沿
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);

该接口会模式配置WKUP引脚为输入下拉模式,当获取到上升沿即会自动唤醒MCU。
2. RTC闹钟模式

HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN);

使用该模式需要对RTC进行初始化以及配置RTC_Alarm中断事件,使能NVIC等操作,RTC_Alarm事件是挂在EXTI线中断上的。

  • ! 注意使用待机模式,由于1.8V供电区域会断电,SRAM和寄存器内容会丢失,因此MCU会重新复位,不会继续向下运行,实测发现需要在程序开头手动清除唤醒和Standby标志,接口如下,否则下一次调用HAL_PWR_EnterSTANDBYMode程序就直接复位重启了,不会进入休眠。
  __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); // 清除唤醒标志__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB); // 清除 Standby 标志

猜测可能是PWR寄存器不在1.8V供电区域内,而在VDD供电区域,因此1.8V掉电不影响PWR寄存器,需要手动进行清除,否则会影响下一次进入/退出低功耗。

http://www.xdnf.cn/news/18605.html

相关文章:

  • kafka基本思路即概念
  • 大数据管理与应用系列丛书《数据挖掘》读书笔记之集成学习(1)
  • 胸部X光片数据集:健康及肺炎2类,14k+图像
  • 牛市阶段投资指南
  • ROS 与 Ubuntu 版本对应关系
  • ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘192.168.24.96‘ (10060)
  • 【嵌入式】【搜集】状态机、状态迁移图及状态模式材料
  • VSCode远程开发实战:SSH连接服务器详解(附仙宫云平台示例)
  • Ubuntu24.04环境下causal_conv1d和mamba_ssm安装
  • 深度剖析Spring AI源码(七):化繁为简,Spring Boot自动配置的实现之秘
  • Linux应急响应一般思路(一)
  • 设计模式:建造者模式
  • 【ansible】5.在受管主机部署文件和Jinja2模板
  • 嵌入式八股文面试题总结(QT、RTOS、Linux、ARM、C/C++)(持续更新)
  • 在Excel和WPS表格中打印时加上行号和列标
  • 【Unity开发】Unity核心学习(二)
  • 超级助理:百度智能云发布的AI助理应用
  • 2025年渗透测试面试题总结-30(题目+回答)
  • 【从零开始学习Redis】如何设计一个秒杀业务
  • Java全栈工程师面试实录:从基础到微服务的深度探索
  • 埃氏筛|树dfs|差分计数
  • UE5.5 C++ 增强输入 快速上手
  • 恶劣天气下漏检率↓79%!陌讯多模态时序融合算法在道路事故识别的实战优化
  • 淘宝API实战应用:数据驱动商品信息实时监控与增长策略
  • DBeaver连接SQL Server时添加驱动后仍提示找不到驱动的解决方法
  • 51c自动驾驶~合集18
  • 学习记录(二十一)-Overleaf中图片文字间隔太大怎么办
  • java学习 + 一个向前端传流顺序不一致的一个解决思路
  • ubuntu中的nginx.conf和windows中的nginx.conf内容对比
  • 从栈到堆:深入理解C语言静态与动态链表的创建与管理