杰理 SDK 文档中心
首页
首页
  • 概述与入门

    • 项目概览
    • 快速开始与开发环境
  • 应用与运行时

    • 应用入口与主循环
    • 按键驱动与用户消息处理
    • 消息系统
  • 固件升级

    • 双备份升级机制与状态机
    • UART 升级传输
    • 升级校验、启动信息与复位流程
  • 芯片与硬件支持

    • AC63 系列芯片 BSP 结构
    • 外设接口与驱动
    • 低功耗、RTC 与时基唤醒
  • 构建与工具

    • 构建系统与工作区
    • 烧写与量产工具
  • 参考资源

    • 数据手册与原理图
    • 双备份升级文档

低功耗、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。其低功耗设计围绕两个核心目标:

  1. 待机省电:系统空闲时进入低功耗模式(sleep),通过 power_set_callback(TCFG_LOWPOWER_LOWPOWER_SEL, ...) 注册进入/退出低功耗回调与软关机回调,实现"事件驱动 + 定时唤醒"的省电调度。
  2. 定时唤醒(时基唤醒):依靠 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_poweroffsdk/bsp/AC632N/src/power_api.c电源管理核心入口,触发整机软关机流程
power_set_callbacksdk/bsp/AC632N/board/board_demo.c注册低功耗进入/退出回调与软关机回调
board_set_soft_poweroffsdk/bsp/AC632N/board/board_demo.c板级软关机实现,负责关闭外设供电并配置唤醒源
rtc.c 唤醒处理sdk/bsp/AC632N/src/rtc.cRTC 驱动与闹钟中断处理,检查 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

这段代码揭示了"时基唤醒 + 软关机"组合的核心语义:

  1. RTC Alarm 到时 → 硬件唤醒 CPU → 进入 RTC 中断/唤醒处理。
  2. 检查电源管理标志 P2M_SOFTOFF(记录本次唤醒前系统处于软关机状态)。
  3. 若标志有效,说明"这次唤醒只是软关机期间的定时点",则立即调用 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: 定时任务触发软关机

关键点解读:

  1. 状态判定由 P2M_SOFTOFF 决定:它是区分"软关机定时唤醒"与"普通睡眠唤醒"的唯一依据,因此 rtc.c 中必须先读标志、再决定是否重入软关机,顺序不可颠倒。
  2. Alarm 是时基唤醒的载体:RTC 硬件在软关机状态下仍供电计时,Alarm 到时会拉起 CPU;这一"RTC 常供电"特性是整套机制与普通 GPIO 唤醒互补之处——GPIO 唤醒依赖外部事件,Alarm 唤醒依赖时间。
  3. 回调分层: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_SEL
    • enter_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 电源管理:见各外设驱动文档;充电/电池管理:见电源管理扩展主题页。
Prev
外设接口与驱动