QMK 固件构建指南:CannonKeys DevastatingTKL 键盘的编译、配置与自定义刷写
【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware
DevastatingTKL 是 CannonKeys 出品的一款搭载 STM32F072CBT6 主控的 TKL(Tenkeyless,无数字区)键盘,本指南以 QMK 固件仓库中该键盘的官方支持文件为主线,完整讲解如何搭建 QMK 构建环境、编译出可刷写固件、理解其数据驱动配置(键盘矩阵、背光、RGB 灯效)、解读默认键位层,并最终将固件烧录到键盘。读完本文,你将能够独立完成make cannonkeys/devastatingtkl:default的完整编译链路,并根据自己的需求修改键位、灯光与功能开关。
键盘与仓库支持概况
在 QMK 固件仓库中,DevastatingTKL 的官方支持目录为 keyboards/cannonkeys/devastatingtkl,其 readme.md 明确了如下关键信息:
- 键盘维护者(Keyboard Maintainer):Andrew Kannan(GitHub 用户名
awkannan) - 硬件平台(Hardware Supported):STM32F072CBT6
- 标准编译目标:
cannonkeys/devastatingtkl:default
STM32F072CBT6 属于 ST 公司基于 ARM Cortex-M0 内核的 STM32F0 系列,具备 128KB Flash 与 16KB RAM,在 QMK 生态中属于常见的低成本 ARM 主控,这一点决定了该键盘的固件构建走的是 ARM(ChibiOS/裸机)构建链路,而非 AVR 链路。
构建前准备:搭建 QMK 编译环境
编译固件的第一步是获取并配置 QMK 工具链。对于全新用户,建议直接参考仓库中的官方指引:
- Complete Newbs Guide(新手完全指南):覆盖从零开始的环境搭建、编译、刷写的完整流程;
- 新手入门:详细说明如何克隆 QMK 固件仓库并运行
qmk setup完成工具链初始化; - Make 指令说明:解释编译命令的语法、目标命名规则与常用参数。
qmk setup会自动安装编译所需的工具链(包括 ARM 交叉编译器、ChibiOS 依赖等),并将固件仓库克隆到本机。完成环境初始化后,即可在当前仓库的 Makefile 与 builddefs 构建系统的支持下开始编译。
编译命令与目标命名规则
原文档给出了该键盘的标准编译命令:
make cannonkeys/devastatingtkl:default这条命令的语义可拆解为三部分:<键盘目录路径>:<键位目标>,即:
cannonkeys/devastatingtkl:键盘在keyboards/目录下的路径,对应 keyboards/cannonkeys/devastatingtkl;default:键位方案(keymap),对应同目录下 keymaps/default/keymap.c。
如果需要指定其他键位目标,只需把default换成对应的键位目录名;也可以省略目标部分直接执行make cannonkeys/devastatingtkl,QMK 会按照构建规则自动寻找默认键位。
编译成功后,生成的固件文件(如.hex/.bin)会输出到当前目录下的build/目录中,用于后续刷写。
数据驱动配置解析:keyboard.json
DevastatingTKL 采用了 QMK 的数据驱动(Data-Driven)配置方式,绝大部分硬件描述集中在 keyboards/cannonkeys/devastatingtkl/keyboard.json 中。这份 JSON 是该键盘的“硬件说明书”,下面逐块拆解。
USB 标识与身份信息
"keyboard_name": "DevastatingTKL", "manufacturer": "CannonKeys", "url": "https://cannonkeys.com", "maintainer": "awkannan", "usb": { "vid": "0xCA04", "pid": "0xDE57", "device_version": "0.0.1" }keyboard_name/manufacturer:键盘在 QMK 与系统驱动中的显示名称与厂商;vid/pid:USB Vendor ID(0xCA04)与 Product ID(0xDE57),系统依据这对标识识别设备;device_version:设备版本号,用于 USB 描述符。
矩阵引脚与二极管方向
"matrix_pins": { "cols": ["B1", "B2", "B10", "B11", "B12", "B14", "A8", "A9", "A10", "A3", "B0", "A2", "A1", "A7", "A0", "B4", "B6", "B7"], "rows": ["A15", "B3", "B5", "A4", "A5", "F1"] }, "diode_direction": "COL2ROW"- 列(cols)共 18 个引脚,行(rows)共 6 个引脚,构成 6×18 的扫描矩阵;
diode_direction: "COL2ROW"表示二极管方向为“列→行”,即二极管阳极接列、阴极接行,这是 QMK 中两种标准接法(COL2ROW / ROW2COL)之一,扫描逻辑会根据该配置自动适配。
与之对应的可视化矩阵映射可参考 matrix_diagram.md,其中用 ASCII 图标注了每个键位(如00、1D等)在矩阵中的行列坐标,并特别标注了 2u Backspace、ISO Enter、Tsangan/WKL 底排等特殊物理键位的位置。
背光与 RGB 灯效
"backlight": { "pin": "A6", "levels": 6, "breathing": true }, "rgblight": { "led_count": 20, "animations": { ... } }- 背光(Backlight):由 A6 引脚输出 PWM 驱动,提供 6 级亮度调节,并支持呼吸(breathing)效果;
- RGB 灯(rgblight):共 20 颗 LED,默认开启 breathing、rainbow_mood、rainbow_swirl、snake、knight、christmas、static_gradient、rgb_test、alternating、twinkle 等动画,且可在编译时按需裁剪以节省 Flash。
这些配置在 C 头文件层面对应 config.h 中的底层定义:
#define BACKLIGHT_PWM_DRIVER PWMD3 #define BACKLIGHT_PWM_CHANNEL 1 #define BACKLIGHT_PAL_MODE 1即背光 PWM 由 STM32 的定时器 3(PWMD3)的第 1 通道驱动,对应 mcuconf.h 中启用的STM32_PWM_USE_TIM3与 halconf.h 中的HAL_USE_PWM。
WS2812 灯带(SPI 驱动)
"ws2812": { "pin": "B15", "driver": "spi" }RGB 灯带挂在 B15 引脚上,且采用SPI 驱动方式输出 WS2812 协议信号。底层配置同样位于 config.h:
#define WS2812_SPI_DRIVER SPID2 #define WS2812_SPI_MOSI_PAL_MODE 0 #define WS2812_SPI_SCK_PAL_MODE 0 #define WS2812_SPI_SCK_PIN B13即使用 SPI2 外设(SPID2),配合 B13 作为 SCK 引脚。SPI 驱动的优势在于由硬件外设按位发送时序,相比传统 GPIO 位操作对 CPU 占用更小,也要求 mcuconf.h 中启用STM32_SPI_USE_SPI2、halconf.h 中启用HAL_USE_SPI(本键盘均已启用)。
处理器、引导加载程序与功能开关
"processor": "STM32F072", "bootloader": "stm32-dfu", "features": { "bootmagic": true, "mousekey": true, "extrakey": true, "console": true, "command": true, "nkro": true, "backlight": true, "rgblight": true }, "qmk": { "locking": { "enabled": true, "resync": true } }processor: "STM32F072":与 readme 中标注的 STM32F072CBT6 一致;bootloader: "stm32-dfu":键盘使用 STM32 内置的 DFU(Device Firmware Upgrade)引导模式进行刷写,对应刷写工具为dfu-util;features:默认启用了 bootmagic(上电魔法键,用于快速进入刷写模式)、鼠标键、多媒体扩展键、console 调试输出、QMK 命令行(Command)、NKRO 无冲以及背光与 RGB;qmk.locking:启用 Caps Lock 等锁定键的“再同步”(resync)支持,避免锁定状态与系统状态不同步。
此外,rules.mk 中有一条特殊规则:
DFU_SUFFIX_ARGS = -v FFFF -p FFFF它通过通配符放宽 DFU 固件后缀的 vendor/product 校验,以便兼容使用 APM32 等替代 MCU 的同一块 PCB——这是该键盘支持“主控变体”的体现。
布局(Layout)定义与社区布局
keyboard.json 中定义了一个完整物理布局LAYOUT_all(18 列 × 6 行,覆盖全部键位),并同时声明了 8 个社区布局(community layouts):
| 社区布局名称 | 特点 |
|---|---|
tkl_f13_ansi | 标准 ANSI,带 F13 键 |
tkl_f13_ansi_split_bs_rshift | ANSI + 分裂 Backspace / 右 Shift |
tkl_f13_ansi_tsangan | ANSI Tsangan/WKL 底排 |
tkl_f13_ansi_tsangan_split_bs_rshift | ANSI Tsangan + 分裂 Backspace / 右 Shift |
tkl_f13_iso | 标准 ISO,带 F13 键 |
tkl_f13_iso_split_bs_rshift | ISO + 分裂 Backspace / 右 Shift |
tkl_f13_iso_tsangan | ISO Tsangan/WKL 底排 |
tkl_f13_iso_tsangan_split_bs_rshift | ISO Tsangan + 分裂 Backspace / 右 Shift |
这些社区布局的键位坐标数据都完整内嵌在 keyboard.json 的layouts字段中(如LAYOUT_tkl_f13_ansi定义了 87 键的标准 F13 布局,LAYOUT_tkl_f13_iso定义了带 ISO 回车与¬、£键位的布局),可以被其他同样使用tkl_f13_*布局规则的键盘共享,也是 QMK Configurator 网页配键工具支持该键盘的基础。
默认键位方案解析
默认键位位于 keymaps/default/keymap.c,定义了_BASE(基础层)与_FN1(功能层)两个层,并通过LAYOUT_all宏进行映射。
基础层(_BASE)为标准的 TKL 布局:
- 功能键区含 F1–F12 与媒体键
KC_MPLY(播放/暂停); - 数字键行保留 Backspace 双键位(
KC_BSPC, KC_BSPC),配合分裂 Backspace 硬件方案; - 主键区为 ANSI 键位,额外提供
KC_NUHS(非美国标准 # ~ 键)与KC_NUBS(非美国反斜杠 | 键),满足 45° 键盘布局的差异需求; - 右下角为 6.25u 空格与右侧
KC_RALT, MO(1), KC_RGUI, KC_RCTL的标准配置。
功能层(_FN1)通过MO(1)按住触发,集中了 RGB 与背光控制:
- RGB:
UG_TOGG(开关)、UG_NEXT(切换模式)、UG_HUED/UG_HUEU(色相减/加)、UG_SATD/UG_SATU(饱和度减/加)、UG_VALD/UG_VALU(亮度减/加); - 背光:
BL_TOGG(开关)、BL_DOWN/BL_UP(亮度减/加); - 媒体与音量:
KC_VOLU/KC_VOLD(音量加/减)、KC_MPLY(播放/暂停)、KC_MNXT(下一曲); QK_BOOT:位于 Q 键位处,按下即可让键盘进入 DFU 刷写模式。
这展示了 QMK 键位定义的标准范式:使用enum layer_names定义层名、用const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS]声明各层,配合KC_TRNS透明键实现层的叠加透传。
刷写固件:进入 DFU 模式
由于键盘采用stm32-dfu引导方式,刷写流程为:
- 编译完成后得到固件文件(
build/目录下的.bin文件); - 让键盘进入 DFU 模式:
- 通过
_FN1层的QK_BOOT键(按住MO(1)再按 Q),或 - 使用 bootmagic:在键盘上电时按住指定键(默认是左上角键)即触发复位;
- 通过
- 系统识别出 STM32 DFU 设备后,使用
dfu-util或 QMK 提供的刷写目标(如make cannonkeys/devastatingtkl:default:flash)将固件写入。
关于刷写细节,可进一步参考 刷写指南 与 新手刷写教程。
ChibiOS 平台配置速览
作为 STM32F072 键盘,DevastatingTKL 还附带三个 ChibiOS 平台配置文件,均通过qmk chibios-confmigrate自动生成后按需覆盖:
- mcuconf.h:启用 I2C1、TIM3(背光 PWM)、SPI2(WS2812);
- halconf.h:启用 HAL 层的 I2C、PWM、SPI 模块;
- chconf.h:设置系统时钟频率为 10000 Hz(10kHz tick)、关闭
CH_CFG_OPTIMIZE_SPEED与条件变量超时等可选特性。
这三个文件与本键盘的背光、RGB 驱动需求一一对应,是理解“数据驱动配置(keyboard.json)→ C 头文件(config.h)→ 平台层(halconf/mcuconf/chconf)”三级配置体系的最佳实例。
常见问题与进一步阅读
- 编译报错找不到工具链:请先完成
qmk setup,参考 新手入门 中的环境检查步骤; - 想修改键位:直接编辑或复制 keymaps/default/keymap.c,参考 键位映射文档 与 键码速查;
- 想使用其他 TKL 社区布局:在 keymap 中改用
LAYOUT_tkl_f13_ansi等宏,相关键位数据已在 keyboard.json 中完整定义; - 灯效不生效:确认编译时
rgblight/backlight特性开启(keyboard.json 中默认已开启),并检查 config.h 中的 PWM/SPI 引脚定义与 mcuconf.h 的外设开关是否匹配。
通过本文,你已掌握 DevastatingTKL 从环境搭建、固件编译、配置解析到刷写上手的完整链路,之后无论是微调键位、裁剪功能还是移植灯效,都能以 keyboards/cannonkeys/devastatingtkl 目录为起点快速展开。
【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考