# LISA PM GPIO 深度睡眠示例 ## 功能说明 本示例使用 **GPIOB9 / PB09** 作为低电平有效的 AON 唤醒源。GPIO 配置为输入上拉,通过 GPIO 设备的 PM wakeup 能力启用唤醒,再设置 `LISA_PM_SYSTEM_POLICY_DEEP_SLEEP` 同步进入 PMU `MODE2`。将 PB09 拉低后芯片复位重启, 启动日志显示 GPIO 唤醒及引脚索引。 ## 硬件连接 - **PB09 / GPIOB9**: AON GPIO 唤醒输入,低电平有效。 - PB09 已连接低电平有效按键;进入睡眠前保持松开,需要唤醒时按下按键。 ## 示例内容 1. 首次启动调用 `lisa_pm_init()`,读取并打印上一次唤醒原因。 2. 将 GPIOB9 配置为普通输入上拉。 3. 调用 `lisa_gpio_configure_wakeup()` 配置 `LEVEL_LOW`,再调用 `lisa_device_wakeup_enable()` 启用 GPIOB9 AON 唤醒。 4. 调用 `lisa_pm_set_system_policy(LISA_PM_SYSTEM_POLICY_DEEP_SLEEP)` 同步进入深度睡眠。 5. 按下 PB09 按键触发 GPIO 唤醒,芯片复位重启后日志显示 `GPIO index=9`。 ## 编译 ```{eval-rst} .. include:: /sample_build.rst ``` 也可以直接执行: ```bash ./build.sh -C -S samples/subsys/lisa_pm/deep_sleep/gpio -DBOARD=arcs_evb ``` ## 烧录 ```{eval-rst} .. include:: /sample_flash.rst ``` ## 预期输出 首次启动: ```text === lisa_pm deep sleep GPIO === boot wakeup cause=UNKNOWN gpio_index=-1 GPIOB9 LEVEL_LOW wakeup enabled; keep pin high before sleep entering deep sleep MODE2; drive GPIOB9 low to wake ``` 唤醒重启后: ```text === lisa_pm deep sleep GPIO === boot wakeup cause=GPIO gpio_index=9 GPIOB9 LEVEL_LOW wakeup enabled; keep pin high before sleep entering deep sleep MODE2; drive GPIOB9 low to wake ``` ## 核心 API | API | 说明 | | --- | --- | | `lisa_pm_init()` | 初始化 PM,并捕获启动阶段的 AON 唤醒原因 | | `lisa_pm_get_wakeup_cause()` | 查询上一次启动唤醒原因 | | `lisa_pm_get_wakeup_gpio_index()` | 查询唤醒 GPIO 引脚索引 | | `lisa_gpio_configure()` | 将 GPIOB9 配置为输入上拉 | | `lisa_gpio_configure_wakeup()` | 配置 GPIOB9 为低电平有效唤醒 | | `lisa_device_wakeup_enable()` | 向 PMU 下发并启用 GPIOB9 唤醒源 | | `lisa_pm_set_system_policy()` | 同步进入 `PMU_SLEEPMODE_MODE2` 深度睡眠 | ## 关键代码 ```c /* 将 PB09 配置为输入上拉和低电平唤醒 */ lisa_gpio_configure(gpio, GPIO_WAKE_PIN, LISA_GPIO_INPUT | LISA_GPIO_PULL_UP); lisa_gpio_configure_wakeup(gpio, GPIO_WAKE_PIN, LISA_GPIO_WAKEUP_LEVEL_LOW); lisa_device_wakeup_enable(gpio, true); /* 同步进入 PMU MODE2,成功后不会返回 */ lisa_pm_set_system_policy(LISA_PM_SYSTEM_POLICY_DEEP_SLEEP); ``` ## 注意事项 1. **引脚范围**: ARCS PMU 只支持 GPIOB0 至 GPIOB9;本示例固定使用 GPIOB9。 2. **有效电平**: PB09 必须在进入睡眠时保持高电平,否则会立即满足低电平唤醒条件。驱动会将示例的 `LISA_GPIO_PULL_UP` 同步为 AON `HAL_IOMUX_PULLUP_MODE`,使 MODE2 期间的空闲电平保持稳定。 3. **唤醒滤波**: AON `GPIO_DB_CNT` 使用默认值 `100`,PB09 低电平必须连续保持 `101` 个 32 KHz 时钟周期(约 `3.08 ms`)才会唤醒。 4. **AON 配置**: GPIO 驱动使用 `AON_IOMuxManager_PinConfigure()` 下发 PB09 唤醒路由,对应 `cfg=1`。 5. **一次性入口**: 深度睡眠成功进入后函数不会返回,唤醒由芯片复位流程重新启动应用。