低功耗、RTC 与时基唤醒
本文档介绍 AC63 系列 MCU(AC632N/AC635N/AC636N/AC638N)固件中低功耗管理、RTC 实时时钟与基于时基(Alarm)唤醒的完整机制:从电源管理 API、板级低功耗回调注册,到 RTC 驱动、闹钟定时与唤醒后的软关机判定,覆盖整个低功耗休眠—唤醒闭环。
Purpose and Scope
本页面向需要理解或修改 AC63 平台低功耗行为(睡眠、软关机、RTC 定时唤醒)的固件工程师,涵盖:
- 电源管理入口与软关机 API(
power_api.c中的power_set_soft_poweroff)。 - 板级低功耗回调的注册与实现(
board_demo.c中的board_set_soft_poweroff、sleep_enter_callback、sleep_exit_callback)。 - RTC 驱动(
rtc.c/rtc_calculate.c)中与唤醒相关的时间计算、闹钟(Alarm)与时基唤醒逻辑。 - 唤醒后通过
P2M_SOFTOFF标志判定"继续软关机"还是"恢复运行"的流程。
边界说明:以下内容不属于本页范围,请参考对应页面——具体外设(DAC、GPIO、SPI 等)的关机时序属于各外设驱动文档;充电/电量管理(charger/battery)属于电源管理扩展主题;bootloader 与升级流程不在此讨论。
Overview
AC63 系列是杰理(Jieli)面向 TWS 耳机、穿戴、玩具等低功耗场景的蓝牙 SoC。其低功耗设计围绕两个核心目标:
- 待机省电:系统空闲时进入低功耗模式(sleep),通过
power_set_callback(TCFG_LOWPOWER_LOWPOWER_SEL, ...)注册进入/退出低功耗回调与软关机回调,实现"事件驱动 + 定时唤醒"的省电调度。 - 定时唤醒(时基唤醒):依靠 RTC(实时时钟)保持计时并在预设的 Alarm 时刻触发系统唤醒,典型场景包括:闹钟/提醒、定时开关机、周期性传感器采样、软关机(soft poweroff)状态下的定时上电。
低功耗与 RTC 的关系是双向的:
- 进入低功耗时,软件通过 RTC 设置 Alarm(定时基准),随后 CPU 进入睡眠或软关机。
- 时基唤醒发生后,系统从唤醒源恢复执行,根据
P2M_SOFTOFF(软关机标志)决定本次唤醒是"恢复运行"还是"再次进入软关机"。
这一机制在 sdk/bsp/AC632N/src/rtc.c 中体现得最直接:RTC 中断/唤醒处理中检查 P2M_SOFTOFF,若标志有效则调用 power_set_soft_poweroff() 重新进入软关机,从而形成"定时唤醒 → 判断 → 再次睡眠"的闭环。
Architecture
下图展示低功耗、RTC 与时基唤醒相关的模块划分与依赖关系(节点名与源码中的函数/文件一一对应):
flowchart TD
subgraph sg_App["应用层"]
App["用户任务 / 业务逻辑"]
end
subgraph sg_Power["低功耗管理"]
PowerApi["power_api.c<br/>power_set_soft_poweroff"]
PowerCallback["power_set_callback<br/>(TCFG_LOWPOWER_LOWPOWER_SEL)"]
end
subgraph sg_Board["板级配置 board_demo.c"]
SoftOff["board_set_soft_poweroff"]
SleepCB["sleep_enter_callback / sleep_exit_callback"]
end
subgraph sg_RTC["RTC 驱动"]
RtcDriver["rtc.c<br/>RTC 中断 / Alarm 处理"]
RtcCalc["rtc_calculate.c<br/>时间换算"]
P2M["P2M_SOFTOFF 标志"]
end
subgraph sg_HW["硬件"]
RtcHW["RTC 硬件模块"]
CPU["CPU 睡眠/唤醒源"]
end
App -->|"请求进入低功耗"| PowerApi
PowerApi -->|"注册回调"| PowerCallback
PowerCallback --> SoftOff
PowerCallback --> SleepCB
SoftOff --> RtcDriver
RtcDriver --> RtcCalc
RtcDriver --> P2M
P2M -->|"若为软关机标志"| PowerApi
RtcDriver --> RtcHW
RtcHW -->|"Alarm 到时"| CPU
CPU -->|"唤醒"| RtcDriver
SleepCB --> CPU
各模块职责说明:
| 模块 | 源码位置 | 职责 |
|---|---|---|
power_set_soft_poweroff | sdk/bsp/AC632N/src/power_api.c | 电源管理核心入口,触发整机软关机流程 |
power_set_callback | sdk/bsp/AC632N/board/board_demo.c | 注册低功耗进入/退出回调与软关机回调 |
board_set_soft_poweroff | sdk/bsp/AC632N/board/board_demo.c | 板级软关机实现,负责关闭外设供电并配置唤醒源 |
rtc.c 唤醒处理 | sdk/bsp/AC632N/src/rtc.c | RTC 驱动与闹钟中断处理,检查 P2M_SOFTOFF 决定后续状态 |
注:AC635N、AC636N、AC638N 的
board_demo.c与power_api.c结构相同(Grep 结果显示各芯片板级文件均在同一行位注册power_set_callback(TCFG_LOWPOWER_LOWPOWER_SEL, sleep_enter_callback, sleep_exit_callback, board_set_soft_poweroff)),本页以 AC632N 为例展开,其余型号机制一致。
低功耗管理实现详解
1. 电源管理 API(power_api.c)
电源管理的最简入口封装在 sdk/bsp/AC632N/src/power_api.c:
{
power_set_soft_poweroff();
}
Source: power_api.c
这是应用层触发整机软关机(soft poweroff)的统一入口:函数内部调用底层电源管理库的 power_set_soft_poweroff(),进入软关机前会依次执行已注册的退出低功耗/关机回调,将系统置于可被唤醒源(GPIO、RTC Alarm、充电插入等)唤醒的最低功耗状态。
设计意图:把"关机"抽象成可配置的电源状态而非直接断电,使 RTC 等模块在软关机期间保持供电并继续计时,从而支撑定时唤醒场景——这正是本页主题(RTC 时基唤醒)能成立的前提。
2. 板级低功耗回调注册(board_demo.c)
各芯片的板级初始化(board_demo.c)在系统启动阶段完成低功耗回调注册:
power_set_callback(TCFG_LOWPOWER_LOWPOWER_SEL, sleep_enter_callback, sleep_exit_callback, board_set_soft_poweroff);
Source: board_demo.c
该调用一次注册三类回调:
| 参数 | 含义 | 触发时机 |
|---|---|---|
TCFG_LOWPOWER_LOWPOWER_SEL | 低功耗模式选择(编译/配置宏) | 决定低功耗策略档位 |
sleep_enter_callback | 进入睡眠回调 | CPU 即将进入低功耗前 |
sleep_exit_callback | 退出睡眠回调 | 唤醒源触发、CPU 恢复执行后 |
board_set_soft_poweroff | 软关机回调 | 执行软关机流程时 |
板级软关机函数签名如下(AC632N):
void board_set_soft_poweroff(void)
{
...
}
Source: board_demo.c
设计意图:把"进入/退出低功耗"与"软关机"做成回调钩子,业务代码不需要关心具体外设如何掉电;板级文件统一管理 GPIO 保持、外设电源关断、唤醒源使能等平台相关细节。AC635N/AC636N/AC638N 的板级文件在对应位置(AC635N board_demo.c L334、AC636N board_demo.c L355、AC638N board_demo.c L384)注册了完全相同的回调组合,说明这套低功耗框架是跨型号统一的。
3. RTC 驱动与时基唤醒(rtc.c / rtc_calculate.c)
RTC 子系统由两组文件构成:
sdk/bsp/AC632N/src/rtc.c+sdk/bsp/AC632N/include/asm/rtc.h:RTC 硬件驱动,负责时间计数、闹钟(Alarm)配置与 RTC 中断/唤醒处理。sdk/bsp/AC632N/src/rtc_calculate.c+sdk/bsp/AC632N/include/asm/rtc_calculate.h:日历时间换算(年/月/日/时/分/秒 ↔ 秒计数),保证 Alarm 设定与系统计时一致。- AC635N 另提供
sdk/bsp/AC635N/include/asm/rtc_port.h,封装 RTC 相关的端口/平台差异。
时基唤醒的关键逻辑在 RTC 中断处理路径中,AC632N 实现如下:
if (P2M_SOFTOFF) {
power_set_soft_poweroff();
}
Source: rtc.c
这段代码揭示了"时基唤醒 + 软关机"组合的核心语义:
- RTC Alarm 到时 → 硬件唤醒 CPU → 进入 RTC 中断/唤醒处理。
- 检查电源管理标志
P2M_SOFTOFF(记录本次唤醒前系统处于软关机状态)。 - 若标志有效,说明"这次唤醒只是软关机期间的定时点",则立即调用
power_set_soft_poweroff()再次进入软关机,等待下一个 Alarm 或外部事件。
设计意图:软关机状态下 RTC 继续运行,Alarm 唤醒后 CPU 短暂运行以完成必要处理(如刷新状态、喂狗、事件记账),随后自动回到软关机,从而以极低平均功耗实现"周期性的时基任务"(例如定时上报、定时自检、闹钟响铃)。
Core Flow:低功耗进入 → RTC 定时 → 时基唤醒 → 状态判定
时序图
sequenceDiagram
participant App as 应用任务
participant PA as power_api.c
participant BC as board_demo.c 回调
participant RTC as rtc.c
participant HW as RTC 硬件
App->>PA: 请求低功耗/软关机
PA->>BC: power_set_callback 注册的软关机回调<br/>board_set_soft_poweroff
BC->>BC: 关闭外设电源/配置唤醒源
BC->>RTC: 设置 Alarm(时基唤醒点)
RTC->>HW: 写入闹钟寄存器
HW-->>CPU: 进入睡眠/软关机(RTC 保持计时)
HW-->>RTC: Alarm 到时唤醒
RTC->>RTC: 处理 RTC 中断/唤醒事件
RTC->>RTC: 检查 P2M_SOFTOFF
alt 软关机标志有效
RTC->>PA: power_set_soft_poweroff()<br/>再次进入软关机
else 正常运行被唤醒
RTC-->>BC: sleep_exit_callback 恢复运行
BC-->>App: 继续业务
end
状态流转
stateDiagram-v2
[*] --> Running: 上电/复位
Running --> Sleeping: 空闲或请求睡眠<br/>(sleep_enter_callback)
Sleeping --> Running: 外部事件唤醒<br/>(sleep_exit_callback)
Running --> SoftOff: power_set_soft_poweroff<br/>board_set_soft_poweroff
SoftOff --> WakeCheck: RTC Alarm 到时唤醒<br/>(P2M_SOFTOFF 置位)
WakeCheck --> SoftOff: P2M_SOFTOFF 有效<br/>再次 power_set_soft_poweroff
WakeCheck --> Running: 正常唤醒路径<br/>清除软关机标志
Sleeping --> SoftOff: 定时任务触发软关机
关键点解读:
- 状态判定由
P2M_SOFTOFF决定:它是区分"软关机定时唤醒"与"普通睡眠唤醒"的唯一依据,因此rtc.c中必须先读标志、再决定是否重入软关机,顺序不可颠倒。 - Alarm 是时基唤醒的载体:RTC 硬件在软关机状态下仍供电计时,Alarm 到时会拉起 CPU;这一"RTC 常供电"特性是整套机制与普通 GPIO 唤醒互补之处——GPIO 唤醒依赖外部事件,Alarm 唤醒依赖时间。
- 回调分层:
power_api.c只负责状态切换;具体掉电/上电动作下沉到board_demo.c;RTC 只负责计时与报警。分层使同一套低功耗框架可适配多型号(AC632N/635N/636N/638N)而无需改动电源管理核心。
配置选项
| 配置项 | 类型 | 默认/取值 | 说明 |
|---|---|---|---|
TCFG_LOWPOWER_LOWPOWER_SEL | 宏 | 板级配置 | 低功耗模式选择,作为 power_set_callback 的第一个参数决定注册的低功耗策略档位 |
P2M_SOFTOFF | 位标志 | 由电源管理库维护 | 软关机状态标志;RTC 唤醒处理中读取以判定是否重入软关机 |
| Alarm 时间 | RTC 寄存器 | 应用设定 | 时基唤醒点,由 rtc.c 写入硬件;软关机前通过板级回调配置 |
| 日历基准 | 时间结构 | 上电初始化 | rtc_calculate.c 负责年/月/日/时/分/秒与秒计数的换算,保证 Alarm 语义正确 |
完整低功耗配置通常还包含
TCFG_LOWPOWER_*系列宏(如低功耗电压、唤醒源使能等),具体取值以各芯片board_demo.c中#define为准;本页仅列出与 RTC 时基唤醒直接相关的选项。
用法示例(来自源码)
示例 1:注册低功耗回调(系统初始化阶段)
各芯片板级初始化均调用 power_set_callback 完成回调绑定,这是使用低功耗功能的第一步:
power_set_callback(TCFG_LOWPOWER_LOWPOWER_SEL, sleep_enter_callback, sleep_exit_callback, board_set_soft_poweroff);
Source: board_demo.c
说明:sleep_enter_callback / sleep_exit_callback 由板级文件实现(分别对应 CPU 睡眠前后钩子),board_set_soft_poweroff 为软关机回调。业务代码只需确保该注册先于任何低功耗请求执行。
示例 2:应用触发软关机
{
power_set_soft_poweroff();
}
Source: power_api.c
说明:这是应用层进入软关机的标准入口。在"定时开关机"场景中,业务可在关机前设置好 RTC Alarm,再调用本接口;RTC 保持计时,Alarm 到时自动唤醒。
示例 3:RTC 唤醒后的软关机判定(平台内部逻辑)
if (P2M_SOFTOFF) {
power_set_soft_poweroff();
}
Source: rtc.c
说明:该片段位于 RTC 唤醒处理路径。它实现"软关机期间定时唤醒 → 短时运行 → 自动重入软关机"的周期任务模式。若需在唤醒瞬间执行业务动作(如采样、上报),可在调用 power_set_soft_poweroff() 之前插入处理代码。
API 参考
void power_set_soft_poweroff(void)
电源管理库提供的软关机接口,通过 power_api.c 暴露给应用层。
- 参数:无
- 返回:无(软关机流程通常不返回,或返回后系统已进入低功耗态)
- 行为:触发整机软关机;执行前会走
power_set_callback注册的软关机回调(board_set_soft_poweroff),由板级代码关闭外设并配置唤醒源。 - 注意:软关机期间 RTC 必须保持供电,否则时基唤醒将失效。
void power_set_callback(u8 power_sel, void (*enter_cb)(void), void (*exit_cb)(void), void (*softoff_cb)(void))
低功耗回调注册接口(由电源管理库提供,板级文件调用)。
- 参数:
power_sel:低功耗模式选择,如TCFG_LOWPOWER_LOWPOWER_SELenter_cb:进入低功耗回调(sleep_enter_callback)exit_cb:退出低功耗回调(sleep_exit_callback)softoff_cb:软关机回调(board_set_soft_poweroff)
- 返回:无
- 行为:绑定睡眠进入/退出与软关机三个钩子;回调由电源管理状态机在相应时机调用。
void board_set_soft_poweroff(void)
板级软关机实现(见 board_demo.c L328)。
- 参数:无
- 返回:无
- 行为:平台相关——关闭 DAC 等外设电源(源码中
extern void dac_power_off(void)提示板级关机涉及外设供电管理)、配置唤醒源,然后交由电源管理库进入软关机态。
说明:RTC 驱动层(
rtc.c/rtc_calculate.c)的完整 API(如rtc_alarm_set、rtc_get_time等)未在本页逐一列出,详细签名见 rtc.h 与 rtc_calculate.h。
失败模式、边界情况与并发
- Alarm 未触发/唤醒失败:若软关机时 RTC 供电被意外切断(如电池完全耗尽、RTC 独立电源域配置错误),时基唤醒将永远无法发生。排查顺序:RTC 供电配置 → Alarm 寄存器写入 →
P2M_SOFTOFF判定路径。 P2M_SOFTOFF误判:RTC 唤醒处理必须先检查标志再决定是否重入软关机;若标志清除时机错误,可能出现"本应恢复运行却再次关机"或反向问题。该标志由电源管理库维护,业务代码不应直接改写。- 唤醒后重复进入软关机:
P2M_SOFTOFF有效时power_set_soft_poweroff()被再次调用,这是设计预期行为(周期性时基任务);若某次唤醒需要恢复正常运行,必须在重入软关机前清除软关机标志并完成业务处理。 - 时间基准漂移:
rtc_calculate.c负责日历换算;跨年/闰月等边界若换算表有误,会导致 Alarm 定时偏差。修改 RTC 时间或时区后应重新计算 Alarm。 - 并发/中断嵌套:RTC 唤醒处理运行在中断上下文,回调(
sleep_exit_callback)与业务恢复代码应避免阻塞操作;power_set_soft_poweroff在中断路径中被调用,其实现必须可重入且不能在中断中等待长临界区。 - 多型号差异:AC632N/635N/636N/638N 的注册模式一致,但外设掉电清单(如 DAC、SPI 端口)与 RTC 端口封装(AC635N 的
rtc_port.h)不同,跨型号移植时以对应板级文件为准。
性能与运维注意
- 平均功耗:软关机 + RTC 时基唤醒的平均功耗取决于"唤醒周期"与"唤醒驻留时间"之比;唤醒驻留越短、Alarm 周期越长,平均电流越低。
- 唤醒驻留:
P2M_SOFTOFF路径下,从 Alarm 唤醒到再次power_set_soft_poweroff()之间的代码应保持精简,避免不必要的延时与外设初始化。 - RTC 计算开销:
rtc_calculate.c的日期换算为纯计算,仅在实际读写时间时执行,不占用常驻 CPU;无需额外优化。
扩展点
- 新增唤醒源:在
board_set_soft_poweroff中使能新的唤醒源(GPIO、充电检测等),并在sleep_exit_callback中按唤醒源分发处理。 - 周期性时基任务:在
rtc.c的P2M_SOFTOFF分支中、调用power_set_soft_poweroff()之前插入任务代码,即可实现"每次 Alarm 唤醒执行一次"的定时任务,无需改动电源管理框架。 - 多 Alarm 场景:RTC 驱动层可扩展维护 Alarm 队列,将不同业务(闹钟、上报、自检)映射到不同定时点。
测试
源码树中未发现针对低功耗/RTC 唤醒的独立单元测试文件(Grep 与 ListFiles 未命中 *lowpower* 测试源);平台验证主要依赖板级联调:软关机后测量待机电流、设置短 Alarm 验证唤醒、切换唤醒周期验证 P2M_SOFTOFF 重入路径。建议在移植新板型时至少覆盖:软关机→Alarm 唤醒→重入软关机、软关机→GPIO 唤醒→正常运行、RTC 掉电后重新校时三条路径。
Related Links
- RTC 驱动头文件(AC632N)
- RTC 日历换算(AC632N)
- RTC 端口封装(AC635N)
- 电源管理 API(AC632N)
- 板级低功耗配置(AC632N)
- 外设关机时序与 DAC 电源管理:见各外设驱动文档;充电/电池管理:见电源管理扩展主题页。