QMK 固件实战:4pplet Eagle Viper REP Rev B 键盘的编译、刷写与硬件配置指南
2026/9/15 21:23:57 网站建设 项目流程

QMK 固件实战:4pplet Eagle Viper REP Rev B 键盘的编译、刷写与硬件配置指南

【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware

本篇技术指南以 QMK Firmware 仓库中 keyboards/4pplet/eagle_viper_rep/rev_b/readme.md 为骨架,围绕 4pplet 出品的 Viper/Eagle 替代 PCB(Rev B)展开:你将从零掌握该键盘在 QMK 生态中的编译命令、DFU 与 Bootmagic Lite 两种进引导模式的方法,并深入了解其数据驱动配置(matrix 布局、RGB 灯效、PWM 背光、层指示灯)与源码实现,最终能够自行编译、刷写并定制这套 60% 布局的固件。

一、键盘概览:Viper/Eagle REP Rev B 是什么

Viper/Eagle REP Rev B 是 4pplet 设计的一款替代 PCB(alternative PCB),用于兼容市面上的 Viper 与 Eagle V2、V3 键盘外壳。它被收纳在 QMK 官方仓库的keyboards/4pplet/eagle_viper_rep/目录下,与 Rev A 同属一个产品系列,Rev B 是其独立维护的硬件修订版本。

仓库中对应目录结构如下(keyboards/4pplet/eagle_viper_rep/rev_b):

rev_b/ ├── config.h # 硬件级宏定义(PWM 背光、WS2812、层指示灯) ├── halconf.h ├── keyboard.json # 数据驱动配置(USB、矩阵、布局、特性) ├── matrix_diagram.md # 矩阵接线图 ├── mcuconf.h # ChibiOS PWM 定时器使能 ├── readme.md # 官方说明文档 ├── rev_b.c # 板级逻辑(层 LED 指示) ├── rev_b.h # 板级头文件 ├── rules.mk # 编译规则(DFU 后缀) └── keymaps/default/keymap.c # 默认键位

其中 keyboard.json 完整记录了键盘的身份信息:名称为 "Eagle Viper REP Rev B",制造商为 4pplet,USB VID 为0x4444、PID 为0x0010、设备版本0.0.2,主控为STM32F072,引导加载器为stm32-dfu。这意味着它属于 ARM 平台键盘,采用 DFU 协议刷写。

二、编译固件:环境准备与 make 命令

1. 构建环境

在编译之前,需要先完成 QMK 构建环境(build environment)的搭建。官方提供了三份配套指南,仓库内的对应文档分别为:

  • getting_started_introduction.md:QMK 新手入门总览;
  • newbs_building_firmware.md:完整的固件编译流程;
  • getting_started_make_guide.md:make 命令的详细用法(目标语法、编译选项、烧录选项等)。

环境就绪后,进入 QMK 仓库根目录执行下面的命令即可为 Rev B 编译默认固件:

make 4pplet/eagle_viper_rep/rev_b:default

2. make 目标语法解读

上述命令遵循 QMK 标准的make <keyboard>:<keymap>语法:

  • 4pplet/eagle_viper_rep/rev_b是键盘目标的完整路径(对应仓库目录keyboards/4pplet/eagle_viper_rep/rev_b/);
  • default是键位方案名称(对应keymaps/default/目录)。

如需直接编译并刷写,可追加目标后缀,例如:

make 4pplet/eagle_viper_rep/rev_b:default:flash

更多目标(如dfudfu-utilavrdude等)与附加选项(如keymap=<名字>CONVERT_TO=...)可查阅 getting_started_make_guide.md。

3. 与 DFU 相关的特殊规则

Rev B 的 rules.mk 中有这样一行:

# Wildcard to allow APM32 MCU DFU_SUFFIX_ARGS = -p FFFF -v FFFF

这是为了让 DFU 后缀校验(dfu-suffix)对厂商 ID 与产品 ID 使用通配符FFFF,从而兼容采用 APM32(STM32F072 的国产兼容芯片)的硬件批次。也就是说,这块 PCB 上实际焊接的 MCU 可能是 STM32F072 或其兼容型号,刷写工具在添加 DFU 后缀时不做严格的身份校验。

三、进入引导模式(DFU)的两种方法

Rev B 提供了两种进入 bootloader 的途径,这是刷写固件的前提。

方法一:硬件复位按钮(通用方法)

在键盘上与 MCU 同侧有一颗小按钮:

  1. 按住该按钮超过 1 秒,键盘将进入 bootloader(DFU)模式,此时系统会识别到 DFU 设备,可以执行刷写;
  2. 注意:按住时间较短只会触发键盘复位(reset),不会进入 DFU;
  3. 如果进入 bootloader 后不想刷写固件,只需断开键盘与电脑的连接再重新插上即可退出该模式。

方法二:Bootmagic Lite(适用于已预刷固件的场景)

如果键盘上已经烧录过固件,可以借助Bootmagic Lite免按键进入 DFU:

  1. 拔掉键盘的 USB 线;
  2. 按住 Esc 键不松,同时插入 USB 线;
  3. 等待约 1 秒后松开按键,键盘即进入 bootloader 模式。

这一功能依赖bootmagic特性,在 keyboard.json 的features中默认开启("bootmagic": true)。对比同目录 Rev A 的 readme,Rev A 使用的是Spacebar + B组合,而 Rev B 改为Esc,两者不同,刷写时请务必按本修订版的说明操作。

四、硬件配置逐项解析:从 keyboard.json 到源码

Rev B 采用 QMK 的**数据驱动配置(data-driven config)**模式,绝大部分硬件参数集中在 keyboard.json 中,少量底层细节仍由 C 头文件承担。

1. 矩阵定义与二极管方向

"matrix_pins": { "cols": ["A0", "A3", "A4", "A7", "B5", "B4", "B3"], "rows": ["A2", "A1", "B8", "A10", "C15", "A15", "B7", "B6", "C14", "C13"] }, "diode_direction": "COL2ROW"

矩阵为10 行 × 7 列,二极管方向为 COL2ROW(列驱动、行扫描)。完整的矩阵物理接线图见 matrix_diagram.md,其中用坐标(如001036等)标明了每个键位对应的行列位置,并单独注释了 2u Backspace、ISO Enter、2.25u/2.75u Shift、Tsangan/WKL/HHKB 以及 10u Space 等特殊配列的组合方式。

2. 特性开关(features)

"features": { "bootmagic": true, "mousekey": true, "extrakey": true, "command": true, "nkro": true, "backlight": true, "rgblight": true }
  • bootmagic:支持 Bootmagic Lite(上文方法二依赖此特性);
  • mousekey:鼠标键;
  • extrakey:系统与媒体控制键;
  • command:QMK 调试命令层;
  • nkro:全键无冲(N-Key Rollover);
  • backlight+rgblight:分别对应 PWM 背光与 RGB 底灯。

3. 动态键位与层

"qmk": { "locking": { "enabled": true, "resync": true } }, "dynamic_keymap": { "layer_count": 5 }
  • qmk.locking:启用 QMK 锁定(Caps Lock 等锁定键支持)并开启 resync;
  • dynamic_keymap.layer_count = 5:固件支持5 个动态层,配合默认键位中的层切换键MO(1)以及 rev_b.c 中层指示灯的实现(case 0case 4)正好一一对应。

4. PWM 背光

"backlight": { "pin": "A6", "levels": 6, "breathing": true }

背光引脚为A6,共6 级亮度,支持呼吸效果。底层实现位于 config.h:

#define BACKLIGHT_PWM_DRIVER PWMD3 #define BACKLIGHT_PWM_CHANNEL 1 #define BACKLIGHT_PAL_MODE 1

背光 PWM 由 ChibiOS 的PWMD3驱动、使用通道 1。为了让该定时器可用,mcuconf.h 中对定时器使能进行了覆盖:

#undef STM32_PWM_USE_TIM1 #define STM32_PWM_USE_TIM1 TRUE #undef STM32_PWM_USE_TIM3 #define STM32_PWM_USE_TIM3 TRUE

(TIM3 对应 PWMD3,TIM1 供 RGB/WS2812 等其他用途。)同时BACKLIGHT_PAL_MODE 1指明 A6 引脚在复用为 PWM 输出时使用的 PAL 复用功能编号。

5. RGB 底灯与 WS2812

"ws2812": { "pin": "A8" }, "rgblight": { "saturation_steps": 8, "brightness_steps": 8, "led_count": 16, "animations": { "breathing": true, "rainbow_mood": true, "rainbow_swirl": true, "snake": true, "knight": true, "christmas": true, "static_gradient": true, "rgb_test": true, "alternating": true, "twinkle": true } }
  • WS2812 灯带接在A8引脚,共16 颗灯珠
  • 饱和度与亮度各提供 8 级调节步进;
  • 默认启用 10 种动画效果:呼吸、彩虹情绪、彩虹旋转、贪吃蛇、骑士、圣诞、静态渐变、RGB 测试、交替闪烁、闪烁星光,均可在键位层通过 RGB 控制键码切换。

此外 config.h 中定义了:

#define WS2812_EXTERNAL_PULLUP

表示 WS2812 数据线在 PCB 上已有外部上拉电阻,QMK 在初始化该引脚时不再重复使能内部上拉,避免与外部上拉冲突。

6. 层指示灯(Indicator LEDs)

config.h 为 5 个层各分配了一颗指示 LED:

#define LAYER_1 B14 #define LAYER_2 B15 #define LAYER_3 B0 #define LAYER_4 B9 #define LAYER_5 A9

其逻辑实现在 rev_b.c:

  • keyboard_pre_init_kb()在初始化阶段将这 5 个引脚全部设置为输出;
  • layer_state_set_kb()调用用户层钩子后调用setLayerLed(state)
  • setLayerLed()先熄灭全部 LED,再依据get_highest_layer(state)点亮当前最高活动层对应的那颗灯(层 0~4 分别对应 LAYER_1~LAYER_5)。

这套代码展示了 QMK 中标准的板级层钩子(layer_state_set_kb)与 GPIO 控制写法,可作为其他带层指示灯的键盘移植参考。三个锁定指示灯(Caps/Num/Scroll Lock)则由 keyboard.json 的indicators字段指定在 B1、B12、B13 引脚。

7. 布局(Layouts)体系

Rev B 是标准的 60% 键盘,keyboard.json 中定义了一个完整的LAYOUT_all(支持 split Backspace、split RShift、ISO Enter、三空格/七空格等全配列)以及 8 种社区布局,覆盖:

  • 60_ansi/60_ansi_split_bs_rshift
  • 60_ansi_tsangan/60_ansi_tsangan_split_bs_rshift
  • 60_hhkb
  • 60_iso/60_iso_split_bs_rshift
  • 60_iso_tsangan/60_iso_tsangan_split_bs_rshift

同时定义了别名映射:

"layout_aliases": { "LAYOUT": "LAYOUT_all", "LAYOUT_60_tsangan_hhkb": "LAYOUT_60_ansi_tsangan_split_bs_rshift" }

任何键位方案只需引用LAYOUT_all(或上述任一社区布局名)即可获得对应配列的键位数组,这正是该替代 PCB 能兼容多种外壳配列的关键。

五、默认键位方案解读

default/keymap.c 提供了两层键位:

  • 层 0(主层):标准 60% 键位,末排为 3 个空格(KC_SPC×3)+ 双 Alt/双 GUI 的 WKL 风格配置,右 Shift 与右下角 Fn 使用MO(1)作为层切换;
  • 层 1(功能层)QK_BOOT放在左上角 Esc 位置(可在系统内直接进入 bootloader 刷写),F1~F12 位于数字行,WASD 区域安排了方向键(上/左/下/右),其余全部为KC_TRNS(透传,保持主层功能)。
[0] = LAYOUT_all( KC_ESC, KC_1, ..., MO(1)), [1] = LAYOUT_all( QK_BOOT, KC_F1, ..., KC_TRNS)

这一示例说明:通过LAYOUT_all宏与MO()/KC_TRNS组合,即可快速搭建多层键位;而QK_BOOTRESET的推荐写法)则提供了第三种、无需拆壳按键的进 DFU 手段。

六、刷写固件小结与常见问题

综合上文,Rev B 共有三种进入 DFU 的方式,按使用场景选择:

场景方法操作
首次刷写/固件异常硬件按钮按住 MCU 同侧小按钮超过 1 秒进入 DFU
已预刷固件Bootmagic Lite拔线 → 按住 Esc → 插入 USB → 等 1 秒松开
固件内触发QK_BOOT 键默认键位层 1 左上角即为该键

刷写时使用make 4pplet/eagle_viper_rep/rev_b:default:flash或标准的dfu-util/QMK Toolbox流程(相关通用步骤可参考 flashing.md 与 newbs_flashing.md)。若按硬件按钮时间过短,键盘只会复位而不会进入 DFU;进入 bootloader 后若不刷写,拔插 USB 即可恢复。

从 QMK 生态的视角看,Rev B 是一个典型的数据驱动 + ARM + DFU键盘示例:所有可配置特性都集中在keyboard.jsonconfig.h/mcuconf.h只保留 PWM 通道、GPIO 上拉等底层细节,rev_b.c演示了板级初始化与层指示钩子的标准写法。阅读本指南后,你不仅能顺利编译与刷写这块 PCB,也能以此为模板理解其他同构键盘的配置结构与移植方法。

【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询