CH58x 睡眠中 PB22/PB23 按键唤醒需要打开 RB_PIN_INTX

本文回答一个很具体的问题:CH58x/CH584F 进入睡眠后,RTC 到点能唤醒,PB22/PB23 上的 Boot 或 Reset 按键却没有反应,排查入口应该放在哪里。

结论先放在前面:如果按键接在 PB22/PB23,睡眠唤醒依赖 GPIO 中断线时,需要先打开 RB_PIN_INTX,把 INT24/INT25 映射到 PB22/PB23。

现象

设备已经进入低功耗睡眠,串口没有持续打印,RTC 到点后可以醒来并继续运行。这个现象说明睡眠路径、RTC 唤醒源、RAM 保持这几项基本有效。

异常点在按键:睡眠期间按 Boot/PB22 或 Reset/PB23 没有唤醒效果。代码里已经配置了 GPIO 输入、下降沿中断、GPIO 唤醒源,看起来像是 GPIO 唤醒没有生效。

这里最容易误判的一点是:运行时能读到 PB22/PB23 电平变化,不代表它们已经接到了睡眠唤醒需要的中断线。

原因

CH58x 这类芯片的 GPIO 中断能力需要看中断线分配。PB22/PB23 和 PB8/PB9 共用 INT24/INT25 这组中断线,默认位置在 PB8/PB9。

SDK 头文件里有两个关键信息:

所以只写:

GPIOB_ITModeCfg(GPIO_Pin_22, GPIO_ITMode_FallEdge);
GPIOB_ITModeCfg(GPIO_Pin_23, GPIO_ITMode_FallEdge);

还不够。没有打开重映射时,睡眠唤醒事件仍然落在 PB8/PB9 这一侧。PB22/PB23 可以作为普通输入读电平,却不能按预期触发睡眠唤醒。

后果

这个故障会给调试带来一个假象:RTC 能醒,所以低功耗入口看起来没问题;GPIO 运行时能读,所以按键硬件看起来也没问题。

实际缺口在“GPIO 引脚”和“唤醒中断线”之间。只查按键电路、上拉、下降沿、唤醒源开关,可能会绕过真正的配置项。

修复

按键初始化时,在配置 PB22/PB23 中断前打开 RB_PIN_INTX

GPIOPinRemap(ENABLE, RB_PIN_INTX);

GPIOB_ModeCfg(APP_BOARD_BUTTON_PIN, GPIO_ModeIN_PU);
GPIOB_ITModeCfg(APP_BOARD_BUTTON_PIN, GPIO_ITMode_FallEdge);

GPIOB_ModeCfg(APP_BOARD_RESET_PIN, GPIO_ModeIN_PU);
GPIOB_ITModeCfg(APP_BOARD_RESET_PIN, GPIO_ITMode_FallEdge);

PWR_PeriphWakeUpCfg(ENABLE,
                    RB_SLP_GPIO_WAKE | RB_GPIO_EDGE_WAKE | RB_SLP_RTC_WAKE,
                    Long_Delay);

如果设备只要求 RAM 保持,睡眠入口可以保留 RAM 域,醒来后恢复时钟和必要外设:

#define APP_BOARD_SLEEP_RETENTION_MASK (RB_PWR_RAM32K | RB_PWR_RAM96K)

LowPower_Sleep(APP_BOARD_SLEEP_RETENTION_MASK);

在这次板级验证中,LowPower_Sleep() 这条路径可以同时保留 RTC 和 GPIO 唤醒。LowPower_Sleep_WFE() 曾经只证明 RTC 能醒,没有证明 PB22/PB23 GPIO 唤醒可用。

预防

低功耗按键设计时,不要只按 GPIO 编号分配引脚。需要同时确认这几项:

对 PB22/PB23 这类复用中断脚,运行时读电平只能证明输入功能有效,不能证明睡眠唤醒链路完整。RTC 能醒、按键不醒时,优先查中断线映射。

本文由 AI 辅助生成,可能存在错误或遗漏,请以实际资料和官方文档为准。