GPIO 待机使用说明*
SDK 位置
概述*
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 指示灯
待机流程*
- 长按待机按键(GPIO2),触发
_standbyKeyLongPressHandler回调 - 发送 App 事件
233,进入待机流程 - LED(GPIO4)闪烁 3 次,提示用户系统即将进入待机
- 将不使用的管脚设置为输入状态以降低漏电流
- 调用
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()恢复复用状态
参考文档*
- 低功耗下唤醒触发机制 — 了解 PMU_CTRL 模块及更多唤醒方式