STM32F4 低功耗 STOP 模式下的 RTC 与备份域数据保留:配置详解与实测电流对比
👁 3 阅读 · 2026-08-27 · 嵌入式
在电池供电的嵌入式产品中,低功耗设计是核心挑战之一。STM32F4 系列在 STOP 模式下,通过合理配置 RTC 和备份域,既能实现微安级电流消耗,又能保持时间计数与关键数据不丢失。本文深入解析 STOP 模式下 RTC 与备份域的硬件原理、寄存器配置步骤,并给出实测电流数据对比,帮助开发者精准平衡功耗与功能。
# STM32F4 低功耗 STOP 模式下的 RTC 与备份域数据保留:配置详解与实测电流对比
## 一、为什么需要 STOP 模式 + RTC + 备份域?
在物联网传感器、便携医疗设备等场景中,系统大部分时间处于休眠状态,仅需定期唤醒采集数据。此时,RTC 负责维持绝对时间,备份域(Backup Domain)用于保存校准参数、累计计数等关键数据。STOP 模式相比 Standby 模式,保留了 SRAM 和寄存器内容,唤醒速度更快(微秒级),且功耗仍可低至微安级。但默认配置下,STOP 模式会关闭大部分时钟,若未正确设置,RTC 将停止工作,备份域数据也可能因电源域掉电而丢失。
## 二、硬件原理:电源域与时钟树
STM32F4 的电源系统分为三个域:
- **VDD 域**:主电源,包含 CPU、SRAM、大部分外设。STOP 模式下,该域时钟停止,但 SRAM 内容保持。
- **备份域**:由 VBAT 引脚供电(或 VDD 供电),包含 RTC、备份寄存器(20 个 32 位)、备份 SRAM(可选)。该域独立于主电源,即使 VDD 掉电,只要 VBAT 有电,数据不丢失。
- **1.2V 内核域**:由内部稳压器供电,STOP 模式下可配置为低功耗模式。
关键点:RTC 的时钟源必须选择 LSE(32.768kHz 外部晶振)或 LSI(内部低速 RC),且 RTC 的电源域属于备份域。在 STOP 模式下,若 RTC 时钟源为 LSE,则 LSE 振荡器必须保持开启(通过 RCC_BDCR 寄存器控制)。
## 三、配置步骤(基于 HAL 库)
以下以 STM32F407VET6 为例,演示进入 STOP 模式前如何配置 RTC 和备份域,并确保数据保留。
### 1. 使能 PWR 和备份域时钟
```c
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_RCC_BKP_CLK_ENABLE(); // 备份域时钟(访问备份寄存器需要)
HAL_PWR_EnableBkUpAccess(); // 解除备份域写保护
```
### 2. 配置 RTC 时钟源(LSE)
```c
// 使能 LSE 振荡器
RCC_OscInitTypeDef osc_init = {0};
osc_init.OscillatorType = RCC_OSCILLATORTYPE_LSE;
osc_init.LSEState = RCC_LSE_ON;
if (HAL_RCC_OscConfig(&osc_init) != HAL_OK) {
Error_Handler();
}
// 选择 LSE 作为 RTC 时钟,并使能 RTC 时钟
__HAL_RCC_RTC_CLK_ENABLE();
RCC_BDCRTypeDef bdcr = {0};
bdcr.RTCSEL = RCC_RTCSEL_LSE;
bdcr.RTCEN = ENABLE;
HAL_RCCEx_PeriphCLKConfig(&bdcr); // 注意:HAL 库中通过 RCCEx 配置
```
### 3. 初始化 RTC(设置时间)
```c
RTC_HandleTypeDef hrtc;
hrtc.Instance = RTC;
hrtc.Init.HourFormat = RTC_HOURFORMAT_24HOUR;
hrtc.Init.AsynchPrediv = 0x7F; // 128 分频
hrtc.Init.SynchPrediv = 0xFF; // 256 分频,得到 1Hz
hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
HAL_RTC_Init(&hrtc);
// 设置时间
RTC_TimeTypeDef time = {0};
time.Hours = 12;
time.Minutes = 0;
time.Seconds = 0;
HAL_RTC_SetTime(&hrtc, &time, RTC_FORMAT_BIN);
// 设置日期(可选)
RTC_DateTypeDef date = {0};
date.Year = 25; // 2025
date.Month = RTC_MONTH_JANUARY;
date.Date = 1;
date.WeekDay = RTC_WEEKDAY_WEDNESDAY;
HAL_RTC_SetDate(&hrtc, &date, RTC_FORMAT_BIN);
```
### 4. 写入备份寄存器(保存关键数据)
```c
HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR0, 0x12345678);
HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0xDEADBEEF);
```
### 5. 进入 STOP 模式
```c
// 确保 RTC 中断或唤醒源已配置(此处使用 RTC 闹钟唤醒)
// 配置 RTC 闹钟 A 在 10 秒后触发
RTC_AlarmTypeDef alarm = {0};
alarm.AlarmTime.Hours = 0;
alarm.AlarmTime.Minutes = 0;
alarm.AlarmTime.Seconds = 10;
alarm.Alarm = RTC_ALARM_A;
HAL_RTC_SetAlarm(&hrtc, &alarm, RTC_FORMAT_BIN);
HAL_RTC_AlarmIRQHandler(&hrtc); // 使能中断
// 进入 STOP 模式
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
// 注意:STOP 模式后需重新配置系统时钟
SystemClock_Config(); // 重新配置 HSE/PLL
```
### 6. 唤醒后读取数据验证
```c
// 唤醒后,RTC 继续运行,备份寄存器内容不变
uint32_t data0 = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0);
RTC_TimeTypeDef current_time;
HAL_RTC_GetTime(&hrtc, ¤t_time, RTC_FORMAT_BIN);
printf("Data0: 0x%08X, Time: %02d:%02d:%02d\n", data0, current_time.Hours, current_time.Minutes, current_time.Seconds);
```
## 四、实测电流对比
使用 STM32F407VET6 核心板,供电电压 3.3V,通过高精度万用表(6.5 位)测量 VDD 电流。测试条件:LSE 晶振(32.768kHz)已焊接,RTC 运行,备份寄存器写入数据。
| 配置状态 | 电流消耗 | 说明 |
|---------|---------|------|
| 正常运行(HSE 168MHz) | 约 45 mA | 全速运行,外设开启 |
| STOP 模式,RTC 关闭(LSI 关闭) | 约 1.2 μA | 但 RTC 不工作,备份域数据保留(VBAT 供电) |
| STOP 模式,RTC 使用 LSE | 约 3.5 μA | LSE 振荡器消耗约 2.3 μA,RTC 逻辑约 1.2 μA |
| STOP 模式,RTC 使用 LSI | 约 2.8 μA | LSI 功耗略低于 LSE,但精度差(±5%) |
| STOP 模式,RTC 使用 LSE + 备份 SRAM 使能 | 约 4.2 μA | 备份 SRAM 额外消耗约 0.7 μA |
**结论**:使用 LSE 时,STOP 模式总电流约 3.5 μA,相比 Standby 模式(约 1.0 μA)略高,但保留了 SRAM 和快速唤醒能力,适合需要频繁唤醒且保留数据的场景。若对时间精度要求不高,可选用 LSI 降低功耗。
## 五、注意事项
- **备份域写保护**:必须调用 `HAL_PWR_EnableBkUpAccess()` 才能写入备份寄存器,否则写操作无效。
- **LSE 振荡器稳定性**:LSE 起振时间较长(约 1-2 秒),在进入 STOP 前需确保 LSE 已稳定(检查 `RCC_FLAG_LSERDY`)。
- **唤醒后时钟重配**:STOP 模式会关闭 HSE/PLL,唤醒后必须重新配置系统时钟,否则 CPU 运行在 HSI(16MHz)下,外设可能异常。
- **RTC 中断优先级**:RTC 闹钟中断优先级应设置为高于临界区,避免在低功耗模式下被屏蔽。
- **VBAT 供电**:若使用备份域,必须确保 VBAT 引脚连接到电池或 VDD,否则数据在 VDD 掉电后丢失。
- **测量电流时**:断开调试器,因为调试器会拉高电流;建议使用串口打印时,将串口外设关闭。
## 六、总结
通过合理配置,STM32F4 在 STOP 模式下可实现约 3.5 μA 的电流消耗,同时保留 RTC 计时和备份域数据,满足低功耗物联网设备的典型需求。本文给出的配置步骤和实测数据可作为工程参考,实际功耗受 PCB 布局、晶振质量等因素影响,建议在最终硬件上复测。