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
相关产品推荐
相关产品推荐

