You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

nRF52840 DK基于Zephyr的深度睡眠异常及GPIO唤醒问题求助

nRF52840 DK(Zephyr)深度睡眠异常及GPIO唤醒失败问题

问题详情

  • 设备活跃阶段电流约500μA,但调用sys_poweroff()进入深度睡眠后电流飙升至2550μA,功耗异常升高。
  • GPIO上升沿中断无法唤醒设备,尽管数据记录仪已捕获到中断信号。

相关代码

主函数片段

app main()
{
...
...
gpio_pin_interrupt_configure_dt(&intr_specs, GPIO_INT_EDGE_RISING);
// k_msleep(1000);
pm_device_action_run(cons, PM_DEVICE_ACTION_TURN_OFF);
pm_device_action_run(i2c1_dev, PM_DEVICE_ACTION_TURN_OFF);
pm_device_action_run(uart_dev, PM_DEVICE_ACTION_TURN_OFF);
pm_device_action_run(fs.flash_device, PM_DEVICE_ACTION_TURN_OFF);
// NRF_GPIOTE->EVENTS_PORT = 0;
// NRF_POWER->SYSTEMOFF = 1;
sys_poweroff();
}

prj.config 配置

CONFIG_GPIO=y
CONFIG_GPIO_INIT_PRIORITY=60
CONFIG_I2C=y
CONFIG_LOG=y
CONFIG_STDOUT_CONSOLE=y
CONFIG_CRC=y
CONFIG_PM=n
CONFIG_PM_DEVICE=y
CONFIG_POWEROFF=y
CONFIG_CBPRINTF_FP_SUPPORT=y
CONFIG_LOG_DEFAULT_LEVEL=3
CONFIG_SERIAL=y
CONFIG_UART_ASYNC_API=y
CONFIG_UART_0_INTERRUPT_DRIVEN=n
CONFIG_UART_0_ASYNC=y
CONFIG_FLASH=y
CONFIG_NVS=y
CONFIG_LOG_MODE_IMMEDIATE=y
CONFIG_NVS_LOG_LEVEL_DBG=y
CONFIG_REBOOT=y
CONFIG_MPU_ALLOW_FLASH_WRITE=y
CONFIG_BT=y
CONFIG_BT_PERIPHERAL=y
CONFIG_BT_DEVICE_NAME="BT-MT"
CONFIG_BT_DEVICE_APPEARANCE=0
CONFIG_BOOTLOADER_MCUBOOT=y

排查与修复方案

1. 启用电源管理框架

当前CONFIG_PM=n直接禁用了Zephyr核心电源管理功能,导致sys_poweroff()无法正确触发低功耗流程,必须开启:

CONFIG_PM=y
CONFIG_PM_SLEEP_STATES=y
CONFIG_PM_STATE_SLEEP_3=y  # 对应nRF52840的深度睡眠模式

2. 配置GPIO为唤醒源

仅设置GPIO中断不足以唤醒深度睡眠系统,需将其标记为唤醒源,在代码中添加:

// 配置中断后启用唤醒功能
if (pm_device_wakeup_enable(intr_specs.port, true) != 0) {
    // 按需处理错误
}

也可在设备树中给对应GPIO节点添加wakeup-source属性实现相同效果。

3. 修正睡眠调用逻辑

sys_poweroff()是系统关机操作,并非可唤醒的低功耗睡眠。若要进入可唤醒的深度睡眠,应替换为:

pm_system_suspend();

或

k_sleep(K_FOREVER);

原代码中注释的NRF_POWER->SYSTEMOFF = 1是硬件级关机,同样无法被GPIO中断唤醒。

4. 解决蓝牙模块功耗问题

配置中开启了蓝牙但未启用睡眠模式,蓝牙模块持续运行会大幅拉高功耗,需添加:

CONFIG_BT_SLEEP=y

5. 关闭调试相关功能

  • CONFIG_LOG_MODE_IMMEDIATE=y会强制日志实时输出,阻止系统进入深度睡眠,低功耗测试时建议关闭日志:
CONFIG_LOG=n
  • 测试时断开J-Link,调试器连接会额外增加系统功耗,影响测量准确性。

6. 移除手动外设断电操作

启用PM框架后,系统会自动管理外设电源,手动调用pm_device_action_run()可能导致时序冲突,建议删除这些调用。

内容的提问来源于stack exchange,提问作者HARSH SHAH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 08:27:27