当前位置: 首页 > backend >正文

QMK固件烧录指南:安全高效地更新您的机械键盘

QMK固件烧录指南:安全高效地更新您的机械键盘

一、固件烧录概述

既然您已经成功构建了自定义固件文件,下一步就是将它写入键盘控制器。这个过程被称为"固件烧录"或"刷写键盘",是自定义键盘编程的最后一步,也是将您的设计真正应用到键盘硬件上的关键环节。

二、进入DFU(Bootloader)模式

要刷写自定义固件,首先必须将键盘置于一个特殊的烧录模式,通常称为DFU(Device Firmware Update)或Bootloader模式。在这种状态下,键盘将暂时无法用于输入或其他常规功能。

重要警告

在固件烧录过程中,切勿拔出键盘或以任何方式中断烧录流程,否则可能导致键盘控制器变砖,需要更复杂的方法才能恢复。

不同型号的键盘可能有不同的方式进入DFU模式。如果您的PCB(印刷电路板)当前运行QMK、TMK或PS2AVRGB(Bootmapper Client)固件,而您没有收到特定的操作指南,请按顺序尝试以下方法:

  1. 组合键方式

    • 同时按住Shift键并按Pause
    • 同时按住Shift键并按B
    • 拔下键盘,按住空格键,同时插入键盘并等待一秒钟,然后松开B
    • 拔下键盘,按住左上角或左下角的按键(通常是EscapeLeft Control)并插入键盘
  2. 硬件方式

    • 按下物理RESET按钮,通常位于PCB底部
    • 在PCB上找到标有RESETGND的引脚,并在插入键盘时将它们短接

如果您的主板使用STM32或RP2-B1芯片,且上述方法均无效,可能需要特殊处理。此时,建议前往QMK官方Discord社区寻求帮助,并提前准备好键盘PCB的高清照片以便快速获得支持。

成功进入DFU模式后,您应该会在QMK Toolbox中看到类似下面的黄色消息:

*** DFU device connected: Atmel Corp. ATmega32U4 (03EB:2FF4:0000)

同时,这个DFU设备也会出现在操作系统的设备管理器、System Information.app或lsusb命令的输出中。

三、使用QMK Toolbox图形界面烧录固件

对于大多数用户来说,使用QMK Toolbox进行固件烧录是最简单直观的方法。

平台兼容性说明

QMK Toolbox目前仅支持Windows和macOS系统。Linux用户或偏好命令行操作的用户可以直接跳至"从命令行刷写键盘"部分。

特别提示:RP2040芯片的设备(如树莓派Pico基于的键盘)不需要QMK Toolbox即可刷写。

3.1 加载固件文件

  1. 首先启动QMK Toolbox应用程序
  2. 接下来需要找到您刚刚编译的固件文件,这些文件通常位于qmk_firmware目录中,固件格式可能是.hex.bin

如需快速打开当前目录,可以使用以下命令:

  • Windows系统:在命令提示符中输入start .
  • macOS系统:在终端中输入open .

固件文件命名遵循统一格式:<键盘名称>_<键盘映射名称>.{bin,hex}

例如,使用default键盘映射的planck/rev5键盘的固件文件名为:planck_rev5_default.hex

找到固件文件后,有两种方式将其加载到QMK Toolbox:

  • 直接将文件拖拽到QMK Toolbox的"Local file"框中
  • 点击"Open"按钮并导航到固件文件的存储位置

3.2 执行固件烧录

确认键盘已进入DFU模式且固件文件已加载后,点击QMK Toolbox中的"Flash"按钮开始烧录过程。您将看到类似以下内容的输出:

*** DFU device connected: Atmel Corp. ATmega32U4 (03EB:2FF4:0000)
*** Attempting to flash, please don't remove device
>>> dfu-programmer.exe atmega32u4 erase --forceErasing flash...  SuccessChecking memory from 0x0 to 0x6FFF...  Empty.
>>> dfu-programmer.exe atmega32u4 flash "D:\Git\qmk_firmware\gh60_satan_default.hex"Checking memory from 0x0 to 0x3F7F...  Empty.0%                            100%  Programming 0x3F80 bytes...[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]  Success0%                            100%  Reading 0x7000 bytes...[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]  SuccessValidating...  Success0x3F80 bytes written into 0x7000 bytes memory (56.70%).
>>> dfu-programmer.exe atmega32u4 reset*** DFU device disconnected: Atmel Corp: ATmega32U4 (03EB:2FF4:0000)

当您看到这样的输出并且没有错误信息时,说明固件已成功写入键盘。

四、从命令行刷写键盘

对于Linux用户或偏好命令行界面的用户,使用QMK CLI工具进行固件烧录是一个更高效的选择。与早期版本相比,现在的命令行刷写过程已经变得非常简单直观。

当您准备好编译并烧录固件时,打开终端窗口并运行flash命令:

qmk flash

如果您没有在QMK CLI中配置默认键盘或键盘映射,或者拥有多个键盘,可以通过参数指定特定的键盘和键盘映射:

qmk flash -kb <my_keyboard> -km <my_keymap>

执行此命令后,QMK会自动检查键盘配置并根据指定的bootloader尝试进行刷写。这意味着您无需了解键盘使用的具体bootloader类型,QMK会自动处理繁重的工作。

然而,这一功能依赖于键盘配置文件中正确设置的bootloader信息。如果此信息未配置或您使用的开发板没有受支持的刷写目标,将会看到以下错误:

WARNING: This board's bootloader is not specified or is not supported by the ":flash" target at this time.

遇到此情况时,您需要手动指定bootloader类型。详细操作方法请参考QMK官方文档中的刷写固件指南。

疑难排解提示

如果qmk flash命令未能检测到bootloader,请尝试运行qmk doctor命令获取关于如何修复常见问题的建议。

五、测试与验证

恭喜!您的自定义固件已成功写入键盘,现在可以开始测试了。

如果一切顺利,键盘应该能够完美工作。然而,若遇到问题,您可以采取以下步骤来排查原因:

  1. 按键测试:依次按下每个按键,确认它们都能发送您期望的键码。这是最基本且有效的测试方法。

  2. 使用测试工具:可以使用QMK Configurator的测试模式来验证每个按键的功能,这个工具甚至可以用于不运行QMK固件的键盘测试。

  3. 检查配置:如果某些功能不正常工作,回顾您的keymap.c文件,确保没有配置错误。

六、常见问题与解决方案

如果遇到持续性问题,建议采取以下行动:

  1. 查阅常见问题解答:QMK官方文档的FAQ部分包含了常见问题的解决方案。

  2. 社区支持:加入QMK官方Discord社区,那里有大量热心的专家可以帮助您解决特定问题。

  3. 重新检查硬件:有时问题可能源于硬件连接而非固件,特别是对于自行组装的键盘。

扩展知识:固件烧录的深层理解

  1. 控制器类型与烧录方式:不同的微控制器(如ATmega32U4、STM32、RP2040)需要不同的烧录工具和方法。了解您键盘使用的控制器类型有助于排查问题。

  2. Bootloader种类:常见的bootloader包括CaterinaDFU、USBAspISP等,它们有各自的进入方式和兼容性考虑。

  3. EEPROM保护:某些固件烧录方法可能会擦除EEPROM中存储的设置。如果您的键盘依赖于存储在EEPROM中的配置,请特别注意选择正确的烧录方法。

  4. 固件大小优化:如果遇到"固件太大"的错误,可以通过禁用某些不必要的功能(如RGB灯光、音频等)来减小固件体积。

  5. 备份原始固件:对于商业键盘,在刷写自定义固件前,尝试备份原始固件是一个好习惯,这为将来可能的恢复提供了保障。

  6. USB连接问题:有时固件烧录后键盘可能无法被识别,这通常与USB描述符或VID/PID设置有关。检查config.h文件中的相关设置可能会解决问题。


通过本指南,您已经掌握了QMK固件烧录的核心流程和技巧。结合上一章节的固件构建知识,您现在已具备完整的QMK自定义能力。持续探索和实践将帮助您创造出完全符合个人需求的键盘体验!

http://www.xdnf.cn/news/3396.html

相关文章:

  • Python结合QT进行开发
  • 西门子数字化研发设计制造一体化规划案例P87(87页PPT)(文末有下载方式)
  • 神经网络—损失函数
  • Python 数据智能实战 (6):用户评论深度挖掘
  • OpenGL-ES 学习(10) ---- OpenGL-ES Shader语言语法
  • CMake中强制启用option定义变量的方法
  • Unity SpriteEditor(精灵图片编辑器)
  • C++笔记-继承(下)(包含派生类的默认成员函数,菱形继承等)
  • AJAX 实例
  • vscode 的空格和 tab 设置 与 Rime 自建词库
  • AI大模型基础设施:主流的几款开源AI大语言模型的本地部署成本
  • 企业内训|智能驾驶与智能座舱技术——某汽车厂商
  • Ubuntu18 登录界面死循环 Ubuntu进不了桌面
  • 初学Vue之记事本案例
  • 【Linux】VSCode用法
  • 【嵌入式———通用定时器基本操作——实验需求2:案列:测量PWM的频率/周期】
  • 用手机相册教我数组概念——照片分类术[特殊字符][特殊字符]
  • 构建现代分布式云架构的三大支柱:服务化、Service Mesh 与 Serverless
  • 第十一届蓝桥杯 2020 C/C++组 门牌制作
  • vue 常见ui库对比(element、ant、antV等)
  • 兰亭妙微:数据驱动的 B 端设计:如何用 UI 提升企业级产品体验?
  • 【Qt】网络
  • ZYNQB笔记(十六):AXI DMA 环路测试
  • FreeSWITCH 发送 sip message 的 lua 程序
  • 深挖Java基础之:变量与类型
  • 总结C++中的STL
  • 分布式事务,事务失效,TC事务协调者
  • 图数据库榜单网站
  • 算法每日一题 | 入门-顺序结构-字母转换
  • X²+1素数问题