4. GPIO与低功耗按键唤醒设计

在电池供电的物联网终端中,MCU 大部分时间应处于 Deep Sleep(深度睡眠)状态,只有按键等外部事件到来时才短暂唤醒处理。RA 系列 MCU 的 GPIO 与 ICU(中断控制单元)配合,可以把按键直接接到某个 IRQ 引脚上,让 CPU 在睡眠中保持“零执行”,由外设完成边沿检测并触发唤醒。本节围绕“配置 GPIO 输入输出 → 配置外部中断 → 进入 Deep Sleep → 按键唤醒 → 测量待机电流 → 优化上下拉电阻”这条主线展开,重点讲清每一步实际怎么做,以及如何用电流数据判断设计是否合理。

一、GPIO 输入输出与按键接口

RA 的 GPIO 通过 PORT 外设寄存器控制,每个引脚有 PmnPFS(引脚功能选择)、PmnPMR(外设功能)、PmnPDR(方向)、PmnPCR(输入上拉)等寄存器。按键作为输入时,典型配置是:方向设为输入(PDR=0)、功能设为 GPIO(PMR=0)、按需使能内部上拉(PCR=1)。若使用 FSP,可在 Smart Configurator 中把引脚配置为 Input Mode,并勾选 Pull-up,生成的代码会调用 R_IOPORT_PinCfg() 完成设置。

按键电路有两种常见接法:按键一端接引脚、另一端接 GND,此时引脚需要上拉,按下读到低电平;或者按键一端接引脚、另一端接 VCC,此时引脚需要下拉,按下读到高电平。RA 的 GPIO 内部上拉电阻典型值为 20 kΩ~50 kΩ(以数据手册为准),下拉能力通常较弱或需要外部电阻,因此低功耗按键设计更常用“上拉到 VCC + 按键接地”的方式。

二、外部中断与唤醒源配置

要让按键唤醒 Deep Sleep,必须把按键引脚映射到 IRQ 通道。RA 的 IRQn 可分配到指定引脚,通过 R_ICU_ExternalIrqOpen() 配置触发边沿(上升沿、下降沿或双边沿)、数字滤波和回调函数。按键按下通常产生下降沿,因此选择 FALLING;若希望按下和松开都能唤醒,可选 BOTH_EDGE,但会增加唤醒次数和功耗。

配置完成后,需要把该 IRQ 设为唤醒源。在 FSP 中,进入 Deep Sleep 前调用 R_LPM_LowPowerModeEnter(),并确保 ICU 中断未被屏蔽、NVIC 中对应 IRQ 已使能。唤醒后,程序从 R_LPM_LowPowerModeEnter() 之后继续执行,可在回调中置位标志,主循环再处理按键逻辑。注意:Deep Sleep 下 CPU 时钟停止,但 ICU 和部分外设仍可工作,这正是按键唤醒的硬件基础。

RA GPIO 按键唤醒 Deep Sleep 信号链与电流测量 按键接口电路 R_pu 按键 SW GND 按下 → 引脚拉低 IRQ 边沿 RA MCU 内部 ICU 边沿检测 NVIC 中断使能 LPM 模块:Deep Sleep 控制 待机电流测量 μA 表 / 电流探头 示波器看唤醒脉冲 配置与验证流程 ① GPIO 配置 输入 + 上拉 ② IRQ 配置 下降沿触发 ③ 进入 Deep Sleep LPM 模块 ④ 按键唤醒 + 测电流 记录 μA 值 若电流偏大 → 优化上拉电阻 / 关闭未用外设 示例参数:R_pu = 20 kΩ~50 kΩ(内部),按键按下电流 ≈ VCC / R_pu;Deep Sleep 目标 < 5 μA(不含上拉)

三、进入 Deep Sleep 与唤醒处理

RA 的低功耗模式由 LPM 模块管理。Deep Sleep 下,CPU 和大部分外设时钟停止,SRAM 保持,唤醒源包括 IRQ、LVD、RTC 等。进入前应关闭不用的外设时钟(如 ADC、SCI),把未使用引脚设为输出低或输入上拉,避免浮空输入造成漏电。典型代码结构如下:

/* 配置按键引脚为输入上拉 */
R_IOPORT_PinCfg(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_00,
                IOPORT_CFG_PORT_DIRECTION_INPUT | IOPORT_CFG_PULLUP_ENABLE);

/* 配置 IRQ 下降沿触发 */
external_irq_cfg.irq_edge = EXTERNAL_IRQ_EDGE_FALLING;
R_ICU_ExternalIrqOpen(&g_external_irq_ctrl, &external_irq_cfg);
R_ICU_ExternalIrqEnable(&g_external_irq_ctrl);

/* 进入 Deep Sleep,等待按键唤醒 */
R_LPM_LowPowerModeEnter(&g_lpm_ctrl);

/* 唤醒后继续执行 */
if (g_key_pressed) {
    g_key_pressed = false;
    /* 处理按键事件 */
}

唤醒后,ICU 中断标志需要清除,否则会反复触发。FSP 的回调函数中通常调用 R_ICU_ExternalIrqCallback() 并置位用户标志。若使用双边沿触发,还要在回调中判断当前电平,区分按下和松开。

四、待机电流测量与上拉电阻优化

测量待机电流时,把万用表或电流探头串入 MCU 的 VCC 供电回路,注意量程切换到 μA 档。先让系统进入 Deep Sleep,等待电流稳定后读数。示例目标:不含上拉电阻时,RA 系列 Deep Sleep 电流通常在 1 μA~5 μA 量级;若按键上拉电阻为 20 kΩ 且按键未按下,上拉支路本身不耗电,但引脚若被外部拉低则会持续消耗 VCC/R_pu。例如 3.3 V / 20 kΩ ≈ 165 μA,这远大于睡眠电流,因此按键不应长期处于按下状态,或应改用更大阻值上拉。

优化方向有三点:第一,把内部上拉改为外部 100 kΩ~1 MΩ 上拉,按下时电流降至 3.3 μA~33 μA;第二,若按键只在唤醒瞬间需要,可在唤醒后把引脚重新配置为无上拉输入,处理完再恢复;第三,检查是否有其他引脚浮空或外设未关,这些往往是“睡眠电流偏大”的真正原因。测量时建议同时用示波器观察唤醒脉冲宽度,确认 MCU 确实进入了 Deep Sleep 而不是停留在普通 Sleep。

判断依据:若 Deep Sleep 电流明显高于数据手册典型值,优先排查未使用引脚状态、外部上拉支路和调试接口(SWD)是否仍使能。SWD 引脚在睡眠中若保持连接,可能引入额外漏电。

五、可直接使用的配置检查表

检查项目标状态验证方法
按键引脚方向输入(PDR=0)读 PmnPDR 寄存器
上拉配置按需使能(PCR=1)读 PmnPCR 寄存器
IRQ 触发边沿下降沿或双边沿示波器看引脚波形
NVIC 中断使能对应 IRQn 已使能读 NVIC ISER
未使用引脚输出低或输入上拉逐个检查 PORT 配置
Deep Sleep 电流目标 < 5 μA(不含上拉)μA 表串入 VCC
唤醒响应按键后 1 ms 内恢复执行GPIO 翻转 + 示波器

把以上配置落实到工程中,按键唤醒 Deep Sleep 的链路就完整了:GPIO 输入上拉保证按键有确定电平,IRQ 边沿检测把物理动作转成中断,LPM 让 CPU 停机,唤醒后回调处理事件。待机电流的优化不是一次完成,而是“测量—定位—改电阻/关外设—再测量”的迭代过程,最终让整机在纽扣电池下获得可接受的续航。