QMK 固件实战:waffling60 Rev E ANSI 60% 键盘的编译、刷写与配置详解
【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware
waffling60 Rev E ANSI 是 4pplet 出品的 60% 配列 PCB(兼容 MX 轴体,提供热插拔与焊接两个版本),Rev E 版本新增了底灯(underglow)与旋转编码器(rotary encoder)支持。本文基于 QMK 仓库中keyboards/4pplet/waffling60/rev_e_ansi/目录下的官方文档与源码配置,完整讲解该键盘的固件编译、DFU 刷写、bootloader 进入方式、keyboard.json配置语义以及默认键位/编码器映射,帮助你在拿到板子后即可完成从源码到可用固件的全流程。
硬件概览与固件定位
根据 Rev E ANSI 官方 readme,这是一块 60% 布局的 PCB:
- 支持 MX 开关,热插拔(Hotswap)与焊接(Solder)两种版本,且拥有不错的配列支持;
- Rev E 相较前代引入两项关键能力:底灯(underglow)与旋转编码器;
- 维护者为 4pplet,仓库内以
4pplet/waffling60/rev_e_ansi作为 QMK 中的固件目标(keyboard target)。
该目标目录包含完整的固件定义文件:
- readme.md —— 官方说明、编译/刷写命令与 bootloader 指引;
- keyboard.json —— 数据驱动配置(处理器、矩阵、编码器、RGB、USB 标识、布局定义);
- config.h —— 编译期宏定义;
- rules.mk —— DFU 后缀参数(APM32 兼容);
- matrix_diagram.md —— 矩阵与配列示意图;
- keymaps/default/ —— 默认键位图与编码器映射。
编译固件
在完成 QMK 构建环境配置后,编译默认固件的命令为:
make 4pplet/waffling60/rev_e_ansi:default该命令会在keyboards/4pplet/waffling60/rev_e_ansi/keymaps/default/下执行构建,生成.bin/.hex固件文件。构建环境的搭建可参考 Newbs 构建固件指南,make用法详见 Getting Started Make Guide。
与 Rev A~Rev D 相比,Rev E 各变体(rev_e、rev_e_ansi、rev_e_iso)均使用STM32F072处理器与stm32-dfubootloader(见 keyboard.json),因此产物为 ARM 固件而非 AVR 的.hex。整个 waffling60 系列在同一keyboards/4pplet/waffling60/目录下维护多个版本目标,例如rev_a、rev_b、rev_c、rev_d、rev_d_ansi、rev_d_iso等,编译时按需指定对应 target 即可。
刷写固件与进入 DFU Bootloader
编译完成后,直接执行:
make 4pplet/waffling60/rev_e_ansi:default:flash该命令会先编译,再通过 DFU 协议将固件写入键盘。官方 readme 提供了两种进入 bootloader(DFU 模式)的方式:
方式一:短接复位引脚(推荐)
- 在 PCB 背面找到标记为BL/RESET的复位排针;
- 短接该排针约 2 秒,键盘即进入 DFU 模式,此时系统识别为可刷写设备;
- 若使用的是APM32 MCU,刷写完成后键盘不会自动复位——只需再次短暂短接复位排针,或直接拔插 USB 线即可让键盘重启并运行新固件。
方式二:利用已预刷固件的组合键
适用于固件已经预刷(pre-flashed)的情况:
- 拔下键盘 USB 线;
- 同时按住Spacebar(空格)与B键;
- 插入 USB 线,等待约 1 秒后松开按键;
- 键盘进入 DFU 模式,即可进行刷写。
这条路径能工作的前提是键盘上已有可用的 QMK 固件(bootmagic 等机制负责在启动时检测组合键),因此在首次刷入固件前请优先使用方式一。
keyboard.json 配置深度解析
Rev E ANSI 的硬件定义全部收敛在 keyboard.json 中,以下逐项拆解其语义:
基础信息与 USB 标识
"manufacturer": "4pplet", "keyboard_name": "waffling60 Rev E ANSI HS", "maintainer": "4pplet", "bootloader": "stm32-dfu", "processor": "STM32F072", "usb": { "device_version": "0.0.5", "pid": "0x0015", "vid": "0x4444" }- 处理器为 STM32F072(ARM Cortex-M0 系列),bootloader 类型为
stm32-dfu,刷写工具会据此选择 DFU 传输方式; - USB VID/PID 为
0x4444:0x0015,device version0.0.5,这是键盘在操作系统中被识别的身份标识; - 官方 PCB 提供热插拔(HS)与焊接两个版本,该目录对应的是 ANSI 热插拔变体(键盘名带 “HS” 后缀)。
矩阵扫描配置
"diode_direction": "COL2ROW", "matrix_pins": { "cols": ["B2", "A4", "A3", "A0", "F1", "F0", "C15", "C14", "C13", "B9", "B8", "B7", "A15", "B3"], "rows": ["B14", "A9", "B6", "B5", "B4"] }- 二极管方向为COL2ROW,即列驱动、行扫描;
- 共 14 列 × 5 行 = 70 个矩阵位置,覆盖 60% 键盘全部按键,并为多种配列(含 HHKB、Tsangan、拆分空格)预留了矩阵位。
旋转编码器
"encoder": { "rotary": [ {"pin_a": "A2", "pin_b": "A1", "resolution": 2} ] }Rev E 的核心新增能力之一。编码器接入 A2/A1 两个引脚,resolution: 2表示每次物理刻度产生 2 个脉冲(1:2 编码器),QMK 会根据该分辨率校准旋钮的步进计数。同时features.encoder开启编码器功能,默认键位图中通过ENCODER_MAP_ENABLE为其绑定动作(见下文)。
底灯(underglow)配置
"features": { "...", "rgblight": true }, "rgblight": { "animations": { "alternating": true, "breathing": true, "christmas": true, "knight": true, "rainbow_mood": true, "rainbow_swirl": true, "rgb_test": true, "snake": true, "static_gradient": true, "twinkle": true }, "led_count": 17 }, "ws2812": { "pin": "A8" }- 底灯采用WS2812灯带,数据引脚为 A8,共17 颗 LED;
led_count需与 PCB 实际灯珠数量一致,用于 RGB 动画的索引计算;animations列出了内置动画开关:呼吸(breathing)、彩虹流动(rainbow_mood)、彩虹旋涡(rainbow_swirl)、蛇形(snake)、骑士(knight)、静态渐变(static_gradient)、闪烁(twinkle)、圣诞(christmas)、交替(alternating)与 RGB 自检(rgb_test)等;- config.h 中还定义了
WS2812_EXTERNAL_PULLUP,这要求板载数据线上有外部上拉电阻,编译器据此调整 WS2812 驱动时序配置——自定义 RGB 时不要随意移除该宏,否则可能因电平驱动问题导致灯带不亮。
功能开关(features)
"features": { "bootmagic": true, "extrakey": true, "key_lock": true, "mousekey": true, "encoder": true, "nkro": true, "rgblight": true }bootmagic:允许通过启动时按特定组合键(如前文 Spacebar+B)触发 bootloader 等魔法功能;nkro:N 键无冲(防冲突);mousekey:鼠标键支持(F 层可映射鼠标按键);key_lock:按键锁定功能;extrakey:消费类按键(多媒体/系统键)支持,这也是编码器默认映射音量/亮度键的基础。
默认键位图与编码器映射
默认键位位于 keymaps/default/keymap.c,共两层:
- 第 0 层(主层):标准 ANSI 键位,使用
LAYOUT_all宏,包含拆分的右 Shift、Fn 层按键以及三颗空格(对应可选的 7u/拆分空格配列); - 第 1 层(功能层,通过右下角
MO(1)按住触发):QK_BOOT位于 Esc 位——按下即进入 DFU bootloader,无需短接排针;KC_F1~KC_F12映射到数字行;- 方向键映射到
W/A/S/D邻近位(KC_UP/KC_LEFT/KC_DOWN/KC_RIGHT); - 其余为
KC_TRNS(透传),保持主层行为。
编码器映射通过 keymaps/default/rules.mk 中的ENCODER_MAP_ENABLE = yes开启,并在 keymap.c 中定义:
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, [1] = { ENCODER_CCW_CW(KC_BRID, KC_BRIU) } };- 第 0 层:逆时针转 = 音量减(
KC_VOLD),顺时针转 = 音量加(KC_VOLU); - 第 1 层:逆时针 = 亮度减(
KC_BRID),顺时针 = 亮度加(KC_BRIU)。
ENCODER_MAP_ENABLE采用层感知(layer-aware)的编码器映射,与keymaps[][MATRIX_ROWS][MATRIX_COLS]同构分层,因此旋钮行为会随当前激活层自动切换——这是 Rev E 编码器默认固件的标准用法。
配列支持与矩阵示意
keyboard.json 声明了两个社区布局(community layouts):
60_ansi_tsangan_split_bs_rshift:Tsangan/WKL 风格,拆分 Backspace 与右 Shift;60_hhkb:HHKB 风格。
同时内置三个布局宏:LAYOUT_all(全配列,含拆分空格)、LAYOUT_60_ansi_tsangan_split_bs_rshift(7u 空格 Tsangan)与LAYOUT_60_hhkb,并提供LAYOUT_60_tsangan_hhkb→LAYOUT_60_ansi_tsangan_split_bs_rshift的别名映射。默认键位使用LAYOUT_all,因此你可以在不改动 PCB 的情况下通过自定义 keymap 切换到 HHKB 或 Tsangan 配列。
matrix_diagram.md 给出了矩阵坐标示意,明确标注:
- 2u Backspace(矩阵位
1D)的独立位置; - Tsangan/WKL/HHKB 底行的 7u 空格(
46)与左右 1.5u/1u 修饰键; - 7u 拆分空格(
44/46/48三颗空格)配列; - 10u 长空格配列。
结合 keyboard.json 中LAYOUT_all的坐标(x/y)与宽度(w)字段,可以精确还原每种配列的物理键位尺寸,为编写自定义键位图提供参照。
常见问题与排障提示
- 刷写后键盘无反应(APM32 芯片):Rev E ANSI 的 rules.mk 中设置了
DFU_SUFFIX_ARGS = -p FFFF -v FFFF,这是为兼容 APM32 MCU 而开放的通配后缀参数。若使用 APM32,刷写完成后不会自动复位,需短接复位排针或拔插 USB 线手动重启(官方 readme 已注明)。 - 底灯不亮:确认
WS2812_EXTERNAL_PULLUP宏存在且板载上拉电阻完好,并核对rgblight.led_count是否与 PCB 实际灯珠数量一致(Rev E ANSI 为 17 颗)。 - 旋钮无动作:确认构建时
ENCODER_MAP_ENABLE = yes生效,且键盘层处于映射层(默认第 0 层为音量控制)。 - 进入 DFU 失败:优先使用 BL/RESET 复位排针短接约 2 秒的方式;组合键方式(Spacebar+B)仅在固件已预刷且
bootmagic开启时可用。
进一步阅读
- 系列说明:waffling60 总览(包含 Rev A~Rev E 全部编译目标);
- Rev E 基础版:rev_e readme(新增 underglow 与 6u 空格支持);
- 构建环境:Newbs 构建固件指南、make 命令指南;
- 刷写与 DFU 通用流程:刷写固件指南、Newbs 刷写指南。
【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考