ZMK 电源管理行为实战:用 `ext_power` 控制外部电源(VCC)输出以节省电量
固件嵌入式智能硬件蓝牙【免费下载链接】zmkZMK Firmware Repository项目地址https://gitcode.com/gh_mirrors/zm/zmk点击查看免费下载本文以 ZMK 固件仓库中的电源管理行为文档docs/docs/keymaps/behaviors/power.md为核心系统讲解ext_power行为的工作原理、命令定义、keymap 绑定方法、状态持久化机制以及它在分体键盘上的全局生效特性。读完本文你将能够在自己的 keymap 中正确绑定启用、禁用、切换外部电源的命令并理解底层驱动是如何通过 GPIO 与设置子系统实现省电 断电记忆的完整链路。概述外部电源控制行为解决什么问题ZMK 的**外部电源控制行为External Power Control**允许通过 keymap 按键启用或禁用开发板上的VCC 电源输出从而节省电量。许多外设尤其是部分 LED即使在关闭状态下依然会持续耗电。对于这种情况部分主控板提供了完全切断外部电源的能力外部电源行为就是用来控制该电源输出的。它最适合的场景包括使用 RGB 灯带或状态 LED 的分体键盘在闲置或夜间希望彻底断电外接显示器OLED等外设不需要常开时在同一个按键位上切换供电与断电两种状态。目前官方文档明确列出支持该特性的板子有两款nRFMicronice!nano从仓库源码看这两款板子的 Devicetree overlay 中都定义了EXT_POWER节点例如 nice!nano 的 app/boards/nicekeyboards/nice_nano/nice_nano_nrf52840_zmk_2_0_0.overlay 与 nRFMicro 的 app/module/boards/joric/nrfmicro/nrfmicro_nrf52840_1_1_0.overlay 中均包含EXT_POWER { compatible zmk,ext-power-generic; control-gpios gpio0 13 GPIO_ACTIVE_HIGH; init-delay-ms 50; };control-gpios指定了用于开启/关闭外部电源的 GPIOinit-delay-ms为驱动初始化后的延迟毫秒数。命令定义dt-bindings/zmk/ext_power.h外部电源控制命令的宏定义位于头文件 app/include/dt-bindings/zmk/ext_power.h。要在 keymap 中使用这些命令需要在 keymap 文件顶部加入#include dt-bindings/zmk/ext_power.h例如仓库中 lily58 的 keymap app/boards/shields/lily58/lily58.keymap 就在文件头部同时引入了behaviors.dtsi和dt-bindings/zmk/ext_power.h随后在绑定列表中直接使用ext_power EP_ON等写法。引入该头文件后就可以引用其中定义的动作例如EXT_POWER_OFF_CMD。各宏定义及别名如下DefineActionAliasEXT_POWER_OFF_CMDDisable the external power.EP_OFFEXT_POWER_ON_CMDEnable the external power.EP_ONEXT_POWER_TOGGLE_CMDToggle the external power.EP_TOG在源码中这些宏被定义为一组连续的整数值app/include/dt-bindings/zmk/ext_power.h#define EXT_POWER_OFF_CMD 0 #define EXT_POWER_ON_CMD 1 #define EXT_POWER_TOGGLE_CMD 2 #define EP_ON EXT_POWER_ON_CMD #define EP_OFF EXT_POWER_OFF_CMD #define EP_TOG EXT_POWER_TOGGLE_CMD也就是说EP_ON、EP_OFF、EP_TOG与EXT_POWER_ON_CMD、EXT_POWER_OFF_CMD、EXT_POWER_TOGGLE_CMD是完全等价的两个名字keymap 中既可以写长名字也可以写短别名。行为绑定ext_powerext_power行为的绑定方式如下Referenceext_powerParameter#1命令Command例如EP_ON该行为的 Devicetree 定义位于 app/dts/behaviors/ext_power.dtsi并被 app/dts/behaviors.dtsi 统一引入ext_power: extpower { compatible zmk,behavior-ext-power; #binding-cells 1; display-name External Power; };其中#binding-cells 1表示该行为在 keymap 中需要且仅需要一个绑定参数这个参数就是上表中的命令0/1/2。行为节点名被刻意设计为不超过 8 个字符的extpower以便在分体键盘外设端也能被引用。绑定到按键的标准写法ext_power EP_ON也可以使用完整命令名ext_power EXT_POWER_ON_CMD三种命令的完整示例1. 行为绑定启用外部电源ext_power EP_ON2. 行为绑定禁用外部电源ext_power EP_OFF3. 行为绑定切换外部电源ext_power EP_TOG仓库中 lily58 的 keymapapp/boards/shields/lily58/lily58.keymap提供了一个同时使用三种命令的完整实例trans ext_power EP_ON ext_power EP_OFF ext_power EP_TOG trans ...即将外部电源开、关、切换分别绑定在相邻的三个按键位上便于实时控制供电状态。底层实现按下时如何执行命令ext_power行为的 C 实现位于 app/src/behaviors/behavior_ext_power.c。它在按下回调on_keymap_binding_pressed中通过device_get_binding(EXT_POWER)获取外部电源设备然后根据参数执行对应操作app/src/behaviors/behavior_ext_power.cswitch (binding-param1) { case EXT_POWER_OFF_CMD: return ext_power_disable(ext_power); case EXT_POWER_ON_CMD: return ext_power_enable(ext_power); case EXT_POWER_TOGGLE_CMD: if (ext_power_get(ext_power) 0) return ext_power_disable(ext_power); else return ext_power_enable(ext_power); default: LOG_ERR(Unknown ext_power command: %d, binding-param1); }需要特别注意的是EXT_POWER_TOGGLE_CMD是状态相关命令切换目标取决于当前电源状态。ZMK 通过binding_convert_central_state_dependent_params回调app/src/behaviors/behavior_ext_power.c在触发时先把 TOGGLE 命令换算成明确的 ON 或 OFF 命令if (binding-param1 EXT_POWER_TOGGLE_CMD) { binding-param1 ext_power_get(ext_power) 0 ? EXT_POWER_OFF_CMD : EXT_POWER_ON_CMD; }同时行为在释放回调on_keymap_binding_released中返回ZMK_BEHAVIOR_OPAQUEapp/src/behaviors/behavior_ext_power.c表示该行为只在按下时生效释放时不产生额外动作——因此它适合绑定在普通按键位按下即执行、松开无副作用。这些ext_power_enable/ext_power_disable/ext_power_get调用通过驱动 APIapp/include/drivers/ext_power.h分发到具体驱动实现enable将控制 GPIO 置为有效电平disable置为无效电平get返回当前开关状态1 表示开启0 表示关闭。状态持久化断电与重刷固件后仍能记住开关状态:::note[外部电源状态持久化] 由ext_power行为设置的开关状态会被保存到闪存存储即 ZMK 的 settings 子系统因此在重启和重新刷写固件后仍然保持。不过为了避免对闪存造成不必要的磨损状态只会在CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE毫秒之后才被真正写入。 :::具体实现位于 app/src/ext_power_generic.c每次enable/disable都会把新状态写进ext_power/state/设备名设置项并使用一个可延迟工作项做防抖int ext_power_save_state(void) { int ret k_work_reschedule(ext_power_save_work, K_MSEC(CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE)); return MIN(ret, 0); }当 settings 子系统提交时驱动会根据已保存的状态恢复 GPIO 电平app/src/ext_power_generic.c如果从未保存过任何状态首次启动则默认启用外部电源static int ext_power_settings_commit() { ... if (!data-settings_init) { >enum behavior_locality { BEHAVIOR_LOCALITY_CENTRAL, // 仅在 central 处理 BEHAVIOR_LOCALITY_EVENT_SOURCE, // 仅在触发来源侧处理 BEHAVIOR_LOCALITY_GLOBAL // 全局生效 };ext_power行为的驱动 API 将.locality设置为BEHAVIOR_LOCALITY_GLOBALapp/src/behaviors/behavior_ext_power.c。在 central 侧的分发逻辑中app/src/behavior.c全局行为会先向所有已连接的外设广播执行再在本地执行case BEHAVIOR_LOCALITY_GLOBAL: for (int i 0; i ZMK_SPLIT_CENTRAL_PERIPHERAL_COUNT; i) { zmk_split_central_invoke_behavior(i, binding, event, pressed); } return invoke_locally(binding, event, pressed);这也解释了文档中全局生效的含义无论按键绑在外设侧还是 central 侧外部电源的开关都会同步作用于整把键盘非常适合分体键盘统一控制 LED/外设供电。关于 locality 机制的完整讨论可参考分体键盘特性文档中的 Global Locality Behaviors 一节其中同样把 power management behaviors 列为全局行为之一。实践要点速查在 keymap 顶部#include dt-bindings/zmk/ext_power.h即可使用EP_ON/EP_OFF/EP_TOG使用ext_power行为时参数 #1 必填值为上述三种命令之一行为只在按下时执行释放无副作用适合直接绑定普通按键开关状态通过 ZMK settings 子系统持久化ext_power/state/设备名默认在变更后CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE默认 60000 ms写入闪存分体键盘上该行为是全局行为一次触发同时作用于 central 与 peripheral仅当板级 Devicetree 中存在EXT_POWER节点compatible zmk,ext-power-generic时该行为才真正可用官方支持的板子为 nRFMicro 与 nice!nano配置驱动属性可参考电源管理配置文档中的 External Power Control 一节。赞分享固件嵌入式智能硬件蓝牙【免费下载链接】zmkZMK Firmware Repository项目地址https://gitcode.com/gh_mirrors/zm/zmk点击查看免费下载相关推荐ZMK 电源管理配置完全指南低功耗状态、外部电源控制与软关机唤醒ZMK 电源管理配置完全指南低功耗状态、外部电源控制与软关机唤醒 本篇指南以 ZMK 固件仓库的 电源管理配置文档 https://link.gitcode.固件嵌入式智能硬件蓝牙Electron Fiddle电源管理控制应用电源使用Electron Fiddle电源管理控制应用电源使用 为什么需要电源管理 在开发桌面应用时电源管理常被忽视却至关重要。想象以下场景视频会议应用在电脑休桌面应用开发工具代码编辑器ZMK 固件状态报告第三期键位码体系重构、外部电源控制与输出选择的技术演进ZMK 固件状态报告第三期键位码体系重构、外部电源控制与输出选择的技术演进 本期内容以 ZMK 官方《State Of The Firmware 3》博客固件嵌入式智能硬件蓝牙上一篇在 KernelSU 上跑通 LSPosedZygiskNext 完整部署避坑指南下一篇Docker-Mailserver反垃圾策略构建多层次防御体系的终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

G-Helper 上手指南:3 步装好,1 个进程管全华硕笔记本的性能、显卡与电池

G-Helper 上手指南:3 步装好,1 个进程管全华硕笔记本的性能、显卡与电池

G-Helper 上手指南:3 步装好,1 个进程管全华硕笔记本的性能、显卡与电池 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, P…

2026/10/13 5:55:39 阅读更多 →
OHIF Viewers basic-dev-mode 模式包演进史:从 CHANGELOG 到源码的完整技术解析

OHIF Viewers basic-dev-mode 模式包演进史:从 CHANGELOG 到源码的完整技术解析

医疗健康前端音视频 【免费下载链接】Viewers OHIF zero-footprint DICOM viewer and oncology specific Lesion Tracker, plus shared extension packages 项目地址: https://gitcode.com/GitHub_Trending/vi/Viewers 点击查看 免费下载 ohif/mode-basic-dev-mode…

2026/10/13 5:55:39 阅读更多 →
REA 逆向选型三步走:.hop、Windows PE 与 DOS MZ 各走哪条通道?

REA 逆向选型三步走:.hop、Windows PE 与 DOS MZ 各走哪条通道?

REA 逆向选型三步走:.hop、Windows PE 与 DOS MZ 各走哪条通道? 【免费下载链接】rea Reverse engineer anything with agents, from app behavior down to native binaries. 项目地址: https://gitcode.com/GitHub_Trending/rea2/rea REA 是一个…

2026/10/13 5:55:39 阅读更多 →

最新新闻

FPGA入门必做:可逆计数器设计详解与上板调试

FPGA入门必做:可逆计数器设计详解与上板调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 6:41:49 阅读更多 →
外贸企业如何借助社交媒体拓展海外市场

外贸企业如何借助社交媒体拓展海外市场

一、行业现状:海外社交媒体成为外贸获客新渠道近年来,随着数字技术的发展和全球消费习惯的变化,海外社交媒体已不再仅仅是个人社交娱乐的平台,而是逐步成为外贸企业触达海外客户、展示品牌形象、获取商业询盘的重要渠道。Facebook…

2026/10/13 6:41:49 阅读更多 →
Modbus TCP设备通信代码

Modbus TCP设备通信代码

一、核心前置知识点:Modbus TCP协议帧格式(必考背诵)1.1 请求报文(Rx 读取请求帧)帧示例:00 01 00 00 00 06 01 03 00 00 00 04字节段含义说明00 01事务ID(Transaction ID)请求与响应必须一致,用…

2026/10/13 6:41:49 阅读更多 →
Apache Calcite 1.4.0-incubating 发布解析:RelBuilder 关系代数构建器 API 的诞生

Apache Calcite 1.4.0-incubating 发布解析:RelBuilder 关系代数构建器 API 的诞生

后端数据库 【免费下载链接】calcite Apache Calcite 项目地址: https://gitcode.com/gh_mirrors/ca/calcite 点击查看 免费下载 2015 年 9 月 2 日,Apache Calcite(Incubating)发布 1.4.0-incubating 版本,这一版本在…

2026/10/13 6:41:49 阅读更多 →
Peekaboo 实时多目标认证协调器:双后台控制器与前台语义重叠的行为契约全解析

Peekaboo 实时多目标认证协调器:双后台控制器与前台语义重叠的行为契约全解析

GUI 自动化MCP 服务AI 应用 【免费下载链接】Peekaboo Peekaboo is a macOS CLI & optional MCP server that enables AI agents to capture screenshots of applications, or the entire system, with optional visual question answering through local or remote AI mod…

2026/10/13 6:41:49 阅读更多 →
链栈实验避坑指南:头歌数据结构实训全解析

链栈实验避坑指南:头歌数据结构实训全解析

简介:头歌数据结构链栈基本操作与应用学习资料包,面向正在学习数据结构与C实现的学生,以链栈这一动态栈结构为主线展开讲解。内容详细梳理链表节点定义、链栈结构体设计,以及初始化、销毁、清空、判空、求长、取栈顶、入栈、出栈、…

2026/10/13 6:40:49 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →