QMK 固件中的 TMO V2 键盘支持:STM32F072 硬件配置、默认键位与编译指南

发布时间:2026/9/19 12:42:34
QMK 固件中的 TMO V2 键盘支持:STM32F072 硬件配置、默认键位与编译指南 QMK 固件中的 TMO V2 键盘支持STM32F072 硬件配置、默认键位与编译指南【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmwareTMO V2TMOv2是 CannonKeys 推出的一款 65% 布局客制化机械键盘本仓库中keyboards/cannonkeys/tmov2/目录承载了它在 QMK Firmware 中的完整驱动支持。本文将基于该键盘的官方 readme 与仓库内真实源码讲解 TMO V2 的硬件配置、矩阵布局、背光与 RGB 灯效实现并给出从编译刷写到自定义键位的完整实战路径。一、TMO V2 键盘概览与支持信息TMO V2 键盘的官方说明文档位于 keyboards/cannonkeys/tmov2/readme.md内容精炼核心信息如下键盘维护者Keyboard MaintainerAndrew Kannan仓库中 maintainer 字段为awkannan硬件支持平台Hardware SupportedSTM32F072CBT6厂商ManufacturerCannonKeys产品官方链接https://cannonkeys.com在 keyboards/cannonkeys/tmov2/keyboard.json 中可以找到更完整的设备标识信息keyboard_name: TMOv2, manufacturer: CannonKeys, maintainer: awkannan, usb: { vid: 0xCA04, pid: 0x70F2, device_version: 0.0.1 }其中 USB VID/PID 分别为0xCA04/0x70F2这是固件枚举为 USB HID 键盘设备时的身份标识在刷写后系统设备管理器中看到的就是这一组 ID。二、编译环境与固件构建官方 readme 给出的编译命令为在搭建好 QMK 构建环境之后执行make cannonkeys/tmov2:default这条命令的含义是编译目标为cannonkeys/tmov2键盘、default键位方案即 keyboards/cannonkeys/tmov2/keymaps/default/keymap.c。构建产物为.bin/.hex固件文件可用于后续刷写。关于构建环境与 make 的详细说明原文档指向了 QMK 官方文档的getting_started_build_tools构建工具安装与getting_started_make_guidemake 使用指南对应到本仓库中的文档为docs/getting_started_build_tools.md —— 对应官方构建工具安装指引docs/getting_started_make_guide.md —— 对应官方 make 编译指南docs/newbs.md —— QMK 完整新手入门指南Complete Newbs Guide。对于 QMK 新手建议先完成构建环境搭建再执行make cannonkeys/tmov2:default验证工具链随后进入自定义键位阶段。刷写与 DFU 说明TMO V2 使用stm32-dfu作为 bootloader见 keyboards/cannonkeys/tmov2/keyboard.json 中的bootloader: stm32-dfu处理器为STM32F072。刷写时通常需要将键盘置于 DFU 模式然后使用make cannonkeys/tmov2:default:flash完成烧录。值得注意的一个细节是 keyboards/cannonkeys/tmov2/rules.mk 中的特殊配置# Wildcard to allow APM32 MCU DFU_SUFFIX_ARGS -v FFFF -p FFFF该行注释说明此设置是为了兼容 APM32 系列 MCU而使用了通配的 VID/PID 校验参数。DFU 刷写工具在追加后缀时会校验设备 VID/PIDFFFF通配意味着刷写工具不再严格校验设备身份从而允许同一固件在 STM32 与 APM32STM32 的兼容替代芯片之间通用刷写。这是从源码注释可以确认的官方意图。三、硬件配置详解矩阵、背光与 RGBTMO V2 的全部硬件定义集中在 keyboards/cannonkeys/tmov2/keyboard.json 中采用 QMK 的数据驱动配置data-driven configuration方式无需手写config.h中的矩阵与灯效定义。1. 矩阵引脚与二极管方向matrix_pins: { cols: [B14, A14, B1, C13, C14, C15, F0, F1, B9, B8, B7, B6, B5, B4, B3, A15], rows: [A10, A9, A8, B12] }, diode_direction: COL2ROW列cols共 16 列对应 MCU 的 16 个 GPIO 引脚行rows共 4 行对应 4 个 GPIO 引脚二极管方向COL2ROW即二极管阳极接行、阴极接列这是最常见的扫描方向配置。矩阵规模为 4 行 × 16 列但并非所有交叉点都有物理按键实际按键由 layouts 中的矩阵映射决定见下文。2. 背光Backlightbacklight: { pin: A6, levels: 6, breathing: true }背光输出引脚为A6支持 6 级亮度调节并开启了呼吸灯效果。在 keyboards/cannonkeys/tmov2/config.h 中可以看到背光的底层实现细节#define BACKLIGHT_PWM_DRIVER PWMD3 #define BACKLIGHT_PWM_CHANNEL 1 #define BACKLIGHT_PAL_MODE 1这说明 TMO V2 的背光并非简单的 GPIO 开关而是通过PWM 定时器驱动实现的无级/多级调光BACKLIGHT_PWM_DRIVER PWMD3使用 STM32 的 PWM 驱动器 3对应 TIM3BACKLIGHT_PWM_CHANNEL 1使用第 1 通道输出 PWMBACKLIGHT_PAL_MODE 1引脚复用功能为第 1 种复用模式。与之配套keyboards/cannonkeys/tmov2/mcuconf.h 中显式开启了#undef STM32_PWM_USE_TIM3 #define STM32_PWM_USE_TIM3 TRUE而 keyboards/cannonkeys/tmov2/halconf.h 则开启了HAL_USE_PWM TRUE。三者配合halconf 开启 PWM 外设、mcuconf 使能 TIM3、config.h 指定 PWM 驱动通道构成完整的 PWM 背光链路。默认键位中BL_UP、BL_DOWN即用于调节背光亮度见 keymaps/default/keymap.c。3. RGB 灯效RGBLIGHT / WS2812TMO V2 的 RGB 灯带使用 WS2812 系列可寻址灯珠配置如下ws2812: { pin: B15, driver: spi }, rgblight: { led_count: 22, 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 } }要点解读灯珠数量led_count为 22 颗驱动方式WS2812 使用SPI 驱动而非常规的位敲打bit-banging。在 keyboards/cannonkeys/tmov2/config.h 中定义了 SPI 相关的底层配置#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对应地mcuconf.h 中STM32_SPI_USE_SPI2 TRUE、halconf.h 中HAL_USE_SPI TRUE确保 SPI2 外设可用。动画集rgblight.animations中一次性开启了 10 种官方动画呼吸、彩虹流动、彩虹漩涡、贪吃蛇、骑士、圣诞、静态渐变、RGB 测试、交替、闪烁这些动画在固件编译时会被包含可通过键码切换见下文默认键位中的UG_NEXT/UG_PREV/UG_TOGG。4. 功能特性开关features: { bootmagic: true, mousekey: true, extrakey: true, console: true, command: true, nkro: true, backlight: true, rgblight: true }, qmk: { locking: { enabled: true, resync: true } }bootmagic开机魔法键如按住左上角键插入 USB 可进入 bootloader 或重置 EEPROMmousekey鼠标键支持extrakey多媒体/系统键支持console调试控制台输出commandQMK 命令行调试功能nkroN 键无冲N-Key Rolloverbacklight/rgblight背光与 RGB 灯效qmk.locking启用了 Caps Lock/Num Lock/Scroll Lock 锁定键支持并开启 resync重新同步锁定状态。5. 处理器与 bootloaderprocessor: STM32F072, bootloader: stm32-dfu与 readme 中 Hardware Supported: STM32F072CBT6 完全一致bootloader 为 STM32 官方 DFU 引导程序。四、布局定义LAYOUT_defaultkeyboards/cannonkeys/tmov2/keyboard.json 中定义了一个布局宏LAYOUT_default它描述的是 4 行物理矩阵与键帽物理坐标之间的映射关系。从布局数据结构{matrix: [row, col], x: ..., y: ..., w: ..., h: ...}可以清晰还原出 TMO V2 的按键物理排布第 0 行16 个矩阵列中[0,0]为左上角键默认键位中是BL_UP随后是 1.5U 宽的KC_TAB以及Q~P、[、]、Backspace第 1 行1.75U 宽的Caps Lock位、A~L、;、、1.75U 的Enter第 2 行1.25U 宽的左 Shift、\KC_NUBS、Z~M、,、.、/、1.25U 右 Shift、1U 的MO(_FN2)第 3 行[3,0]为左下角键默认是UG_TOGG随后是左 Alt、左 GUI、1.5U 空格位、2.25U 空格、1.5U 空格位、右 Alt、MO(_FN3)。值得注意的是矩阵中行 3 的列索引存在跳变[3,3]、[3,4]、[3,6]、[3,8]、[3,10]、[3,11]这是客制化键盘中常见的矩阵中某些交叉点悬空未接线现象属于正常设计。该布局宏与键位文件中LAYOUT_default(...)一一对应是键位编译时行列映射的桥梁。五、默认键位方案解析默认键位文件位于 keyboards/cannonkeys/tmov2/keymaps/default/keymap.c共定义了 4 个层enum layer_names { _BASE, // 基础层 _FN1, // 功能层 1 _FN2, // 功能层 2 _FN3, // 功能层 3 };1. 基础层_BASE第 0 行左起为BL_UP、KC_TAB、字母区Q W E R T Y U I O P、[、]、KC_BSPC第 1 行左起为BL_DOWN、KC_LCTL、A S D F G H J K L、;、、KC_ENT第 2 行左起为UG_NEXTRGB 动画下一个、KC_LSFT、KC_NUBS、Z X C V B N M、,、.、/、KC_RSFT、MO(_FN2)第 3 行左起为UG_TOGGRGB 开关、KC_LALT、KC_LGUI、LT(_FN1, KC_SPC)按住进入 FN1 层、点按为空格、KC_SPC、KC_RALT、MO(_FN3)按住进入 FN3 层。从源码可以总结出 TMO V2 默认键位的设计思路背光控制放在基础层最容易触及的左上角两个键位BL_UP/BL_DOWNRGB 控制位于左下角UG_TOGG、UG_NEXT并在 FN2 层补充了UG_PREV空格键采用LT(_FN1, KC_SPC)的层切换 空格双功能设计按住空格即进入数字行层右 Shift 右侧放置MO(_FN2)右 Alt 右侧放置MO(_FN3)作为功能层的常驻入口。2. FN1 层按住左空格进入该层将主字母区替换为数字与符号KC_ESC、1~0、-、、KC_DEL其余键位全部为KC_TRNS透明透传至下层。这一层承担了数字行 删除 Esc的快捷功能。3. FN2 层按住MO(_FN2)进入第 0 行UG_TOGG、KC_GRV、F1~F12第 2 行左起为UG_PREVRGB 动画上一个。即 FN2 层提供F1~F12功能键、反引号 以及 RGB 动画的前进/后退/开关控制是完整的媒体与灯效控制层。4. FN3 层按住MO(_FN3)进入该层仅在左上角放置了QK_BOOT进入 bootloader 的键码其余全部为KC_TRNS。这是典型的隐藏刷写入口设计——在键盘正常使用状态下按住MO(_FN3)再按左上角键即可进入 DFU 刷写模式无需打开外壳按复位键。键位中使用的 QMK 键码速查键码含义BL_UP/BL_DOWN背光亮度 1 / -1UG_TOGG/UG_NEXT/UG_PREVRGB 灯效开/关、下一个动画、上一个动画LT(_FN1, KC_SPC)按住进入 FN1 层点按发送空格MO(_FN2)/MO(_FN3)按住时临时切换到对应层KC_TRNS透明键沿用下一有效层的定义QK_BOOT复位进入 bootloaderDFU 模式六、ChibiOS 底层配置chconf / halconf / mcuconfTMO V2 使用 STM32F072 芯片因此还带有三个 ChibiOS 配置文件它们由 QMK 的qmk chibios-confmigrate工具自动生成用于裁剪和开启外设keyboards/cannonkeys/tmov2/chconf.h系统时钟频率设置为CH_CFG_ST_FREQUENCY 1000010 kHz 系统节拍关闭条件变量超时支持不追求极致速度优化CH_CFG_OPTIMIZE_SPEED FALSE这些裁剪有助于节省 Flash 空间keyboards/cannonkeys/tmov2/halconf.h开启HAL_USE_I2C、HAL_USE_PWM、HAL_USE_SPI三个外设抽象keyboards/cannonkeys/tmov2/mcuconf.h在 MCU 层面使能STM32_I2C_USE_I2C1、STM32_PWM_USE_TIM3、STM32_SPI_USE_SPI2。结合前文可以拼出完整的外设链路功能HAL 开关MCU 外设驱动配置背光 PWMHAL_USE_PWM TRUESTM32_PWM_USE_TIM3 TRUEBACKLIGHT_PWM_DRIVER PWMD3 CH1 PAL 模式 1RGB SPIHAL_USE_SPI TRUESTM32_SPI_USE_SPI2 TRUEWS2812_SPI_DRIVER SPID2MOSI/SCK PAL 模式 0SCK 引脚 B13I2C预留HAL_USE_I2C TRUESTM32_I2C_USE_I2C1 TRUE——从源码结构看I2C 外设虽已开启但 TMO V2 当前配置中并未直接使用 I2C 设备这一项更可能是为分体键盘通信或其他扩展预留。七、自定义键位与后续学习路径修改 TMO V2 键位最直接的方式是复制默认键位目录并修改 keymaps/default/keymap.c 中的keymaps[][MATRIX_ROWS][MATRIX_COLS]数组然后重新执行make cannonkeys/tmov2:自定义键位名进阶参考资料均可在本仓库内找到docs/keymap.md键位文件编写与层layer机制的完整说明docs/feature_layers.md层切换键码MO/LT/TG/TO等详解docs/feature_backlight.md背光配置与亮度控制说明docs/feature_rgb_matrix.md 与 docs/feature_rgblight.mdRGB 灯效体系说明docs/feature_bootmagic.mdBootmagic 魔法键机制docs/getting_started_make_guide.mdmake 目标编译、刷写、清理全解docs/flashing.mdSTM32 DFU 刷写流程。八、总结TMO V2 在 QMK 仓库中的实现完整覆盖了从 USB 设备标识、4×16 矩阵扫描、PWM 背光、SPI 驱动的 WS2812 RGB 灯带到 4 层默认键位的全部要素是一个典型的STM32F072 数据驱动配置的 QMK 客制化键盘范例。开发者只需一条make cannonkeys/tmov2:default即可获得可用固件通过阅读 keyboard.json 与 keymap.c 便能快速上手自定义自己的布局与灯效方案。【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考