首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

STM32 低功耗模式詳解:Sleep / Stop / Standby

     編輯:關於C語言

STM32 電源管理三大模式深度解析

STM32 (Cortex-M3) 提供三級低功耗模式,由淺入深依次為 Sleep、Stop、Standby。理解各模式的時鐘、電源域狀態與喚醒機制,是設計低功耗嵌入式系統的關鍵。

三大模式對比

模式CPU (核心)CPU 電源 (1.8V)外設/時鐘喚醒後執行位置典型電流
Sleep停止 (WFI/WFE)保持供電全速運行原指令繼續~mA 級
Stop停止保持供電所有时鐘停止 (含 HSI/HSE/PLL)原指令繼續~µA 級
Standby斷電斷電全關閉,僅 RTC/備份域/獨立看門狗/喚醒腳位工作系統複位,從頭執行~nA 級

形象類比

  • CPU = 皇帝
  • CPU 1.8V 電源 = 皇后
  • 外設 = 將軍

Sleep:皇帝睡覺,皇后、將軍值班
Stop:皇帝、將軍睡覺,皇后值班
Standby:皇帝、皇后、將軍全睡覺

原則:皇后不睡(CPU 電源在),程式上下文保留;皇后睡(Standby),上下文丟失,喚醒即複位。

程式碼實作要點

1. Sleep 模式


while (1) {
    // 應用邏輯...
    __WFI();  // 進入 Sleep,任意中斷喚醒
}

無需重新配置時鐘,中斷服務程序 (ISR) 結束自動恢復執行。

2. Stop 模式


#include "stm32f10x_pwr.h"

void Enter_Stop_Mode(void) {
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); // 開啟 PWR 時鐘
    PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
}

void Wakeup_From_Stop(void) {
    // 必須重新啟動 HSE/PLL 並切換系統時鐘
    SYSCLKConfig_STOP();
}

void SYSCLKConfig_STOP(void) {
    ErrorStatus HSEStartUpStatus;
    RCC_HSEConfig(RCC_HSE_ON);
    HSEStartUpStatus = RCC_WaitForHSEStartUp();
    if (HSEStartUpStatus == SUCCESS) {
        RCC_PLLCmd(ENABLE);
        while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
        while (RCC_GetSYSCLKSource() != 0x08);
    }
}

喚醒來源:任意外部中斷 (EXTI)、RTC 警報、USB 喚醒等。需在 EXTI 配置中設定對應線路中斷/事件。

3. Standby 模式


void Enter_Standby_Mode(void) {
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
    PWR_WakeUpPinCmd(ENABLE);   // 啟用 WKUP 腳位 (PA0) 上升沿喚醒
    PWR_EnterSTANDBYMode();     // 進入 Standby
}

void Check_Standby_Wakeup(void) {
    if (PWR_GetFlagStatus(PWR_FLAG_WU) == SET) {
        printf("PA0 上升沿喚醒\n");
        PWR_ClearFlag(PWR_FLAG_WU);
    } else {
        printf("系統複位啟動\n");
    }
}

喚醒來源:WKUP 腳位 (PA0) 上升沿、RTC 警報、外部復位、IWDG 復位。喚醒後系統完整複位,main() 重新執行,需透過旗標判斷喚醒來源。

關鍵差異總結

  • 上下文保留:Sleep/Stop 保留 CPU 寄存器與 SRAM;Standby 僅保留備份域暫存器與 RTC
  • 恢復速度:Sleep 最快 (幾個週期) → Stop 需重啟 PLL (百 µs) → Standby 完整開機 (ms 級)
  • 應用場景:Sleep 適合短暫等待中斷;Stop 適合間歇性感測/通訊;Standby 適合極低功耗待機、電池供電產品

常見坑點

  1. Stop 模式喚醒後忘記重配時鐘 → 系統跑飛
  2. Standby 喚醒以為是繼續執行實為複位 → 全域變數未初始化
  3. 未正確配置 EXTI 線路對應喚醒來源 → 無法喚醒
  4. 使用庫函數時 PWR_EnterSTOPMode 參數 PWR_STOPEntry_WFI vs WFE 混淆
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved