QMK 固件开发实战:Perk60 ISO Rev A 键盘的编译、DFU 刷写与硬件配置解析
【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware
导读
本文以 QMK 官方固件仓库中的Perk60 ISO Rev A(4pplet 出品的 60% ISO 布局客制化键盘)为对象,系统讲解如何搭建 QMK 构建环境、编译该键盘的默认固件、通过物理按键或 Bootmagic Lite 两种方式进入 DFU 引导模式完成刷写,并结合仓库内的keyboard.json、config.h、keymap.c与rev_a.c源码,逐层拆解该键盘的矩阵引脚、IS31FL3733 RGB 驱动、Caps Lock 指示灯逻辑与默认键位映射。读完本文,你将掌握一款 STM32F411 主控 QMK 键盘从源码到固件的完整链路,并能据此迁移到同仓库其他 4pplet 键盘。
一、Perk60 ISO Rev A 键盘与固件目录结构
Perk60 ISO Rev A 是 QMK 仓库中4pplet厂商目录下的一款 60% ISO 配列键盘,其固件源码位于 keyboards/4pplet/perk60_iso,目录结构如下:
keyboards/4pplet/perk60_iso/ ├── readme.md # 键盘主说明文档(构建与刷写指南) ├── keymaps/ │ └── default/ │ └── keymap.c # 默认键位映射 └── rev_a/ ├── readme.md # Rev A 版本说明 ├── keyboard.json # 数据驱动配置(硬件、矩阵、RGB、布局) ├── config.h # 编译期宏配置(IS31FL3733 驱动参数) ├── halconf.h # ChibiOS HAL 配置 ├── mcuconf.h # STM32F411 MCU 配置 └── rev_a.c # 板级代码(LED 映射与指示灯逻辑)该键盘采用数据驱动(data-driven)配置:绝大部分硬件信息集中定义在keyboard.json中,config.h仅保留少量编译期宏,rev_a.c负责芯片级的 LED 映射与状态指示,这也是现代 QMK 键盘推荐的目录组织方式。
二、硬件身份:主控、USB 标识与引导方式
在动手编译前,先通过 rev_a/keyboard.json 确认硬件身份,它同时决定了编译目标与刷写方式:
| 配置项 | 值 | 说明 |
|---|---|---|
keyboard_name | Perk60 ISO Rev A | 键盘名称,用于 QMK 工具链与配置器显示 |
manufacturer | 4pplet | 厂商标识 |
usb.vid/usb.pid | 0x4444/0x0009 | USB 厂商/产品 ID,设备枚举与驱动匹配依赖此值 |
usb.device_version | 0.0.1 | 设备版本号 |
processor | STM32F411 | 主控芯片,基于 ARM Cortex-M4F |
bootloader | stm32-dfu | 引导方式,对应 ST 官方 DFU 协议(dfu-util) |
diode_direction | COL2ROW | 二极管方向:列驱动、行扫描 |
其中bootloader: "stm32-dfu"意味着刷写工具使用dfu-util,与下文 DFU 进入方式一一对应。features字段启用了bootmagic、extrakey(媒体/系统键)、nkro(全键无冲)与rgb_matrix(RGB 矩阵),并关闭了mousekey:
"features": { "bootmagic": true, "extrakey": true, "mousekey": false, "nkro": true, "rgb_matrix": true }三、构建环境与编译命令
3.1 构建环境准备
QMK 固件编译依赖完整的工具链(gcc-arm-none-eabi、dfu-util、python3等)。仓库内提供了三份环境指引文档,可按系统选择:
- 全新入门:docs/newbs_getting_started.md 与 docs/newbs.md 覆盖从克隆仓库到首次编译的完整流程;
- 构建工具细节:docs/getting_started_make_guide.md 讲解
make的目标(target)体系与常用参数; - 固件构建工作流:docs/newbs_building_firmware.md 面向首次编译新键盘的用户。
环境就绪后,进入仓库根目录执行编译。Perk60 ISO Rev A 的官方示例命令为:
make 4pplet/perk60_iso/rev_a:default该命令的含义是:编译keyboards/4pplet/perk60_iso/rev_a这个键盘,使用keymaps/default目录下的键位映射。编译成功后在构建目录下会生成.bin/.hex固件文件。
3.2 常用 make 目标扩展
在基础命令后可追加目标后缀以满足不同需求:
:default—— 使用默认键位编译(等价于上例);:flash—— 编译后自动进入刷写流程(配合 DFU 引导模式使用);:clean—— 清理该键盘的中间构建产物;- 追加
-e RGB_MATRIX_ENABLE=no可临时关闭 RGB 特性用于排查问题(注意:当前键盘的keyboard.json已声明启用rgb_matrix,临时关闭可能影响板级代码的编译路径)。
编译过程中,make会依据keyboard.json生成config.h与矩阵定义,并链接 rev_a/rev_a.c 中的板级实现,最终产出可直接烧录的固件。
四、进入 DFU 引导模式与固件刷写
Perk60 ISO Rev A 主控为 STM32F411,出厂引导程序支持 ST 官方 DFU 协议。官方文档提供了两种进入方式,均已在 readme.md 中说明:
4.1 方式一:物理复位按键(最可靠)
- 找到键盘 PCB 上与 MCU 同侧的小按键(复位键);
- 按住该按键超过 1 秒,键盘进入 DFU 引导模式,此时系统可识别出 DFU 设备,即可执行刷写;
- 注意:短按(不足 1 秒)只会触发普通复位,键盘重启而不进入引导模式;
- 若希望不刷写固件直接退出引导模式,拔下 USB 线再重新插入即可,无需等待超时。
4.2 方式二:Bootmagic Lite(出厂固件已预刷时)
若键盘当前已运行可用的 QMK 固件,可用 Bootmagic Lite 免开壳进入引导模式:
- 拔掉键盘 USB 线;
- 同时按住 Spacebar(空格)与 B 键;
- 插入 USB 线,等待约 1 秒后再松开两键。
由于 keyboard.json 中features.bootmagic已设为true(readme 中亦注明 "Bootmagic lite is enabled by default"),默认键位下该组合即可触发 DFU 引导。Bootmagic Lite 的具体触发键组合与原理可参考仓库文档docs/feature_bootmagic.md(位于文档目录,若需要更深层的启动流程可结合tmk_core与quantum源码阅读)。
4.3 执行刷写
进入 DFU 模式后,使用带:flash目标的命令完成编译与烧录:
make 4pplet/perk60_iso/rev_a:default:flash工具链会自动调用dfu-util,依据 VID/PID0x4444:0x0009定位设备并写入固件。若系统提示找不到设备,请检查:是否真正进入了 DFU 模式(而非仅复位)、USB 连接是否稳定、dfu-util驱动是否安装正确(可参考 docs/newbs_flashing.md)。
五、矩阵引脚与按键布局解析
5.1 矩阵定义
keyboard.json中matrix_pins定义了 10 行 × 7 列的扫描矩阵:
"matrix_pins": { "cols": ["A1", "B12", "B14", "A2", "A0", "A3", "A4"], "rows": ["C14", "C13", "B5", "B4", "B8", "A15", "B3", "B9", "A5", "A7"] }配合diode_direction: "COL2ROW"(二极管从列指向行),扫描时先驱动列、再读行,从而确定被按下的键位。注意矩阵中的[8, 2]、[9, 1]、[9, 2]等坐标在布局中未使用,说明部分矩阵位置在 PCB 上留空(对应 ISO 配列的空位)。
5.2 LAYOUT_60_iso 布局
键盘通过layouts.LAYOUT_60_iso声明物理按键排列,并声明了社区布局支持:
"community_layouts": ["60_iso"]LAYOUT_60_iso是 QMK 社区标准的 60% ISO 布局宏,仓库内 layouts/default/60_iso 与 layouts/community/60_iso 均提供该布局的参考定义。由于启用了社区布局,用户在自定义键位时可以直接复用layouts/community/60_iso的键位文件,无需重新声明布局宏。
从keyboard.json的布局坐标可以清晰辨认 ISO 特征:第二行左侧 1.5u Tab、回车键位置被纵向双高键("w": 1.25, "h": 2的 Enter)占据、第三行KC_NUHS(ISO 反斜杠)位于 Enter 左侧、末行 6.25u 空格等。
六、RGB 矩阵与指示灯:IS31FL3733 驱动深入
6.1 驱动配置
Perk60 ISO Rev A 使用IS31FL3733RGB LED 驱动芯片(I²C 接口),配置位于 rev_a/config.h:
#define IS31FL3733_I2C_ADDRESS_1 IS31FL3733_I2C_ADDRESS_GND_GND #define IS31FL3733_PWM_FREQUENCY IS31FL3733_PWM_FREQUENCY_26K7_HZ- 首片驱动芯片的 I²C 地址由 AD 引脚接 GND-GND 决定;
- PWM 频率选择 26.7 kHz,可在亮度与功耗/EMI 之间取得平衡。
keyboard.json中rgb_matrix.driver声明为"is31fl3733",default.val将默认亮度设为 80,并开启了 24 种官方 RGB 动画(alphas_mods、gradient_up_down、cycle_all、rainbow_moving_chevron、solid_reactive_simple等),动画齐全。
6.2 LED 物理映射与 Caps Lock 指示
rev_a/rev_a.c 是理解 RGB 实现的关键文件:
- 定义了
g_is31fl3733_leds[IS31FL3733_LED_COUNT]数组,将每个按键 LED 的 R/G/B 三通道逐一映射到驱动芯片的 SW 与 CS 引脚(例如{0, SW11_CS2, SW10_CS2, SW12_CS2}对应丝印 D402),这是 RGB 效果正确显示的前提; - 实现了
rgb_matrix_indicators_advanced_kb():当CAPS_LOCK_ENABLE开启且检测到 Caps Lock 状态时,将属于CAPS_LED_GROUP(默认LED_FLAG_INDICATOR)的 LED 统一设为CAPS_LOCK_COLOR(默认RGB_RED红色),实现 Caps Lock 指示灯效果:
#ifndef CAPS_LOCK_ENABLE # define CAPS_LOCK_ENABLE true #endif #ifndef CAPS_LOCK_COLOR # define CAPS_LOCK_COLOR RGB_RED #endif #ifndef CAPS_LED_GROUP # define CAPS_LED_GROUP LED_FLAG_INDICATOR #endif如需调整指示灯颜色或目标 LED 分组(例如改为LED_FLAG_KEYLIGHT点亮全部字符键),只需在自定义config.h中覆盖以上宏即可,无需改动板级源码。
七、默认键位与功能层
默认键位位于 keymaps/default/keymap.c,包含两个图层:
第 0 层(主层):标准 60% ISO 布局——第一行为KC_ESC与数字行、KC_MINS、KC_EQL、2u 退格;第二行 Tab + QWERTY 字母行;第三行KC_CAPS、字母行、KC_NUHS(ISO 反斜杠)与竖排 Enter;第四行KC_LSFT、KC_NUBS、KC_Z…KC_RSFT;末行为KC_LCTL、KC_LGUI、KC_LALT、6.25uKC_SPC、KC_RALT、KC_RGUI、MO(1)、KC_RCTL。
第 1 层(功能层,通过MO(1)按住进入):
- 第一行:
QK_BOOT(一键进入 DFU 引导模式,等效于 4.2 节 Bootmagic 的固件内方式)、KC_F1~KC_F12、KC_DEL; - 第二行:
KC_UP方向键; - 第三行:
KC_LEFT、KC_DOWN、KC_RIGHT; - 第四行:RGB 控制键——
RM_TOGG(开关)、RM_NEXT(下一种动画)、RM_HUEU(色相+)、RM_SATU(饱和度+)、RM_VALU(亮度+)、RM_SPDU(速度+)、RGB_M_P、RGB_M_B、RGB_M_R(部分预设模式); - 其余键位以
KC_TRNS透传至底层。
图层机制与MO()、QK_BOOT等键码的详细说明可参考 docs/feature_layers.md 与 docs/keymap.md。
八、常见问题排查
| 现象 | 可能原因与处理 |
|---|---|
make报找不到键盘 | 命令路径须为4pplet/perk60_iso/rev_a,注意区分perk60_iso与厂商目录下其他键盘(如ibe60、steezy60) |
刷写时dfu-util找不到设备 | 确认长按复位键超过 1 秒进入 DFU;检查 VID/PID 是否匹配0x4444:0x0009 |
| 短按复位键只是重启 | 这是正常行为——短按触发普通复位,长按(>1s)才进入引导模式 |
| 出厂固件下无法开盖按键 | 使用 Bootmagic Lite:拔线后按住 Spacebar + B 再插线 |
| Caps Lock 指示灯不亮 | 检查是否在自定义层覆盖了CAPS_LOCK_ENABLE/CAPS_LED_GROUP;确认 RGB 矩阵动画处于开启状态 |
| RGB 整体不工作 | 确认 I²C 地址与 config.h 中IS31FL3733_I2C_ADDRESS_GND_GND匹配,必要时参照 docs/faq_build.md 排查编译配置 |
九、进一步探索
Perk60 ISO Rev A 仅是 4pplet 系列之一,同目录下还有 aekiso60、steezy60、waffling60、waffling80 等键盘,结构与本文讲解的高度一致,可对照阅读其keyboard.json与板级代码,快速验证你对数据驱动配置、矩阵定义与 RGB 驱动的理解。深入研读keyboards/4pplet/perk60_iso/rev_a/下全部源码,配合 docs/reference_info_json.md 与 docs/feature_layouts.md,即可将这套"编译—刷写—配置—定制"的流程复用到任意 QMK 兼容键盘上。
【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考