嵌入式芯片中的 低功耗模式 内容细讲
电源域与运行级别概述
电源域(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)简介


① 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,也可悬空(节省硬件资源)。
缩写 | 全称 | 功能说明 |
---|---|---|
POR | Power-On Reset | 当 上电时 VDD 未达到安全电压阈值(VPOR),芯片保持复位 |
PDR | Power-Down Reset | 当 运行中 VDD 掉到低于阈值(VPDR),芯片会重新复位 |

可由软件配置一个阈值(2.0V~3.6V),当 VDD 低于该阈值时触发中断或事件。
属于预警机制,不会自动复位 MCU,而是交由软件做处理。
在电压下降趋势时,提前保存数据、停止敏感外设。
搭配 Flash 写保护,防止写入不稳定区域。
可与低功耗模式配合,当 VDD 恢复后唤醒。
内部会将 VDD 与通过 PWR_CR
中 PLS[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)
{// 电压低了!赶紧保存数据或关外设
}

模式 | 功耗 | 保留内容 | 唤醒时间 | 唤醒源 |
---|---|---|---|---|
运行模式 | 高 | 全部 | 无需 | 不需要 |
睡眠模式 | 较低 | 所有 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();