STM32标准库-待机模式

1.1 STM32待机模式简介

STM32单片机具有低功耗模式,包括睡眠、停止和待机三种。

运行状态下,HCLK为CPU提供时钟。HCLK由AHB预分频器分频后直接输出得到。

低功耗模式选择需考虑电源消耗、启动时间和唤醒源。

睡眠模式停CPU不停外设时钟;

停止模式停所有时钟;

待机模式关闭1.8V内核电源。留备份电路和待机电路供电。

  1. 睡眠模式
    • 进入:WFI/WFE
    • 唤醒:任一中断/事件
    • 时钟:CPU时钟关,其他不受影响
    • 电压调节器:开
  2. 停机模式
    • 进入:PDDS+LPDS+SLEEPDEEP+WFI/WFE
    • 唤醒:外部中断
    • 时钟:1.8V区域时钟关,HSI/HSE振荡器关
    • 电压调节器:无(关闭状态)
  3. 待机模式
    • 进入:PDDS+SLEEPDEEP+WFI/WFE
    • 唤醒:WKUP引脚、RTC警告、NRST复位、IWDG复位
    • 时钟:1.8V区域时钟关,HSI/HSE振荡器关
    • 电压调节器:关

低功耗模式下,电源控制寄存器PWR_CR可设置开/关
STM32 低功耗一览表

待机模式功耗最低,仅需约2uA电流;

停机模式次之,典型消耗约20uA;

睡眠模式功耗相对较高。

用户可根据需求选择适合的低功耗模式。
STM32待机模式是最低功耗模式,关闭电压调节器,1.8V供电区断电,PLL、HSI、HSE振荡器停止,SRAM和寄存器内容不保,仅备份寄存器和待机电路保持供电。
待机模式流程

可通过外部复位、独立看门狗复位、WKUP引脚上升沿或RTC闹钟事件退出待机。

唤醒后,除PWR_CSR外所有寄存器复位,执行流程与复位后相同。

PWR_CSR指示由待机状态退出。

待机时,仅复位、TAMPER(特定配置下)及使能的WK_UP引脚有效,其余IO引脚高阻。

进入待机模式涉及到电源控制寄存器(PWR_CR)和电源控制/状态寄存器(PWR_CSR)。

可通过设置电源控制寄存器PWR_CR的PDDS位,使CPU进入深度睡眠时进待机模式。

同时可通过 CWUF位,清除之前的唤醒位。
电源控制寄存器PWR_CR

1.2 待机模式配置

1)使能电源时钟:

cpp 复制代码
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

2)设置 WK_UP 引脚作为唤醒源:

cpp 复制代码
PWR_WakeUpPinCmd(ENABLE);

3)进入待机模式:

设置 SLEEPDEEP 位。

设置 PDDS 位。

执行 WFI 指令。

cpp 复制代码
void PWR_EnterSTANDBYMode(void) {  
    // 设置 SLEEPDEEP 位(SCB->SCR 的第 2 位)  
    SCB->SCR |= SCB_SCR_SLEEPDEEP;  
    // 设置 PDDS 位(进入深度睡眠时进入待机模式)  
    PWR->CR |= PWR_CR_PDDS;  
    // 执行 WFI 指令进入待机模式  
    __WFI();  
}

4)编写 WK_UP 中断函数:

实现开机与进入待机模式的逻辑。

长按 WK_UP 按键(PA0)开机,DS0 闪烁指示程序运行。

再次长按则进入待机模式,DS0 关闭。

cpp 复制代码
void EXTI0_IRQHandler(void) {  
    static uint32_t press_time = 0;  
    static uint8_t is_running = 0;  

    if (EXTI_GetITStatus(EXTI_Line0) != RESET) {  
        // 检测按键按下时间  
        if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0) {  
            press_time++;  
        } else {  
            if (press_time > 300) {  // 假设 3 秒为长按  
                if (is_running) {  
                    // 进入待机模式  
                    PWR_EnterSTANDBYMode();  
                } else {  
                    // 开机,DS0 闪烁指示程序运行  
                    is_running = 1;  
                    while (1) {  
                        GPIO_ToggleBits(GPIOD, GPIO_Pin_0);  
                        for (volatile int i = 0; i < 1000000; i++);  
                    }  
                }  
            }  
            press_time = 0;  
        }  
        EXTI_ClearITPendingBit(EXTI_Line0);  
    }  
}
相关推荐
AlanAshley24 分钟前
手机与电脑的屏幕计时器熄屏区别及协议栈
单片机·智能手机·电脑
AlanAshley1 小时前
电脑烧屏的软件与硬件原因全解析
单片机·嵌入式硬件·电脑
ScilogyHunter1 小时前
Hercules系列安全MCU功能安全原理详解
java·单片机·安全·hercules
szxinmai主板定制专家2 小时前
AMR 项目落地:机器人控制器硬件定制化需求复盘
arm开发·单片机·fpga开发·系统架构·机器人·am62x
笨笨饿2 小时前
#60_# 一、Photoshop 2025 如何批量导出 PSD 文件中的所有图层为独立 PNG 图片
stm32·单片机·嵌入式硬件·物联网·ui·51单片机·photoshop
碧海银沙音频科技研究院11 小时前
基于炬芯ATS308X 设计的上位机usb 串口音乐EQ调节工具
stm32·单片机·嵌入式硬件
三佛科技-1341638421214 小时前
过认证72W碳化硅方案(12V6A)主控HN1562+HN36228V 典型应用电路、变压器参数分享
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
Zwawa15 小时前
串口为什么会丢字节:从轮询到中断和环形缓冲区
c语言·单片机·嵌入式
Brilliantwxx16 小时前
【STM32】 内部 Flash 详解:寄存器逐位拆解 + 工作流程顺序全讲 + EEPROM再实现
stm32·单片机·嵌入式硬件·1024程序员节
木子单片机16 小时前
基于单片机的DS18B20温度传感器测温系统设计
单片机·嵌入式硬件·51单片机·keil