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

嵌入式芯片中的 低功耗模式 内容细讲

电源域与运行级别概述

电源域(Power Domain)

核心域(Core Domain):包括 CPU 核心和关键架构模块(如 NVIC、CPU 内核寄存器)。

外设域(Peripheral Domain):各类外设时钟和寄存器。

SRAM/Flash 域:程序存储与数据存储,部分模式下可保留或断电。

供应电压调节器(Regulator):主 LDO 或 BUCK,用于内核和外设不同电压需求。

运行级别(Run Level)

Run:所有时钟开启,最高性能,最高功耗。

Low‑Power Run(部分系列支持):降低核心电压或限制最大时钟以节省功耗。

Sleep:关闭 CPU 时钟,仅保留总线与外设时钟。

Stop:关闭主振荡器和部分总线时钟,保留低速时钟或 LSE/LSE,核心停止,SRAM 保持。

Standby:关闭大部分电源域,仅保留极少唤醒源,SRAM 和寄存器一般不保留。

Shutdown(部分高端系列):几乎全域断电,仅保留最少唤醒逻辑。

电源控制(PWR)简介

电源系统: V DDA 供电区域、 V DD 供电区域、 1.8V 供电区域、后备供电区域。
电源监控: POR/PDR 监控器、 PVD 监控器。
电源管理:低功耗模式。

VDDA 供电区域(ADC/模拟供电)

特点:

VDDA/VSSA 是模拟电源/地,为 ADC、DAC、比较器等模拟模块供电

VREF+ 为 ADC 提供参考电压(通常连接 VDDA 或外部高精度参考)。

必须和 VDD 同时供电,否则 ADC/DAC 模块可能无法正常工作。

VDD / 1.8V 数字供电区域(调节器核心)

构成与功能:

VDD/VSS:主供电,给 GPIO、外设 I/O、内部调节器供电。

调节器 LDO / SMPS 输出约 1.8V,供内核、RAM、数字外设。

STM32 内部大多数电路工作在 1.8V 电压域,外部用 VDD(通常是 3.3V)做接口。

调节器模式:

模式功能说明场景
主模式(Run)提供稳定的 1.8V 输出MCU 正常运行时
低功耗模式(Stop)降低调节器驱动能力、减小电流MCU 睡眠/停止模式
关闭(Standby)停止供电,仅备份域保留MCU 进入待机模式,最省电状态

VBAT 后备域(RTC 备份供电)

功能:

主电源(VDD)掉电时,VBAT 为 RTC、备份寄存器、LSE 晶振等继续供电。

支持连接电池或超级电容,维持系统时间与部分状态数据不丢失。

使用建议:

RTC 需搭配 LSE 低速晶振 或 LSI 低速 RC。

VBAT 区域可存储:

RTC 时间

RTC 闹钟

BKP 寄存器(备份寄存器)

部分支持 TAMP(篡改检测器)

不需要 RTC 的应用,可将 VBAT 直接接 VDD,也可悬空(节省硬件资源)。

电源监控
缩写全称功能说明
PORPower-On Reset上电时 VDD 未达到安全电压阈值(VPOR),芯片保持复位
PDRPower-Down Reset运行中 VDD 掉到低于阈值(VPDR),芯片会重新复位
上电时,当 V DD 低于指定 V POR 阈值时,系统无需外部复位电路便会保持复位模式。一旦
V DD 电源电压高于 V POR 阈值,系统便会退出复位状态,芯片正常工作。掉电时,当 V DD 低于指定 V PDR 阈值时,系统就会保持复位模式。如图 28.1.2.1 所示, RESET 为上电复位信号。
注意:POR PDR 的复位电压阈值是固定的,VPOR 阈值(典型值)为 1.92VVPDR 阈值
(典型值)为 1.88V
可编程电压检测器(PVD) Programmable Voltage Detector

可由软件配置一个阈值(2.0V~3.6V),当 VDD 低于该阈值时触发中断或事件。
属于预警机制,不会自动复位 MCU,而是交由软件做处理。

比如:

在电压下降趋势时,提前保存数据、停止敏感外设。
搭配 Flash 写保护,防止写入不稳定区域。
可与低功耗模式配合,当 VDD 恢复后唤醒。

它可以实时监视 V DD 的电压,方法是将 V DD 与 PWR,控制寄存器(PWR_CR)中的 PLS[2:0]位所选的 VPVD 阈值进行比较。其中 PWR_CSR 寄存器中的 PVDO 位决定了 VDD 是高于 VPVD 还是低于 VPVD,本实验中配置的是 VDD 低于 VPVD 阈值这个条件。当检测到电压低于 VPVD 阈值时,如果使能 EXTI16 线中断,即使能 PVD 中断,可以产生 PVD 中断,具体取决于 EXTI16 线配置为检测上升还是下降沿,然后在复位前,在中断服务程序中执行紧急关闭系统等任务。PVD 阀值检测波形。

内部会将 VDD 与通过 PWR_CRPLS[2:0] 选择的一个可编程电压阈值进行比较。

比较结果会反馈到 PWR_CSR 中的 PVDO 标志位:

PVDO=1:表示 VDD < VPVD(电压太低)

PVDO=0:表示 VDD ≥ VPVD

如果你启用了 EXTI16中断线 并配置为上升/下降沿触发,就能在电压跨越阈值时产生中断

HAL_PWR_EnablePVD(); // 启用PVD
//设置阈值和中断模式
PWR_PVDTypeDef sConfigPVD;
sConfigPVD.PVDLevel = PWR_PVDLEVEL_4; // 阈值约为2.5V(不同MCU有差异)
sConfigPVD.Mode = PWR_PVD_MODE_IT_RISING_FALLING;
HAL_PWR_ConfigPVD(&sConfigPVD);
//启用中断:
HAL_NVIC_SetPriority(PVD_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(PVD_IRQn);
//编写中断回调函数:
void HAL_PWR_PVDCallback(void)
{// 电压低了!赶紧保存数据或关外设
}
PVD 阀值有 8 个等级,有上升沿和下降沿的区别,具体由 PWR_CSR 寄存器中的 PVDO
决定。
其次就是电源管理的部分我们要关注低功耗模式,在 STM32 的正常工作中,具有四种工作模式,运行、睡眠、停止以及待机。在上电复位后,STM32 处于运行状态时,当内核不需要继续运行,
就可以选择进入后面的三种模式降低功耗。这三种低功耗模式电源消耗不同、唤醒时间不同和
唤醒源不同,我们要根据自身的需要选择合适的低功耗模式。
模式功耗保留内容唤醒时间唤醒源
运行模式全部无需不需要
睡眠模式较低所有 SRAM 和外设快速所有中断(外设中断)
停止模式更低SRAM、寄存器较慢RTC、外部中断、唤醒引脚
待机模式极低(uA)只保留后备域/RTC最慢唤醒引脚、RTC 唤醒、中断(有限)

1. 运行模式(Run Mode)

正常工作状态,CPU、外设、时钟等全开。

功耗最大,但响应速度最快。

上电复位后默认进入此模式。

2. 睡眠模式(Sleep Mode)

特点:CPU 停止工作,外设继续运行。

功耗优化点:

时钟系统基本保持不变。

所有外设继续运行(如 UART、ADC 等)。

SRAM 和寄存器内容全部保留。

进入方式(两种):

模式条件行为
立即睡眠SLEEPDEEP = 0 + 执行 WFI/WFE立即睡眠,等待中断/事件唤醒
退出时睡眠SLEEPONEXIT = 1 + 中断服务中执行 WFI中断返回立即睡眠
SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk;    // 确保不是 deep sleep
__WFI();                               // 执行睡眠

3. 停止模式(Stop Mode)

特点:内核和大部分外设停止,只保留 SRAM、寄存器和 RTC。

功耗优化点:

所有主频时钟停止(HSE/HSI/LSE/LSI)。

电压调节器切换为低功耗模式。

SRAM 数据仍保留。

唤醒时间比睡眠略慢,但功耗显著降低。

唤醒源:

EXTI 外部中断(如 GPIO)、RTC、USART(带唤醒功能)

SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk:启用深度睡眠。

PWR->CR

PDDS = 0:进入停止模式(不是待机)

LPDS = 1:低功耗调压器模式

CWUF = 1:清除 Wakeup Flag

PWR->CR &= ~PWR_CR_PDDS;   // 设置为停止模式
PWR->CR |= PWR_CR_CWUF;    // 清除 Wakeup 标志
PWR->CR |= PWR_CR_LPDS;    // 可选:启用低功耗调压器
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
__WFI();  // 或 __WFE();

4. 待机模式(Standby Mode)

特点:最低功耗,只保留后备域与 RTC,几乎断电状态。

功耗优化点:

SRAM/寄存器内容全部丢失。

唤醒后会重新复位(类似上电启动)。

通常由 VBAT 保持 RTC 运行。

唤醒源:

唤醒引脚(WKUP)、RTC 闹钟、外部中断。

SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk

PWR->CR |= PWR_CR_PDDS

PWR->CR |= PWR_CR_CWUF

PWR->CR |= PWR_CR_CWUF;     // 清除 Wakeup 标志
PWR->CR |= PWR_CR_PDDS;     // 设置进入待机模式
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
__WFI(); // 或 __WFE();

相关文章:

  • CTF--秋名山车神
  • LeetCode 2563.统计公平数对的数目:排序 + 二分查找
  • QML中的3D功能--纹理应用
  • 致远OA——自定义开发rest接口
  • OSPF综合实验(HCIP)
  • 09-DevOps-Jenkins实现CI持续集成
  • Java集合框架中的List、Map、Set详解
  • 【unity】Vulkan模式下部分Android机型使用VideoPlayer组件播放视频异常问题
  • 超简单的git学习教程
  • 又来聊一下加班的问题
  • jenkins尾随命令
  • Stable Diffusion秋叶整合包V4独立版Python本地API连接指南
  • 【AI提示词】IT专家顾问
  • 【Docker-14】容器操作案例
  • Java Web 之 互联网协议 100问
  • 向量陷阱:关键词、长度与相关性如何误导Embedding模型?
  • Spring中的AOP基础理解
  • 【网络篇】TCP vs UDP底层区别+网络编程概念
  • 数据结构排序算法全解析:从基础原理到实战应用
  • MySQL游标的定义和应用
  • 再现逆转!蒯曼击败伊藤美诚晋级澳门世界杯女单决赛
  • 平安银行一季度净赚超140亿元降5.6%,营收降13.1%
  • 全国首个医工交叉“MD+PhD”双博士培养项目在沪启动
  • 在全社会营造浓郁书香氛围,上海市全民阅读工作会议召开
  • 马上评丨婚介服务是“甜蜜的事业”,不容乱象滋生
  • 李强主持国务院第十三次专题学习