### **1. Standby Mode with RTC**
#### **进入方法**:
```c
// 配置RTC唤醒源(如周期唤醒)
HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 0x1000, RTC_WAKEUPCLOCK_RTCCLK_DIV16); // 示例值
// 进入Standby模式
HAL_PWR_EnterSTANDBYMode();
```
**关键步骤**:
1. 使能RTC时钟(`__HAL_RCC_RTC_ENABLE()`)
2. 配置RTC唤醒时间(通过 `HAL_RTCEx_SetWakeUpTimer_IT()`)
3. 使能唤醒中断(`__HAL_PWR_ENABLE_IT(PWR_IT_WU)`)
4. 清除唤醒标志(`__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU)`)
5. 执行 `HAL_PWR_EnterSTANDBYMode()`
#### **功耗**:
- **典型值**:0.3 μA(VDD = 3.3V, 25°C)
- 所有时钟关闭,内核电压域断电,SRAM/寄存器内容丢失(除备份域)。
#### **唤醒源**:
- **RTC唤醒事件**(配置的定时器到期)
- **NRST引脚外部复位**
- **唤醒引脚(PA0)**(上升沿触发)
#### **唤醒后执行**:
- **系统复位**,程序从头开始执行(相当于上电复位)。
- 可通过 `PWR->CSR`检查唤醒标志(`SBF`)判断是否从Standby唤醒:
```c
if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET) {
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB); // 清除标志
// 执行唤醒初始化
}
```
2. Stop Mode with RTC
进入方法:
// 配置RTC唤醒
HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 0x1000, RTC_WAKEUPCLOCK_RTCCLK_DIV16);
// 进入Stop模式
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
关键步骤:
- 选择稳压器模式(
PWR_LOWPOWERREGULATOR_ON
或 PWR_MAINREGULATOR_ON
)
- 配置RTC唤醒(同上)
- 使用
WFI
或 WFE
指令进入(PWR_STOPENTRY_WFI/WFE
)
功耗:
- 低功耗稳压器开启:~1 μA(VDD=3.3V, 25°C)
- 主稳压器开启:~10 μA
实际功耗受GPIO状态、未关闭外设影响。
唤醒源:
- RTC唤醒事件
- 外部中断(EXTI)(如按键、传感器信号)
- LPUART/USART唤醒
- LPTIM中断
唤醒后执行:
关键差异总结
特性 |
Standby Mode |
Stop Mode |
功耗 |
~0.3 μA |
~1 μA (低功耗稳压器) |
SRAM保持 |
否 |
是 |
唤醒后执行位置 |
复位(从头开始) |
中断处继续执行 |
时钟恢复 |
无需(复位后初始化) |
需手动重新配置系统时钟 |
唤醒延迟 |
较长(复位流程) |
极短(仅中断响应时间) |
补充说明
-
RTC时钟源:
-
GPIO配置:
- 所有未使用的GPIO应配置为模拟输入以降低功耗。
- 唤醒引脚(如PA0)需配置为
GPIO_MODE_IT_RISING
。
-
调试影响:
建议参考STM32L051x8数据手册(DS11195)和参考手册(RM0377)获取更详细的电气特性与寄存器配置细节。