STM32 (Cortex-M3) 提供三級低功耗模式,由淺入深依次為 Sleep、Stop、Standby。理解各模式的時鐘、電源域狀態與喚醒機制,是設計低功耗嵌入式系統的關鍵。
| 模式 | CPU (核心) | CPU 電源 (1.8V) | 外設/時鐘 | 喚醒後執行位置 | 典型電流 |
|---|---|---|---|---|---|
| Sleep | 停止 (WFI/WFE) | 保持供電 | 全速運行 | 原指令繼續 | ~mA 級 |
| Stop | 停止 | 保持供電 | 所有时鐘停止 (含 HSI/HSE/PLL) | 原指令繼續 | ~µA 級 |
| Standby | 斷電 | 斷電 | 全關閉,僅 RTC/備份域/獨立看門狗/喚醒腳位工作 | 系統複位,從頭執行 | ~nA 級 |
Sleep:皇帝睡覺,皇后、將軍值班
Stop:皇帝、將軍睡覺,皇后值班
Standby:皇帝、皇后、將軍全睡覺
原則:皇后不睡(CPU 電源在),程式上下文保留;皇后睡(Standby),上下文丟失,喚醒即複位。
while (1) {
// 應用邏輯...
__WFI(); // 進入 Sleep,任意中斷喚醒
}
無需重新配置時鐘,中斷服務程序 (ISR) 結束自動恢復執行。
#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 配置中設定對應線路中斷/事件。
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() 重新執行,需透過旗標判斷喚醒來源。
PWR_EnterSTOPMode 參數 PWR_STOPEntry_WFI vs WFE 混淆