
QMK 固件中的 Budgy 键盘RP2040 无二极管分体键盘的配置、编译烧录与实现原理【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmwareBudgy 是 QMK 官方仓库中一款极具代表性的经济型分体键盘它只有 34 个按键、采用无二极管diodeless的直接矩阵设计、主控为树莓派 RP2040Raspberry Pi Pico整体定位是预算budget入门的 DIY 键盘。本文以 keyboards/budgy/readme.md 为核心线索结合其 keyboard.json、config.h 与 默认键位 的仓库源码完整讲解该键盘的硬件架构、分体通信机制、编译烧录流程与 Bootloader 进入方式帮助读者在 QMK 中真正跑通并理解这样一款 RP2040 分体键盘的完整实现。项目概况34 键、无二极管、RP2040 的经济型分体键盘根据 keyboards/budgy/readme.md 的描述Budgy 是一把34 键、无二极管diodeless、基于 RP2040 的预算键盘。其关键信息如下键盘维护者MaintainerKeyboardDweebs支持的硬件Hardware SupportedRaspberry Pi Pico布局规模每只手 5 列 × 3 行共 15 个主键区按键加上每只手 2 个拇指键合计 34 键对应 QMK 社区标准的split_3x5_2分体布局。无二极管这一特性是 Budgy 的核心卖点。传统键盘矩阵需要为每个按键配一枚二极管来防止鬼键ghosting与串键masking而 Budgy 采用 QMK 支持的direct pins直接矩阵方案即每个按键直接独占一个 GPIO 引脚从而省去了二极管与部分矩阵扫描逻辑。从 keyboard.json 中的matrix_pins.direct配置可以看到左右手共 8 行 × 5 列的直接引脚映射左半部分为GP6~GP18中的 17 个引脚右半部分镜像对称。硬件配置逐项解析keyboard.json 中的数据驱动配置QMK 支持 Data-Driven Configuration数据驱动配置Budgy 的全部板级信息都集中在 keyboards/budgy/keyboard.json 中无需维护传统rules.mk与大部分config.h内容。下面逐项拆解其含义。USB 与处理器标识processor: RP2040, bootloader: rp2040, usb: { device_version: 1.0.0, pid: 0x0117, vid: 0xFABE }processor声明主控为树莓派 RP2040 双核 Cortex-M0 微控制器bootloader声明使用 RP2040 的 UF2 引导加载器rp2040编译产物为可拖拽烧录的 UF2 文件usb段定义了 USB VID0xFABEQMK 键盘的通用厂商 ID与 PID0x0117。功能开关featuresfeatures: { bootmagic: true, extrakey: true, mousekey: true, nkro: true }bootmagic启用 Bootmagic详见后文 Bootloader 章节这也是 readme 中按住矩阵 (0,0) 键再插入 USB 即可进入引导加载器的依据extrakey启用多媒体/系统键支持如音量、媒体播放键mousekey启用鼠标键功能可将按键映射为鼠标移动与点击nkro启用 N 键无冲突N-Key Rollover报告。无二极管的直接矩阵Direct Pinsmatrix_pins: { direct: [ [GP6, GP5, GP4, GP3, GP2], [GP11, GP10, GP9, GP8, GP7], [GP15, GP14, GP13, GP12, GP16], [GP17, GP18, null, null, null] ] }这是左手半边的引脚表行号即矩阵行索引列中的每个元素是对应按键所直接连接的 GPIO 引脚null表示该位置没有按键。右手半边在split.matrix_pins.right.direct中给出了镜像对称的引脚排列如GP2、GP3等与左手对应位置交错对应。从矩阵结构可以推断每只手 4 行其中前 3 行各 5 个键主键区 15 键第 4 行只有 2 个键拇指键合计每手 17 键左右共 34 键由于是直接矩阵每个按键的开关状态通过读取对应 GPIO 的电平直接获得不需要行扫描/列扫描的组合逻辑因此无需二极管需要注意的是采用 direct pins 时按键数量直接受限于可用 GPIO 数量。RP2040 拥有丰富的引脚资源Budgy 每手仅需 17 个 GPIO加上左右手之间的串行通信引脚见下文GP0/GP1对 Pico 而言余量充足。分体Split配置与左右通信split: { enabled: true, matrix_pins: { right: { direct: [ ... ] } }, serial: { driver: vendor } }split.enabled声明这是一把分体键盘右手矩阵通过split.matrix_pins.right单独定义分体键盘的左右两半矩阵引脚通常不同需要分开声明serial.driver指定左右手之间的串行驱动为vendor。在 RP2040 平台上vendor对应 QMK 针对该芯片的PIOProgrammable I/O串行驱动实现详见 docs/drivers/serial.md。布局定义与社区布局community_layouts: [split_3x5_2], layouts: { LAYOUT_split_3x5_2: { layout: [ {matrix: [0, 0], x: 0, y: 0.25}, ... ] } }community_layouts声明 Budgy 遵循 QMK 社区标准布局split_3x5_23 行 × 5 列 2 个拇指键的分体布局见 layouts/community/split_3x5_2/readme.md这意味着任何同样使用该社区布局的键位keymap都可以直接编译到 Budgy 上无需修改布局宏。layouts.LAYOUT_split_3x5_2段通过matrix坐标行、列与物理坐标x、y的映射把按键定义到键盘的物理位置从坐标数据可以看到左右两半以x4与x8为界对称排布符合典型的 34 键分体键盘布局。编译与烧录一条命令完成固件构建readme 中给出了构建环境就绪后的两条核心命令也可直接参考 docs/getting_started_make_guide.md编译默认键位make budgy:default编译并烧录make budgy:default:flash命令的语义为make 键盘名:键位名[:目标]budgy对应键盘目录 keyboards/budgydefault对应默认键位 keyboards/budgy/keymaps/default/keymap.c附加:flash目标会在编译完成后自动进入烧录流程将生成的固件写入板子。对于 RP2040 平台构建产物是UF2 固件镜像将 Pico 以引导模式挂载为 U 盘后把.uf2文件拖入即可完成烧录无需额外刷写工具。若你尚未搭建 QMK 构建环境建议从 docs/newbs_getting_started.md环境搭建与入门和 docs/newbs.mdQMK 新手完全指南开始。进入 Bootloader 的三种方式readme 明确列出了 Budgy 进入引导加载器的 3 种方式Bootmagic resetBootmagic 复位在矩阵 (0,0) 位置通常是左上角第一个键或 Escape 键按住不放的同时插入 USB 供电键盘会直接进入引导模式。这一机制依赖 keyboard.json 中features.bootmagic的开启物理复位按钮按下 PCB 背面的复位按钮部分版本没有按钮而是需要短接对应的焊盘即可进入引导模式键位中的QK_BOOT键码如果在键位中把某个按键映射为QK_BOOTQMK 的复位键码详见 docs/keycodes.md按下该键即可触发复位进入引导加载器。此外Budgy 在 config.h 中还启用了 RP2040 平台的双击复位Double-tap reset机制#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET #define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U根据 docs/platformdev_rp2040.md 的说明该机制允许在上电启动时快速双击复位引脚在1000U即 1000 毫秒的超时窗口内完成两次触发来进入 RP2040 的 UF2 引导加载器行为与 AVR Pro Micro 类似让没有物理开关的玩家也能方便地进入烧录模式。RP2040_BOOTLOADER_DOUBLE_TAP_RESET在 QMK 的 Generic Pro Micro RP2040 板上默认开启Budgy 在此显式声明并自定义了超时窗口。分体通信底层全双工 USART 串行与 PIO 驱动作为分体键盘左右两半之间需要持续同步按键状态、层状态等数据。Budgy 在 config.h 中给出了具体的串行配置#define SERIAL_USART_FULL_DUPLEX #define SERIAL_USART_TX_PIN GP1 #define SERIAL_USART_RX_PIN GP0 // #define SERIAL_USART_PIN_SWAP结合 docs/drivers/serial.md 的说明可以解读SERIAL_USART_FULL_DUPLEX启用全双工Full-duplex通信模式使用两条独立数据线TX发送、RX接收一方半的TX必须接到另一半的RX反之亦然SERIAL_USART_TX_PIN GP1/SERIAL_USART_RX_PIN GP0指定分体通信使用的两个 GPIO 引脚被注释掉的SERIAL_USART_PIN_SWAP是部分 MCU如 STM32F303/Proton-C提供的片内TX/RX交换能力。Budgy 未启用它意味着左右交叉连接需要在 PCB 布线或连接线上完成keyboard.json 中split.serial.driver设置为vendor对应 RP2040 专属的PIO 串行驱动。PIOProgrammable I/O是 RP2040 的特色外设其优势在于任意 GPIO 均可作为TX/RX引脚且内置上拉不需要像半双工 USART 那样外接上拉电阻。从源码结构看Budgy 选择了 RP2040 上最灵活、配置最简洁的组合PIO 驱动 全双工双线通信兼顾了通信效率与引脚自由度。对分体键盘的握手与通信机制感兴趣的读者可进一步阅读 docs/features/split_keyboard.md分体键盘的硬件接线、左右手判定与数据同步选项。默认键位34 键 QWERTY 布局实例Budgy 的默认键位位于 keyboards/budgy/keymaps/default/keymap.c使用LAYOUT_split_3x5_2宏定义了一层标准的 QWERTY 布局[0] LAYOUT_split_3x5_2( KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_BSPC, KC_TAB, KC_SPC, KC_ENT );键位注释中给出了清晰的 ASCII 键位图左右各 3 行 × 5 列的主键区字母区加上底部右侧的拇指键左手拇指为 Backspace 与 Tab右手拇指为 Space 与 Enter。作为只有 34 键的极简键盘字母以外的符号、数字与功能键通常需要借助层Layer实现——这也是split_3x5_2这类紧凑布局在 QMK 中常见的用法读者可以仿照该文件自行添加LOWER/RAISE等功能层层的定义与切换见 docs/feature_layers.md。小结Budgy 是理解RP2040 无二极管 分体键盘三者结合的一个极佳范本通过 keyboard.json 的数据驱动配置可以在不写 C 代码的情况下完成矩阵、USB、分体与功能的声明config.h 补充了 RP2040 双击复位与全双工 PIO 串行的底层细节而 默认键位 展示了 34 键布局的实际写法。对希望动手制作一把经济型分体键盘、或想在 RP2040 平台上移植同类项目的开发者而言Budgy 的整套配置都可以作为可直接复用的起点。【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考