LISA PM WiFi PS 与 AON Timer 周期唤醒示例

功能说明

本示例运行在 ARCS 双核 PM 模式下,演示 WiFi PS 与 AON Timer 同时启用时,系统进入自动轻睡眠,并由 AON Timer 每 5 秒周期唤醒。示例分别记录 AON Timer 业务回调和 LISA PM after_wake 唤醒源事件,用于验证两条通知链路均正常工作。

新特性

  • WiFi PS 共存:WiFi 连接并获得 IP 后启用 LISTEN 省电模式

  • 5 秒周期唤醒:AON Timer 以周期模式每 5000 ms 唤醒系统

  • 回调计数:AON Timer callback 递增计数,验证业务回调持续触发

  • 唤醒源事件:PM after_wake 打印 TIMER、WIFI 或 WIFI_DATA

硬件连接

本示例使用芯片内部 WiFi 和 AON Timer,无需额外接线。

串口日志使用 ARCS-EVB 默认调试串口,波特率为 921600。

测试环境准备

准备一个可连接的 2.4 GHz WiFi AP,并在 src/main.c 中修改:

#define TARGET_WIFI_SSID    "YOUR_WIFI_SSID"
#define TARGET_WIFI_PWD     "YOUR_WIFI_PASSWORD"

示例步骤

  1. AP 核从 flash 启动 CP,并在两核分别初始化 lisa_pm

  2. CP 初始化 WiFi、连接目标 AP 并获取 DHCP 地址

  3. 配置 AON Timer 为系统唤醒源并启动 5000 ms 周期定时器

  4. 启用 WiFi LISTEN PS 和 AUTO_LIGHT_SLEEP

  5. 每次唤醒后打印唤醒源、AON Timer callback 累计次数和本轮增量

编译

重要提示:编译前需要先确认当前示例支持的目标板型,然后将板型标识传给 -DBOARD。请按以下方式选择:

  1. 确认示例限制:查看当前示例 README 中的硬件连接和注意事项,确认是否限定板型。

  2. 参考示例配置:查看相关示例目录下的 sample.yaml,确认支持的板型。

  3. 填写板型标识:SDK 内置板型的标识为 boards/ 下的目录名。例如实际使用的板型目录为 boards/<板型名称>/,则编译参数填写为 -DBOARD=<板型名称>。

在 SDK 根目录执行编译,并将命令中的 <示例路径> 和 <板型名称> 替换为实际值。

Linux 使用 build.sh:

# 通用命令
./build.sh -C -S samples/<示例路径> -DBOARD=<板型名称>

# 示例:使用 arcs_evb 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_evb

Windows PowerShell 使用 build.ps1:

# 通用命令
.\build.ps1 -C -S samples/<示例路径> -DBOARD=<板型名称>

# 示例:使用 arcs_evb 开发板
.\build.ps1 -C -S samples/<示例路径> -DBOARD=arcs_evb

Note

确保已安装对应平台的工具链和 ListenAI 开发工具包。Windows 环境请先执行 .\env.ps1 或直接使用 .\build.ps1 自动加载环境。

注意事项:-DBOARD 填写的是板型标识,不是芯片系列名称。如果示例有板型专用配置或额外编译参数,以示例 README 中的说明为准。

也可在 SDK 根目录执行:

./build.sh -C -S samples/subsys/lisa_pm/wifi_ps_aon_timer -DBOARD=arcs_evb

烧录

本工程生成 AP、CP 两份固件,必须同时烧录:

./tools/burn/cskburn -s /dev/ttyUSB0 -b 3000000 \
    0x0       build/remote/ap.bin \
    0x100000  build/arcs.bin \
    -C arcs

预期输出

启动和联网阶段:

=== LISA PM dual core WiFi PS + 5s AON timer CP ===
lisa_wifi init done
WiFi connected
DHCP success on VIF-0: 192.168.x.x
WiFi connected and IP obtained
AON timer started: period=5000 ms count=... freq=... Hz
AUTO_LIGHT_SLEEP enabled (WiFi LISTEN interval=10)

AON Timer 周期唤醒时,callback 计数和 TIMER 唤醒源同时可见:

after_wake cause=TIMER aon_timer_cb=1 cb_delta=1
after_wake cause=TIMER aon_timer_cb=2 cb_delta=1
after_wake cause=TIMER aon_timer_cb=3 cb_delta=1

WiFi 提前唤醒时,可能先看到 WiFi 唤醒源;此时定时器 callback 不应错误增加:

after_wake cause=WIFI aon_timer_cb=3 cb_delta=0
after_wake cause=WIFI_DATA aon_timer_cb=3 cb_delta=0

核心 API

API

说明

lisa_pm_init()

初始化双核 LISA PM 与 HAL VRTC

lisa_pm_wifi_set_listen_interval()

在连接前设置 WiFi LISTEN 周期

lisa_hwtimer_set_callback()

注册 AON Timer 业务回调

lisa_hwtimer_configure_wakeup()

将 AON Timer 通道配置为系统唤醒源

lisa_device_wakeup_enable()

使能 AON Timer 唤醒能力

lisa_hwtimer_start()

以周期模式启动 5 秒 AON Timer

lisa_pm_sleep_callback_register()

注册 PM 唤醒源事件回调

lisa_pm_set_system_policy()

启用自动轻睡眠策略

关键代码

static void aon_timer_callback(void *user_data)
{
    volatile uint32_t *count = user_data;

    /* 回调可能运行在 PM 恢复关键路径,不执行日志或阻塞操作。 */
    (*count)++;
}

static void cp_after_wake(void *user_data, lisa_pm_wakeup_cause_t cause)
{
    uint32_t callback_count = g_aon_timer_callback_count;
    uint32_t callback_delta = callback_count - g_last_reported_callback_count;

    g_last_reported_callback_count = callback_count;
    LOGI("after_wake cause=%s aon_timer_cb=%lu cb_delta=%lu",
         wakeup_cause_str(cause), callback_count, callback_delta);
}

配置说明

配置

说明

CONFIG_LISA_PM=y

启用 LISA PM 框架和 HAL PM/VRTC

CONFIG_LISA_PM_CORE_PRIMARY=y

CP 作为 PM primary 和 VRTC owner

CONFIG_LISA_PM_DUAL_CORE=y

AP/CP 以双核运行模式协同休眠

CONFIG_LISA_HWTIMER_ARCS_AON_TIMER=y

启用 LISA AON Timer 设备

CONFIG_WIFI_LWIP_SAME_CORE=y

WiFi 与 LWIP 在 CP 侧运行

注意事项

  1. 回调上下文:AON Timer callback 只更新计数,不直接打印日志;日志统一在 PM after_wake 任务上下文输出。

  2. 周期验证:连续 TIMER 唤醒时应看到 cb_delta=1;WiFi 提前唤醒时通常为 cb_delta=0。

  3. WiFi 配置:LISTEN interval 必须在连接前设置,LISTEN PS 模式应在获得 IP 后启用。

  4. 双固件烧录:AP 和 CP 固件必须一起烧录,否则无法完成双核 PM 协同。

  5. 实板验证:示例依赖外部 WiFi AP,CI 仅执行构建;周期、callback 和唤醒源事件必须通过实板串口日志确认。