Zmk Project Init

SKILL待分类
待分类 未标注权限 许可证不明确

Initialize a ZMK keyboard firmware project. Invoke when user wants to create a new ZMK-based wireless/wired keyboard project, add a custom shield, or set up ZMK development environment.

一句话选型结论

按资料字段整理

Zmk Project Init是待分类类的 Agent Skill,安装方式:GitHub 仓库,权限级别未标注,许可证不明确,没有现成安装命令,需按说明手动放置 SKILL.md。技能本质是给模型读的说明书,效果取决于模型与客户端;装完先用一个小任务验证,再放进正式流程。

分类待分类 安装方式GitHub 仓库 权限级别未标注权限 许可证许可证不明确
累计安装 未标注 本周 未标注
GitHub 星标 未标注 仓库 embedded_ai_skills
下载量 未标注 技能市场下载数
权限级别 未标注权限 安装前请确认风险范围
许可证 许可证不明确 未说明

安装

GitHub 仓库
在支持 Skills 的客户端里执行,装完问一句「你有哪些技能」验证
  1. 1
    确认客户端支持

    确认你的客户端支持 Skills(Claude、Codex、Cursor 等),并升级到较新的版本。

  2. 2
    拿到技能文件

    按安装说明或仓库 README,把 SKILL.md 放到客户端的 skills 目录(一般一个技能一个文件夹)。

  3. 3
    刷新技能列表

    重新打开客户端,或刷新技能列表,让新放进来的技能被加载。

  4. 4
    验证是否生效

    问一句「你有哪些技能」,确认列表里出现它,再拿一个小任务试跑。

技能档案

待分类
字段来自技能仓库与公开索引,中文说明由本站标注
作者 / 维护方kukucaicndy仓库 embedded_ai_skills · 版本 未标注
宿主客户端未标注技能可被这些客户端加载
安装方式GitHub 仓库安装包 kukucaicndy/embedded_ai_skills
权限级别未标注权限安装前请确认风险范围
许可证未说明许可证不明确,商用前请自行确认条款
仓库可用性available技能仓库当前是否可访问
最近核验未标注上游最后核验时间 · 数据更新 2026-07-16
正文体量22.2 KBSKILL.md 原文大小,越大说明说明书写得越细

典型使用场景

3 类
按分类整理的常见用法,具体以 SKILL.md 为准
探索新能力

先试一类新技能能做什么。

当通用助手

让模型按说明书处理常见任务。

补齐模型缺的技能

给模型补上它原本没有的做法。

选择建议

装之前先看这几条
按条目字段给出的判断,不替你决定用不用

值得选的地方

  • 基础信息齐全,可以先按说明装一个试试。

先想清楚的地方

  • 没有标注权限级别,实际能做什么要装好后确认。
  • 许可证不明确,商用或二次分发前先到仓库确认条款。
  • 没有现成安装命令,要按安装说明或仓库 README 手动放置。
  • 没有做站内核验,内容以作者仓库为准。
  • 技能只是说明书,实际效果取决于模型与客户端,装完先用小任务试一遍。

更适合

  • 需要在待分类场景里给模型补一套做法的人。
  • 愿意先读一遍 SKILL.md、确认它会让模型做什么的人。

不太适合

  • 对许可证要求很严、必须明确可商用的人。
  • 只想装完就自动变强、不打算看说明书的人。

同类对比

6 个同类
同分类里挑最接近的几条,字段以各自详情页为准
技能权限级别安装方式累计安装宿主客户端安装命令
Zmk Project Init当前 未标注权限 GitHub 仓库 未标注 未标注 无
着色页 联网访问 GitHub 仓库 1.4 万 Codex、Claude、Cursor 有
获取焦点模式 未标注权限 GitHub 仓库 1.1 万 Codex、Claude、Cursor 有
Nano PDF 文档 只读 GitHub 仓库 6,823 Codex、Claude、Cursor 有
Civil Servant 未标注权限 GitHub 仓库 — 未标注 无
07 Project Handoff 未标注权限 GitHub 仓库 — 未标注 无

SKILL.md 全文

22.2 KB
模型实际读到的说明书原文,来自技能仓库

ZMK 键盘项目初始化

引导用户完成 ZMK (Zephyr Mechanical Keyboard) 固件项目的创建、配置、编译和烧录。


适用场景

  • 创建新的 ZMK 蓝牙/有线键盘项目
  • 为已有键盘 PCB 添加 ZMK shield 定义
  • 搭建 ZMK 本地开发环境并编译固件

前置条件

  • 目标 MCU 为 32 位 ARM(nRF52840/nRF52832/RP2040/STM32 等),ZMK 不支持 AVR
  • 系统已安装基本工具链(cmake、ninja、dtc、gperf、python3、arm-none-eabi-gcc)
  • 如需烧录:J-Link 已连接 或 板卡支持 UF2 拖拽烧录

Step 1: 环境检测

> ZMK 基于 Zephyr v4.1+,要求 Python >= 3.10。系统自带 Python 3.9 可能不满足要求。

并行检测以下组件:

cmake --version | head -1
ninja --version
dtc --version | head -1
gperf --version | head -1
python3 --version
arm-none-eabi-gcc --version | head -1

J-Link 检测(含非标准路径):

JLINK_PATH=""
candidates="$(
  which JLinkExe 2>/dev/null
  echo "/Applications/SEGGER/JLink/JLinkExe"
  find /Applications/SEGGER -name 'JLinkExe' -maxdepth 3 2>/dev/null
  find "$HOME/tools" -name 'JLinkExe' -maxdepth 5 2>/dev/null
)"
while IFS= read -r p; do
  [ -n "$p" ] && [ -x "$p" ] && JLINK_PATH="$p" && break
done <<< "$candidates"
echo "JLinkExe: ${JLINK_PATH:-NOT_FOUND}"

Python 版本要求(⚠️ 关键)

Zephyr v4.1 要求 Python >= 3.10。如果系统 Python < 3.10:

# macOS
brew install python@3.12
# 创建 venv(⚠️ Homebrew Python 不允许全局 pip install,必须用 venv)
cd &lt;zmk_dir&gt;
python3.12 -m venv .venv
source .venv/bin/activate
pip install west
pip install -r zephyr/scripts/requirements-base.txt

> ⚠️ Homebrew Python PEP 668 限制:Homebrew 安装的 Python 3.12 不允许直接 pip3 install(报错 externally-managed-environment)。必须创建 venv 后在 venv 内安装包。


Step 2: 克隆 ZMK 仓库并初始化 Workspace

cd &lt;project_parent_dir&gt;
git clone https://github.com/zmkfirmware/zmk.git
cd zmk

# 初始化 Zephyr workspace(⚠️ 必须取消 ZEPHYR_BASE 环境变量)
unset ZEPHYR_BASE
west init -l app/
west update                    # 下载 Zephyr + 模块,约 4-5GB,需较长时间

# 导出 CMake 包
source .venv/bin/activate      # 如使用 venv
west zephyr-export

# 安装 Python 依赖
pip install -r zephyr/scripts/requirements-base.txt

> ⚠️ NCS 冲突:如果系统已安装 nRF Connect SDK,.zshrc 中的 source zephyr-env.sh 会设置 ZEPHYR_BASE 指向 NCS。ZMK 需要自己的 Zephyr fork,编译前必须 unset ZEPHYR_BASE。

> ⚠️ west update 网络失败 — 必须重试!:部分模块可能因网络超时失败。如果后续启用 BLE(CONFIG_ZMK_BLE=y),需要 mbedtls 模块。模块不全会导致 Kconfig 警告 MBEDTLS has direct dependencies 0 with value n 并中止编译。遇到此问题需重新运行 west update 直到所有模块下载成功。失败的模块不会自动重试,必须完整重新 west update。
>
> 如何判断是否需要重试:查看 west update 输出末尾是否有 ERROR: update failed for projects: ...。如果有,重新运行 west update。


Step 3: 确认硬件配置

通过 AskUserQuestion 与用户交互确认:

3.1 芯片型号

  • nRF52840(最常用,USB + BLE)
  • nRF52832(BLE,无 USB)
  • RP2040
  • STM32
  • 其他

3.2 开发板/控制器

  • nice!nano(ZMK 最流行,nRF52840 + UF2 bootloader + 锂电池充电)
  • nRF52840 DK
  • Pro Micro RP2040
  • 自定义板

3.3 键盘布局

  • 自定义矩阵(行列数)
  • 已有布局(Corne、Sofle、Kyria 等)

3.4 外设功能(多选)

  • 编码器
  • I2C OLED/LCD 屏幕
  • RGB 灯效
  • 电池电量检测
  • 外设电源控制(VCC shutoff)
  • 状态按钮/LED
  • UART 调试串口

Step 4: 确定引脚分配

Pro Micro 引脚布局(nice!nano 等)

> ⚠️ D11/D12 在 nice!nano v2 上不可用,分配引脚时需避开。

Pro Micro Pin nRF52840 GPIO 功能
D0 P0.08 UART RX
D1 P0.06 UART TX
D2 P0.17 GPIO / I2C SDA
D3 P0.20 GPIO / I2C SCL
D4 P0.22 GPIO
D5 P0.24 GPIO
D6 P1.00 GPIO
D7 P0.11 GPIO
D8 P1.04 GPIO
D9 P1.06 GPIO
D10 P0.09 GPIO
D14 P1.11 SPI MISO
D15 P1.13 SPI SCK
D16 P0.10 SPI MOSI
D18 P1.15 GPIO / A0
D19 P0.02 GPIO / A1
D20 P0.29 GPIO / A2
D21 P0.31 GPIO / A3

ZMK 中的 Pro Micro 节点与总线别名

ZMK 定义了 &amp;pro_micro connector 和标准总线别名:
- &amp;pro_micro_i2c → &amp;i2c0(I2C 总线,pinctrl 映射到 D2/D3 即 P0.17/P0.20)
- &amp;pro_micro_spi → &amp;spi1(SPI 总线,pinctrl 映射到 D14/D15/D16)
- &amp;pro_micro_serial → &amp;uart0(UART,pinctrl 映射到 D0/D1 即 P0.08/P0.06)

> ⚠️ I2C 和 UART 引脚不冲突:pro_micro_i2c 使用 D2/D3,pro_micro_serial 使用 D0/D1。可以同时启用 I2C OLED 和 UART 调试串口。

在 shield dtsi 中引用引脚:&lt;&amp;pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)&gt; 表示 D7。


Step 5: 创建用户配置目录结构

config/
├── build.yaml                                # CI 构建配置
└── boards/
    └── shields/
        └── &lt;keyboard_name&gt;/
            ├── &lt;keyboard_name&gt;.zmk.yml       # Shield 元数据(⚠️ 必须)
            ├── &lt;keyboard_name&gt;.overlay       # Shield 主 overlay(⚠️ 必须,否则 shield 不被发现)
            ├── &lt;keyboard_name&gt;.dtsi          # 硬件定义(被 overlay include)
            ├── &lt;keyboard_name&gt;.conf          # ⚠️ Shield Kconfig 配置(启用 USB/BLE/UART 等)
            ├── &lt;keyboard_name&gt;.keymap        # 键盘映射
            ├── Kconfig.shield                # Shield 声明
            ├── Kconfig.defconfig             # Shield 默认配置
            └── boards/
                └── &lt;board_name&gt;.overlay      # 板级特定 overlay(⚠️ 文件名匹配不可靠,见下方说明)

⚠️ 关键文件说明

文件 必须? 作用 常见错误
.zmk.yml ✅ Shield 元数据,声明 type/requires/features 遗漏导致 shield 不被识别
.overlay(同名) ✅ Zephyr 通过此文件发现 shield 只有 .dtsi 没有 .overlay 导致 shield 列表中找不到
.conf ✅ 启用 USB/BLE/UART 等功能 ZMK 默认不启用 USB 和 BLE!必须在此显式启用
Kconfig.shield ✅ 注册 shield 到 Kconfig def_bool y 写法错误,必须用 def_bool $(shields_list_contains,&lt;name&gt;)
Kconfig.defconfig ✅ Shield 默认 Kconfig 值 在此重新定义 ZMK 内部 Kconfig 符号的 type 会导致警告
.keymap ✅ 键盘按键映射 缺少 #include &lt;behaviors.dtsi&gt; 导致 &amp;kp 等未定义
.dtsi 可选 硬件定义(可合并到 .overlay 中) —

Step 6: 编写 Shield 定义文件

6.1 &lt;keyboard_name&gt;.zmk.yml

file_format: &quot;1&quot;
id: &lt;keyboard_name&gt;
name: &lt;Display Name&gt;
type: shield
url: &quot;&quot;
requires: [pro_micro]        # 或其他 interconnect
exposes: [i2c_oled]          # 可选
features:
  - keys
  - display                  # 如有屏幕
  - encoder                  # 如有编码器

6.2 Kconfig.shield

# SPDX-License-Identifier: MIT

config SHIELD_&lt;KEYBOARD_NAME_UPPER&gt;
    def_bool $(shields_list_contains,&lt;keyboard_name&gt;)

6.3 Kconfig.defconfig

# SPDX-License-Identifier: MIT

if SHIELD_&lt;KEYBOARD_NAME_UPPER&gt;

config ZMK_KEYBOARD_NAME
    default &quot;&lt;Keyboard Name&gt;&quot;

# ⚠️ 不要在此定义 ZMK 内部符号的 type(如 ZMK_ENCODER),
# 只设置 default 值。ZMK_ENCODER 通过 DTS 自动启用。

if ZMK_DISPLAY
config I2C
    default y
config SSD1306
    default y
endif

endif

6.4 &lt;keyboard_name&gt;.conf(⚠️ 关键 — 启用 USB/BLE/UART)

> ⚠️ ZMK 新版 board defconfig 不自动加载 ZMK_USB/ZMK_BLE!
>
> ZMK 存在两套 board 定义:app/module/boards/(新格式,defconfig 中没有 ZMK_USB/ZMK_BLE)和 app/boards/(旧格式,defconfig 中有)。Zephyr v4.1 优先加载 module 目录的 defconfig,导致 USB 和 BLE 未启用。
>
> 必须在 &lt;keyboard_name&gt;.conf 中显式启用!

# &lt;keyboard_name&gt;.conf - Shield 配置

# USB HID(⚠️ 必须!不启用则 USB 无法识别设备)
CONFIG_ZMK_USB=y

# 蓝牙 BLE(⚠️ 必须!不启用则蓝牙不可见)
# 注意:BLE 依赖 mbedtls 模块,west update 必须完整成功
CONFIG_ZMK_BLE=y

# UART 调试串口(可选,TX=P0.06/D1, RX=P0.08/D0, 115200 baud)
CONFIG_SERIAL=y
CONFIG_NRFX_UARTE0=y
CONFIG_CONSOLE=y
CONFIG_UART_CONSOLE=y
CONFIG_PRINTK=y

# 日志
CONFIG_LOG=y
CONFIG_LOG_DEFAULT_LEVEL=4

> ⚠️ UART 驱动配置:仅设置 CONFIG_SERIAL=y 和 CONFIG_UART_CONSOLE=y 不够。nRF 平台还需要 CONFIG_NRFX_UARTE0=y 启用底层 UART 驱动,否则 SERIAL_HAS_DRIVER 为 n,UART_CONSOLE 依赖不满足会被静默禁用。

6.5 &lt;keyboard_name&gt;.overlay / .dtsi

#include &lt;dt-bindings/zmk/matrix_transform.h&gt;

/ {
    chosen {
        zmk,kscan = &amp;kscan0;
        zmk,matrix_transform = &amp;default_transform;
        zephyr,display = &amp;oled;          /* 如有显示屏 */
    };

    default_transform: keymap_transform_0 {
        compatible = &quot;zmk,matrix-transform&quot;;
        columns = &lt;3&gt;;
        rows = &lt;2&gt;;
        map = &lt;
            RC(0,0) RC(0,1) RC(0,2)
            RC(1,0) RC(1,1) RC(1,2)
        &gt;;
    };

    kscan0: kscan {
        compatible = &quot;zmk,kscan-gpio-matrix&quot;;
        wakeup-source;
        debounce-press-ms = &lt;5&gt;;          /* ⚠️ 不是 debounce-period-ms(已废弃) */
        debounce-release-ms = &lt;5&gt;;
        diode-direction = &quot;col2row&quot;;      /* 或 &quot;row2col&quot; */

        row-gpios
            = &lt;&amp;pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)&gt;
            , &lt;&amp;pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)&gt;;

        col-gpios
            = &lt;&amp;pro_micro 9 GPIO_ACTIVE_HIGH&gt;
            , &lt;&amp;pro_micro 10 GPIO_ACTIVE_HIGH&gt;
            , &lt;&amp;pro_micro 5 GPIO_ACTIVE_HIGH&gt;;
    };

    /* 编码器 */
    sensors: sensors {
        compatible = &quot;zmk,keymap-sensors&quot;;
        sensors = &lt;&amp;encoder_0&gt;;
        triggers-per-rotation = &lt;2&gt;;
    };

    encoder_0: encoder_0 {
        compatible = &quot;alps,ec11&quot;;         /* ⚠️ 必须声明 compatible */
        a-gpios = &lt;&amp;pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)&gt;;
        b-gpios = &lt;&amp;pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)&gt;;
        steps = &lt;80&gt;;
        status = &quot;okay&quot;;
    };

    /* 状态按钮(gpio-keys 必须是容器+子节点结构) */
    buttons: buttons {
        compatible = &quot;gpio-keys&quot;;
        status_button: status_button {
            gpios = &lt;&amp;pro_micro 4 GPIO_ACTIVE_LOW&gt;;
            zephyr,code = &lt;0x0c&gt;;
        };
    };
};

/* I2C OLED(使用 Pro Micro 标准 I2C 节点) */
&amp;pro_micro_i2c {
    status = &quot;okay&quot;;

    oled: ssd1306@3c {
        compatible = &quot;solomon,ssd1306fb&quot;;
        reg = &lt;0x3c&gt;;
        width = &lt;128&gt;;
        height = &lt;32&gt;;
        segment-offset = &lt;0&gt;;
        page-offset = &lt;0&gt;;
        display-offset = &lt;0&gt;;
        multiplex-ratio = &lt;31&gt;;
        segment-remap;                    /* ⚠️ 不带值,不是 = &lt;1&gt; */
        com-invdir;
        com-sequential;
        inversion-on;
        prechargep = &lt;0x22&gt;;              /* ⚠️ 属性名是 prechargep,不是 precharge-period */
    };
};

/* UART 调试串口(⚠️ 放在 shield 主 .overlay 中,不要放在 boards/&lt;board&gt;.overlay 中) */
&amp;uart0 {
    status = &quot;okay&quot;;                       /* 板卡 DTS 默认 disabled,必须启用 */
};

/ {
    chosen {
        zephyr,console = &amp;uart0;           /* ⚠️ 必须设置 console 指向 */
        zephyr,shell-uart = &amp;uart0;
    };
};

> ⚠️ UART 启用必须放在 shield 主 .overlay 中:board-specific overlay(boards/&lt;board_name&gt;.overlay)的文件名匹配在 Zephyr v4.1 新 board 模型下不可靠(board 名从 nice_nano_nrf52840_zmk 变为 nice_nano + qualifier nrf52840),导致 overlay 不被加载。将 &amp;uart0 { status = &quot;okay&quot;; } 和 chosen 放在 shield 主 .overlay 中可确保生效。

6.6 &lt;keyboard_name&gt;.keymap

#include &lt;behaviors.dtsi&gt;                 /* ⚠️ 必须!定义 &amp;kp &amp;bt &amp;out 等行为 */
#include &lt;dt-bindings/zmk/keys.h&gt;
#include &lt;dt-bindings/zmk/bt.h&gt;
#include &lt;dt-bindings/zmk/outputs.h&gt;

/* 启用编码器 */
&amp;encoder_0 {
    status = &quot;okay&quot;;
};

&amp;sensors {
    sensors = &lt;&amp;encoder_0&gt;;
};

/ {
    keymap {
        compatible = &quot;zmk,keymap&quot;;

        default_layer {
            display-name = &quot;Default&quot;;
            bindings = &lt;
                &amp;kp Q    &amp;kp W    &amp;kp E
                &amp;kp A    &amp;kp S    &amp;kp D
            &gt;;
            /* ⚠️ 用 &amp;inc_dec_kp(不是 &amp;inc_kp) */
            sensor-bindings = &lt;&amp;inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN&gt;;
        };
    };
};

6.7 boards/&lt;board_name&gt;.overlay

> ⚠️ board-specific overlay 文件名匹配不可靠:Zephyr v4.1 新 board 模型将 nice_nano_v2 改为 nice_nano + qualifier。board-specific overlay 文件名 nice_nano_nrf52840_zmk.overlay 可能不被加载。建议将所有配置放在 shield 主 .overlay 中,不依赖 board-specific overlay。

/* 板级 overlay,通常只需 include shield 主 dtsi */
#include &quot;&lt;keyboard_name&gt;.dtsi&quot;

6.8 build.yaml

build:
  - board: nice_nano             # ⚠️ 不是 nice_nano_v2
    shield: &lt;keyboard_name&gt;
    artifact-name: &lt;keyboard_name&gt;-nice_nano

Step 7: 编译

> ⚠️ 编译命令使用 board qualifier 格式:-b nice_nano/nrf52840,不要用 -b nice_nano -DBOARD_REV=2.0.0。旧格式会导致 board defconfig 中的 ZMK_USB/ZMK_BLE 不被加载。

cd &lt;zmk_dir&gt;
source .venv/bin/activate        # 如使用 venv
unset ZEPHYR_BASE                # ⚠️ 必须!避免使用 NCS 的 Zephyr

cd app
west build -b nice_nano/nrf52840 -- \
  -DSHIELD=&lt;keyboard_name&gt; \
  -DZMK_CONFIG=&lt;absolute_path_to_config&gt;

⚠️ 验证关键配置(编译后必须检查)

编译成功后,检查 .config 确认 USB/BLE/UART 已启用:

grep -E &quot;CONFIG_ZMK_USB|CONFIG_ZMK_BLE|CONFIG_BT[^_]|CONFIG_USB_DEVICE_HID|CONFIG_NRFX_UARTE0|CONFIG_UART_CONSOLE&quot; build/zephyr/.config

期望输出:

CONFIG_ZMK_USB=y
CONFIG_ZMK_BLE=y
CONFIG_BT=y
CONFIG_USB_DEVICE_HID=y
CONFIG_NRFX_UARTE0=y          # 如启用 UART
CONFIG_UART_CONSOLE=y          # 如启用 UART

如果看到 # CONFIG_ZMK_USB is not set,说明 .conf 文件未被加载或配置有误。

编译常见错误与解决方案

错误 原因 解决方案
Could NOT find Python3: unsuitable version &quot;3.9&quot; Python < 3.10 安装 Python 3.12 + 创建 venv
No shield named &#x27;xxx&#x27; found 缺少同名 .overlay 文件 在 shield 目录创建 &lt;name&gt;.overlay
already initialized in .../ncs ZEPHYR_BASE 指向 NCS unset ZEPHYR_BASE
undefined node label &#x27;kp&#x27; keymap 缺少 behaviors include 添加 #include &lt;behaviors.dtsi&gt;
expected number or parenthesized expression 宏名错误 检查 keys.h 中的宏名(如 C_BRI_UP 不是 C_BRIGHTNESS_UP)
&#x27;debounce-period-ms&#x27; is not declared 属性已废弃 改为 debounce-press-ms + debounce-release-ms
&#x27;gpios&#x27; appears in ... but is not declared gpio-keys 节点结构错误 使用容器+子节点结构
ZMK_ENCODER defined without a type defconfig 重新定义了 type 从 Kconfig.defconfig 中移除 ZMK_ENCODER 定义
parse error: expected label reference (&amp;foo) 独立节点不在根节点内 将节点放入 / { ... } 块中
MBEDTLS has direct dependencies 0 BLE 依赖 mbedtls 但模块未下载 重新 west update 直到所有模块成功
UART_CONSOLE assigned &#x27;y&#x27; but got &#x27;n&#x27; nRF UART 驱动未启用 添加 CONFIG_NRFX_UARTE0=y
No SOURCES given to Zephyr library: drivers__serial serial 驱动未编译 确认 CONFIG_NRFX_UARTE0=y 在 .conf 中
USB 设备不识别 / 蓝牙不可见 ZMK_USB/ZMK_BLE 未启用 在 .conf 中添加 CONFIG_ZMK_USB=y 和 CONFIG_ZMK_BLE=y
串口无输出 uart0 status=disabled 或 console 未设置 在 .overlay 中 &amp;uart0 { status = &quot;okay&quot;; } + chosen { zephyr,console = &amp;uart0; }

编译成功标志

Wrote 544768 bytes to zmk.uf2

输出文件:
- build/zephyr/zmk.uf2 — UF2 格式(拖拽烧录用)
- build/zephyr/zmk.hex — Intel HEX 格式(J-Link 烧录用,内含 0x26000 偏移地址)
- build/zephyr/zmk.elf — ELF 格式(调试用)


Step 8: 烧录

⚠️ 烧录前:备份全片 Flash(强烈建议)

> J-Link 全片擦除 (erase) 会删除 bootloader(0x0-0x26000)!
> 烧录前先用 J-Link 备份完整 flash,以便误操作后恢复:

cat &gt; /tmp/backup.jlink &lt;&lt; &#x27;EOF&#x27;
device nRF52840_xxAA
if SWD
speed 4000
connect
savebin &lt;backup_path&gt;/nrf52840_flash_backup.bin, 0, 0x100000
exit
EOF
&quot;$JLINK_PATH&quot; -NoGui 1 -CommanderScript /tmp/backup.jlink

方式 A: UF2 拖拽烧录(需要 bootloader 完好)

  1. 双击 RESET 按钮进入 bootloader
  2. 设备显示为 USB 存储设备
  3. 复制 build/zephyr/zmk.uf2 到该存储设备
  4. 设备自动重启

方式 B: J-Link 安全烧录(保留 bootloader,推荐)

> hex 文件内含地址信息(0x26000 起),J-Link loadfile 会自动处理偏移,无需手动指定地址。
>
> ⚠️ 必须使用范围擦除 erase 0x26000, 0xDA000,不要用全片 erase!

JLINK_PATH=&quot;&lt;JLinkExe 路径&gt;&quot;
cat &gt; /tmp/flash.jlink &lt;&lt; &#x27;EOF&#x27;
device nRF52840_xxAA
if SWD
speed 4000
connect
erase 0x26000, 0xDA000
loadfile &lt;path&gt;/build/zephyr/zmk.hex
r
g
exit
EOF
&quot;$JLINK_PATH&quot; -NoGui 1 -CommanderScript /tmp/flash.jlink

> 分区布局(nice!nano v2 / nRF52840):
> | 地址范围 | 内容 | 大小 |
> |---|---|---|
> | 0x000000 - 0x025FFF | UF2 Bootloader | 152KB |
> | 0x026000 - 0x0D9FFF | ZMK 应用固件 | ~728KB |
> | 0x0DA000 - 0x0EBFFF | 应用保留区 | ~72KB |
> | 0x0EC000 - 0x0F3FFF | Storage (NVS) | 32KB |
> | 0x0F4000 - 0x0FFFFF | Boot partition | 48KB |

方式 C: J-Link 全片擦录(⚠️ 会删除 bootloader)

> 仅在需要完全重刷时使用。烧录后需单独恢复 bootloader。

cat &gt; /tmp/flash.jlink &lt;&lt; &#x27;EOF&#x27;
device nRF52840_xxAA
if SWD
speed 4000
connect
erase
loadfile &lt;path&gt;/build/zephyr/zmk.hex
r
g
exit
EOF

Bootloader 恢复(误删后修复)

如果 bootloader 被误删,从备份恢复:

cat &gt; /tmp/restore.jlink &lt;&lt; &#x27;EOF&#x27;
device nRF52840_xxAA
if SWD
speed 4000
connect
erase
loadbin &lt;backup_path&gt;/nrf52840_flash_backup.bin, 0
r
g
exit
EOF
&quot;$JLINK_PATH&quot; -NoGui 1 -CommanderScript /tmp/restore.jlink

恢复后再用安全烧录方式烧录 ZMK 固件。

方式 D: west flash

cd &lt;zmk_dir&gt;/app
west flash --runner jlink

Step 9: 验证

9.1 基本验证

  1. 烧录后设备自动复位运行
  2. 通过 USB 连接电脑,应识别为 HID 键盘(名称为 ZMK_KEYBOARD_NAME 设置的值)
  3. 蓝牙搜索应能发现设备
  4. 按键测试:矩阵中的按键应输出对应字符
  5. 编码器测试:旋转应触发音量增减
  6. OLED 测试:屏幕应显示 ZMK 默认状态画面

9.2 串口调试验证

如启用了 UART 调试串口:
- 连接 USB-TTL 适配器:TX→P0.08 (D0), RX→P0.06 (D1), GND→GND
- 波特率 115200,8N1
- 上电后应看到 ZMK 日志输出

# macOS
screen /dev/tty.usbserial* 115200
# Linux
screen /dev/ttyUSB* 115200

9.3 无输出排查

如果 USB 不识别 / 蓝牙不可见 / 串口无输出,按以下顺序排查:

  1. 检查 .config:grep -E &quot;CONFIG_ZMK_USB|CONFIG_ZMK_BLE|CONFIG_NRFX_UARTE0|CONFIG_UART_CONSOLE&quot; build/zephyr/.config
  2. 检查设备树:grep &quot;status&quot; build/zephyr/zephyr.dts | grep -E &quot;uart|usb&quot; — uart0 应为 okay
  3. 检查 chosen:grep &quot;console&quot; build/zephyr/zephyr.dts — 应有 zephyr,console = &amp;uart0
  4. 确认固件在芯片中:J-Link 读 0x26000 处向量表,第一个 word 应为有效栈指针(0x2000xxxx)

完成标志

  • [x] ZMK 仓库克隆 + west update 完整成功(所有模块)
  • [x] Shield 定义文件全部创建且格式正确
  • [x] &lt;keyboard_name&gt;.conf 中启用 CONFIG_ZMK_USB=y + CONFIG_ZMK_BLE=y
  • [x] west build 编译成功,生成 zmk.uf2 / zmk.hex
  • [x] .config 中确认 ZMK_USB/ZMK_BLE/BT/USB_DEVICE_HID 均为 =y
  • [x] 固件烧录到设备并运行(安全擦录,保留 bootloader)
  • [x] 设备识别为 HID 键盘 / BLE 可发现

速查:ZMK 新版关键变更(vs 旧版/文档)

项目 旧版 新版 (2025+)
板卡名 nice_nano_v2 nice_nano + qualifier nrf52840
编译命令 -b nice_nano -DBOARD_REV=2.0.0 -b nice_nano/nrf52840(⚠️ 旧格式导致 defconfig 不加载)
Python 要求 >= 3.8 >= 3.10
Zephyr 版本 v3.x v4.1.0+zmk-fixes
USB/BLE 启用 board defconfig 自动加载 ⚠️ 不自动加载! 必须在 .conf 中显式 CONFIG_ZMK_USB=y / CONFIG_ZMK_BLE=y
UART 驱动 CONFIG_SERIAL=y 即可 额外需要 CONFIG_NRFX_UARTE0=y
board-specific overlay 文件名匹配可靠 ⚠️ 文件名匹配不可靠,配置放 shield 主 .overlay
消抖属性 debounce-period-ms debounce-press-ms + debounce-release-ms
OLED 属性 precharge-period = &lt;0x22&gt; prechargep = &lt;0x22&gt;
OLED remap segment-remap = &lt;1&gt; segment-remap(无值)
Shield 元数据 无 .zmk.yml 文件(必须)
Shield overlay 仅 .dtsi 同名 .overlay 文件(必须)
传感器绑定 &amp;inc_kp &amp;inc_dec_kp
亮度宏 C_BRIGHTNESS_UP C_BRI_UP
config/boards 支持 已废弃警告(仍可用,建议迁移到 module)
I2C 引脚 D0/D1 (P0.08/P0.06) D2/D3 (P0.17/P0.20)(⚠️ pinctrl 已改)
J-Link 烧录 全片 erase 可接受 ⚠️ 必须范围擦除 erase 0x26000, 0xDA000 保留 bootloader

常见问题

5 问
答案由本站依据条目字段整理
Zmk Project Init怎么安装?

没有现成安装命令:按安装说明或仓库 README,把 SKILL.md 放进客户端的 skills 目录(一般一个技能一个文件夹)。

Zmk Project Init支持哪些客户端?

资料没有标注宿主客户端,但只要客户端支持 Skills(Claude、Codex、Cursor 等),一般都能加载。

Zmk Project Init权限高吗,安全吗?

权限级别为未标注权限。安装前先看它会读取或写入哪些内容。

Zmk Project Init收费吗?

本站不代收费用,也没有标注具体价格。是否收费取决于技能本身和所用的模型或客户端,正式使用前按作者说明确认。

Zmk Project Init用什么许可证?

许可证标注为 未说明(许可证不明确)。商用或二次分发前请到仓库确认条款原文。

热门专题

按场景挑技能
全部专题 →

技能内容以作者仓库为准;分类、权限级别与许可证状态的中文说明为中文整理,最近核验 未标注。