在电池供电、工业传感、便携医疗等低功耗应用场景中,STOP 模式凭借近乎零功耗的特性,成为延长设备续航的核心手段。APM32F402/F403 系列 MCU 的 RTC(实时时钟)模块,支持在 STOP 模式下通过闹钟 / 周期唤醒实现精准计时与低功耗切换。AN1162 应用笔记系统梳理了 RTC 配置、STOP 模式 entry/exit 流程、时钟源选择及低功耗优化技巧,本文基于官方文档,用工程化语言完整拆解,帮你快速实现“精准定时 + 深度休眠”的高效组合。
资料获取:AN1162_APM32F402_F403_RTC定时唤醒STOP模式
1. 核心场景与价值:为什么用 RTC 唤醒 STOP?
STOP 模式下,MCU 内核、大部分外设时钟均停止,仅保留 RTC、备份域及少量唤醒逻辑,功耗可降至μA 级,大幅降低电池损耗。
RTC 定时唤醒的核心价值在于:
2. RTC 与 STOP 模式基础:关键配置与原理
2.1 RTC 核心特性(AN1162 重点)
- 支持日历计时(秒 / 分 / 时 / 日 / 周 / 月 / 年)与计时计数两种模式
- 唤醒源:闹钟(Alarm A/B)、周期唤醒(Wakeup Timer)
- 时钟源:可选LSE(低速外部晶振,32.768kHz)、LSI(低速内部晶振,约 32kHz)
- 特性:支持备份域保护、溢出中断、校准功能
2.2 STOP 模式分类与唤醒逻辑
APM32F402/F403 的 STOP 模式分为STOP0与STOP1,核心差异在于唤醒源与恢复效率:
- STOP0:支持 RTC 闹钟 / 周期唤醒、外部中断唤醒,恢复速度快
- STOP1:仅支持少量唤醒源,功耗更低,适合极致低功耗场景
AN1162 推荐优先使用STOP0,兼容性与稳定性最佳。
唤醒流程核心逻辑:
- 进入 STOP 模式:内核休眠、时钟关闭、备份域保持供电
- RTC 计时运行,到达预设时间 / 周期时触发闹钟 / 周期中断
- 中断唤醒 MCU:退出 STOP 模式,恢复时钟与外设,执行任务
3. 硬件设计:RTC 与 STOP 模式必备电路
3.1 RTC 时钟源选择(直接影响精度)
| 时钟源 | 特点 | 适用场景 | 精度 |
|---|---|---|---|
| LSE(32.768kHz) | 外部晶振,温漂小,稳定性高 | 高精度定时、时钟同步场景 | ±20ppm~±50ppm |
| LSI(约 32kHz) | 内部晶振,无需外部器件 | 低成本、低精度、仅需计时场景 | 约 ±1%(随温度 / 电压波动) |
推荐方案:高精度应用优先接LSE 晶振(X1=32.768kHz,匹配电容 12~20pF),低成本应用可选用 LSI。
3.2 唤醒引脚与电源设计
- RTC 唤醒无需额外 GPIO(闹钟 / 周期为内部中断),若需外部触发唤醒,可配置EXTI 中断引脚
- STOP 模式下,VBAT 电源必须稳定供电(备份域供电),否则 RTC 数据丢失
- 增加VBAT 滤波电容(1μF 钽电容 + 100nF 陶瓷电容),抑制电源波动
4. 软件实现:3 步完成 RTC 定时唤醒 STOP 模式(AN1162 标准流程)
步骤 1:RTC 初始化(时钟 + 配置)
- 使能备份域时钟:
RCM_EnableBackupClock(); // 使能备份域时钟 RCM_EnableLSIClock(); // 使能LSI,或LSE - 初始化 RTC(按 AN1162 官方驱动模板):
// 选择时钟源 RTC_SelectClockSource(RCM_RTCSEL_LSI); // 或 RCM_RTCSEL_LSE // 初始化RTC日历(可选,根据需求设置初始时间) RTC_TimeTypeDef RTC_TimeStruct; RTC_DateTypeDef RTC_DateStruct; RTC_TimeStruct.Hours = 0; RTC_TimeStruct.Minutes = 0; RTC_TimeStruct.Seconds = 0; RTC_DateStruct.WeekDay = RTC_WEEKDAY_MONDAY; RTC_DateStruct.Month = RTC_MONTH_JANUARY; RTC_DateStruct.Date = 1; RTC_DateStruct.Year = 24; RTC_Init(&RTC_TimeStruct, &RTC_DateStruct);
步骤 2:配置唤醒源(闹钟 / 周期)
方案 A:闹钟唤醒(精准定时,如每 1 分钟唤醒)
RTC_AlarmTypeDef RTC_AlarmStruct;
// 设置闹钟时间:当前时间 + 1分钟(示例)
RTC_GetTime(RTC_Format_BIN, &RTC_TimeStruct);
RTC_TimeStruct.Seconds += 60;
if (RTC_TimeStruct.Seconds >= 60) {
RTC_TimeStruct.Seconds -= 60;
RTC_TimeStruct.Minutes += 1;
}
// 配置闹钟A
RTC_AlarmStruct.AlarmTime = RTC_TimeStruct;
RTC_AlarmStruct.AlarmMask = RTC_ALARMMASK_NONE; // 精准匹配时分秒
RTC_ConfigAlarm(RTC_ALARM_A, &RTC_AlarmStruct);
// 使能闹钟中断
RTC_EnableAlarmInterrupt(RTC_ALARM_A);
方案 B:周期唤醒(循环定时,如每 1 秒唤醒)
// 配置周期唤醒:1秒周期(LSI时钟下,计数器值=32768)
RTC_ConfigWakeupTimer(32768); // 周期=计数器值/时钟源频率
// 使能周期唤醒中断
RTC_EnableWakeupTimerInterrupt();
步骤 3:进入 STOP 模式并等待唤醒
- 配置中断优先级(RTC 中断属于外部中断 EXTI):
NVIC_EnableIRQ(RTC_Alarm_IRQn); // 闹钟中断 NVIC_EnableIRQ(RTC_WKUP_IRQn); // 周期唤醒中断 NVIC_SetPriority(RTC_Alarm_IRQn, 0x0F); - 进入 STOP 模式(AN1162 推荐使用官方库函数):
// 关闭所有不必要的外设时钟(降低功耗) PWR_EnablePowerDown(); PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); // WFI模式,等待中断 - 唤醒后处理(中断服务函数):
// RTC闹钟中断服务函数 void RTC_Alarm_IRQHandler(void) { if (RTC_GetFlagStatus(RTC_FLAG_ALRAF) != RESET) { RTC_ClearFlag(RTC_FLAG_ALRAF); // 清除中断标志 // 执行唤醒任务:如采集数据、上报信息 // ... // 重新设置下一次闹钟(如需循环唤醒) RTC_TimeStruct.Hours = 0; RTC_TimeStruct.Minutes = 1; RTC_TimeStruct.Seconds = 0; RTC_ConfigAlarm(RTC_ALARM_A, &RTC_AlarmStruct); } }
5. 关键优化与避坑(AN1162 官方重点)
5.1 低功耗优化技巧
- 关闭所有未使用外设时钟:进入 STOP 前,关闭 GPIO、ADC、TIM 等外设,进一步降低功耗
- 配置 GPIO 为浮空输入:避免 GPIO 悬空导致的漏电流
- 使用 LSI 时钟源:无需外部晶振,减少器件成本与功耗
- 优化唤醒周期:根据业务需求设置合理周期,避免过度唤醒
5.2 常见问题与解决方案
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 唤醒失败 | 时钟源未使能 | 确认 RCM_RTCSEL 配置正确,LSE/LSI 已启动 |
| 时间不准 | LSI 温漂 / 漂移 | 改用 LSE 时钟源;或定期校准 RTC |
| 进入 STOP 后死机 | 中断未关闭 / 标志未清除 | 进入前关闭所有非必要中断;唤醒后及时清除标志 |
| 功耗过高 | 外设未关闭 | 进入 STOP 前关闭所有外设时钟与电源 |
5.3 注意事项
- RTC 配置必须在备份域解锁状态下进行(
RCM_UnlockBackupConfig()),完成后锁定 - STOP 模式下,内核寄存器与 RAM 数据会保留,无需额外存储
- 周期唤醒与闹钟不可同时使用,需根据场景选择
6. 典型应用场景
- 智能传感器:定时采集环境数据(温湿度、气压等),休眠期间低功耗
- 医疗设备:定时监测体征数据,电池续航可达数月以上
- 工业网关:周期性上报设备状态,休眠期间降低电网损耗
- 便携消费电子:定时提醒、低功耗计时功能
AN1162 为 APM32F402/F403 系列 RTC 定时唤醒 STOP 模式提供了完整的工程化解决方案,核心在于“精准时钟配置 + 低功耗模式切换 + 中断唤醒处理”。通过 LSE/LSI 时钟源选择、闹钟 / 周期唤醒配置、硬件滤波与软件优化,可轻松实现低功耗 + 精准定时的双重需求。无论是低成本传感项目还是高精度网络应用,这套方案都能稳定落地,大幅提升产品续航与可靠性。
211