跳转至

GPIO 待机使用说明*

概述*

gpio_standby_v2 是一个基于 GPIO 中断的低功耗待机 App。通过长按指定按键使系统进入待机模式,待机后可通过 GPIO 中断快速唤醒,实现极低功耗运行。

APP使用说明*

固件编译:

cp configs/example/standby/gx8002b_dev_v1_4_key2_long_press_standby.config .config
make defconfig
make clean;make # 固件输出在output/mcu_nor.bin 烧录到板子即可

固件效果:

  • 待机功能由 App 自行控制,无需额外配置开关。
  • 在gx8002b_dev_v1_4板体验
    • 通过长按(500ms)按键key2进入低功耗,这时led2将闪烁,停止输出日志
    • 再次长按(约3s)将退出休眠,重新输出日志

App 工作原理*

GPIO 初始化*

  • GPIO2 作为待机按键,默认高电平(上拉),配置为下降沿触发中断
  • GPIO4 作为 LED 指示灯,用于待机前闪烁提示
#define STANDBY_KEY_PIN     2   // 待机按键
#define LED_PIN             4   // LED 指示灯

待机流程*

  1. 长按待机按键(GPIO2),触发 _standbyKeyLongPressHandler 回调
  2. 发送 App 事件 233,进入待机流程
  3. LED(GPIO4)闪烁 3 次,提示用户系统即将进入待机
  4. 将不使用的管脚设置为输入状态以降低漏电流
  5. 调用 LvpPmuSuspend(LRT_GPIO) 进入低功耗,系统挂起

唤醒恢复流程*

硬件按键默认高电平(上拉)。GPIO 中断唤醒后,AppResume 中判断按键状态:

  • 长按恢复(约 3 秒):按键电平持续为低超过约 3 秒,则真正恢复运行,LED 闪烁 3 次提示,重新初始化管脚
  • 短按释放:按键在约 3 秒内释放(电平恢复为高),则重新进入待机
static int GpioStandbyV2AppResume(void *priv)
{
    BoardSetUserPinMux();
    uint32_t count = 0;
    while (_readStandbyKeyValue() == 0) {
        count++;
        if (count > 2000) {
            _led_tip();
            return 0;
        }
    }
    if (count < 2000) {
        LvpPmuSuspend(LRT_GPIO);
    }
    return 0;
}

长按时间配置

  • 按键通过 multi_button 组件实现
  • 修改进入休眠长按时间可修改 lvp/common/peripherals/multi_button/src/multi_button.h 中 #define LONG_TICKS (500 /TICKS_INTERVAL) 大小实现
    • TICKS_INTERVAL 默认为 5ms,则 LONG_TICKS 中 500 的含义为 500ms
  • 修改退出休眠时间可修改 GpioStandbyV2AppResume() count 值大小,或自行使用其它方式实现

功耗表现*

项目 电压 待机电流
Core 1.2 V 35.9 µA
IO 3.0 V 8.5 µA

测试环境

  • 测试固件使用当前说明的配置 + app进行编译
  • 进入低功耗模式,仅保留 GPIO 唤醒
  • 若自己将app修改打开了其它模块,进入休眠时未关闭,功耗可能无法对齐,需自行测试确定

关键 API 说明*

API 说明
LvpPmuSuspend(LRT_GPIO) 进入低功耗模式,仅保留 GPIO 唤醒
gx_gpio_enable_trigger(pin, trigger, cb, data) 配置 GPIO 中断触发,设置唤醒源
BoardSetPowerSavePinMux() 待机前将不使用的管脚设置为输入状态,降低功耗
BoardSetUserPinMux() 唤醒后恢复用户管脚配置

按键组件集成*

该 App 使用了 multi_button 组件实现按键检测:

static Button standby_key;

button_init(&standby_key, _readStandbyKeyValue, 0);
button_attach(&standby_key, LONG_PRESS_START, _standbyKeyLongPressHandler);
button_start(&standby_key);

注意

按键 必须 配置为 GPIO 中断模式才能唤醒系统。即使不使用 multi_button 组件,也需要调用 gx_gpio_enable_trigger() 注册中断处理函数。

注意

  • 进入待机前应将不使用的管脚设为输入状态(通过 BoardSetPowerSavePinMux()),这是降低待机功耗的关键步骤。
  • 退出待机时使用 BoardSetUserPinMux() 恢复复用状态

参考文档*