QMK机械键盘固件开发指南:从源码到实践

前言

QMK(Quantum Mechanical Keyboard)是一款开源的键盘固件,支持众多自定义键盘的功能配置。通过QMK,您可以完全掌控键盘的每一个按键,实现复杂的宏指令、多层按键映射、RGB灯效等高级功能。本教程将带您从零开始构建一个基础的QMK键盘固件,使您的键盘真正实现个性化定制。

一、QMK项目文件结构

在开始编写固件代码前,我们需要先了解QMK的文件结构。对于每一个键盘项目,我们需要在keyboards文件夹下创建特定的文件和文件夹。

1.1 基本结构

keyboards/
└── your_keyboard_name/       # 键盘名称(全小写,无空格,无特殊符号)├── rules.mk              # MCU类型、Bootloader选择及功能开关配置├── config.h              # 硬件参数配置├── info.json             # USB VID/PID、制造商信息等├── your_keyboard_name.h  # 键盘矩阵定义├── your_keyboard_name.c  # 键盘核心功能实现└── keymaps/              # 键盘映射文件夹└── default/          # 默认键盘映射└── keymap.c      # 按键功能定义

1.2 文件命名规则

关于命名规则,有几点需要特别注意:

  1. 键盘名称文件夹必须全部小写,不能包含空格和特殊符号(下划线除外)
  2. .h.c文件的名称应与最深层文件夹名称一致
  3. 例如:如果键盘文件夹结构为keyboards/modelo75/costume/,则对应的文件应命名为costume.hcostume.c,而非modelo75.h

1.3 ARM架构专用文件

对于使用ARM架构芯片(如STM32系列)的键盘,还需要两个额外的文件:

  • mcuconf.h - MCU配置文件
  • halconf.h - HAL层配置文件

注意:这两个文件对于AVR架构(如ATmega32U4)的键盘不是必需的。

二、创建键盘固件项目

现在,让我们一步步创建一个完整的键盘固件项目。本教程以一个名为"Modelo75"的75%布局键盘为例。

2.1 创建项目文件夹

首先,在QMK固件的keyboards目录下创建一个新文件夹:

# 进入QMK固件目录
cd qmk_firmware# 创建键盘文件夹
mkdir keyboards/modelo75

2.2 编写 rules.mk 文件

rules.mk是项目的核心配置文件,用于指定MCU类型、Bootloader以及各种功能开关。

# MCU名称
MCU = STM32F103
# 注释:芯片型号# Bootloader选择
BOOTLOADER = stm32duino
# 注释:F103需要使用stm32duino bootloader,因为它原生不支持USB DFU# 功能开关
NKRO_ENABLE = yes       # 启用全键无冲
EXTRAKEY_ENABLE = yes   # 启用音频控制和系统控制
# LTO_ENABLE = yes      # 链接时优化,可减小固件体积(对于Flash空间小的MCU有用)

扩展知识:LTO(Link Time Optimization)是一种编译优化技术,可以在链接阶段对整个程序进行优化,减小固件体积并提高执行效率。对于Flash空间有限的AVR系列MCU(如ATmega32U4),启用LTO非常有用。

2.3 定义键盘矩阵 (modelo75.h)

键盘矩阵文件定义了键盘的物理布局,是固件开发中最重要的文件之一。这个文件将指导QMK如何理解您的键盘按键排列。

#pragma once#include "quantum.h"/* 这个宏防止头文件被重复包含 *//* 定义键盘布局 */
#define LAYOUT( \K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212,       K214, \K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311,       K313, K314, \K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410,       K412, K413, K414, \K500, K501, K502,                   K506,                   K510, K511, K512, K513, K514  \
) { \{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, KC_NO, K214 }, \{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, K314 }, \{ K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, KC_NO, K412, K413, K414 }, \{ K500, K501, K502, KC_NO, KC_NO, KC_NO, K506, KC_NO, KC_NO, KC_NO, K510, K511, K512, K513, K514 }  \
}

技巧:使用Excel等电子表格工具可以快速生成键盘矩阵布局。您可以在Excel中创建一个与键盘行列对应的表格,填入键位标识符,然后复制到代码中进行格式调整。

2.4 创建键盘C文件 (modelo75.c)

对于基础功能,这个文件可以非常简单:

#include "modelo75.h"/* 键盘特定功能的实现可以放在这里 */
/* 例如RGB矩阵效果、旋钮功能等 */

2.5 配置硬件参数 (config.h)

config.h文件包含了键盘硬件相关的配置,如矩阵尺寸、引脚定义等:

#pragma once#include "config_common.h"/* 键盘矩阵尺寸 */
#define MATRIX_ROWS 6
#define MATRIX_COLS 15/* 键盘矩阵引脚定义 */
#define MATRIX_ROW_PINS { B5, B4, B3, A15, A2, A1 }
#define MATRIX_COL_PINS { A0, A3, A4, A5, A6, A7, B0, B1, B10, B11, B12, B13, B14, B15, B9 }/* 二极管方向 */
#define DIODE_DIRECTION COL2ROW

2.6 创建USB和设备信息 (info.json)

在QMK 0.19版本后,需要在info.json文件中定义USB相关信息:

{"keyboard_name": "Modelo75","manufacturer": "YourName","url": "","maintainer": "YourName","usb": {"vid": "0xF055","pid": "0x7501","device_version": "0.0.1"}
}

注意:VID(厂商ID)和PID(产品ID)应该是唯一的。对于个人项目,可以使用随机的16进制数值,但要避免与商业产品冲突。

2.7 ARM架构特定文件

如果使用STM32等ARM架构芯片,还需要添加以下两个文件:

mcuconf.h:

#pragma once#include_next <mcuconf.h>

halconf.h:

#pragma once#include_next <halconf.h>

2.8 创建默认按键映射

现在创建键盘映射目录和默认映射文件:

mkdir -p keyboards/modelo75/keymaps/default
touch keyboards/modelo75/keymaps/default/keymap.c

编辑keymap.c文件,定义键盘的默认按键功能:

#include QMK_KEYBOARD_H/* 层定义 */
enum layer_names {_BASE,    // 基础层_FN       // 功能层
};const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {/* 基础层 (0) */[_BASE] = LAYOUT(KC_ESC,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_PSCR, KC_DEL,KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSPC, KC_HOME,KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,KC_CAPS, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT,          KC_ENT,  KC_PGDN,KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH,          KC_RSFT, KC_UP,   KC_END,KC_LCTL, KC_LGUI, KC_LALT,                            KC_SPC,                    MO(_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),/* 功能层 (1) */[_FN] = LAYOUT(KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, RGB_RMOD,RGB_HUD, RGB_SAD, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,                            KC_TRNS,                   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS)
};

三、层与键码详解

QMK的强大功能之一是支持多层按键映射,借助层切换功能,您可以在有限的物理按键上实现几乎无限的功能。

3.1 常用层切换键码

以下是QMK中用于层控制的常用键码:

键码说明
DF(n)将层n设为默认层
MO(n)按住时临时切换到层n,松开后返回
OSL(n)单击后下一个按键从层n生效,然后返回
LM(n,mod)类似MO(n),但同时应用指定的mod修饰符
LT(n,kc)按住时临时切换到层n,单击时发送KC键码
TG(n)切换层n的开启/关闭状态
TO(n)直接切换到层n
TT(n)点按功能类似MO,多次点击保持层n开启

3.2 特殊键码举例

QMK提供了许多特殊键码,以下是一些常用的例子:

  • QK_BOOT:进入Bootloader模式,可用于刷新固件
  • RGB_TOG:开关RGB灯效
  • RGB_MOD:切换RGB灯效模式
  • KC_MUTE:系统静音
  • KC_VOLD/KC_VOLU:音量减/增

四、编译和烧录固件

完成所有文件的创建和编辑后,就可以编译并烧录固件了。

4.1 编译固件

使用以下命令编译固件:

qmk compile -kb modelo75 -km default

如果您有多级目录,需要指定完整路径:

qmk compile -kb your_folder/modelo75 -km default

4.2 烧录固件

编译成功后,固件文件会生成在.build文件夹中。根据MCU类型,文件格式可能是.hex.bin.uf2

使用QMK Toolbox或命令行工具烧录固件:

qmk flash -kb modelo75 -km default

重要提示:烧录固件前,需要将键盘设置为Bootloader模式。这通常可以通过按下键盘上的RESET按钮,或在PCB上短接RESET和GND引脚实现。

五、扩展功能与进阶技巧

5.1 快速构建键盘矩阵的Excel技巧

创建键盘矩阵是固件开发中最繁琐的工作之一。使用Excel可以大大简化这一过程:

  1. 创建一个与键盘行列数相匹配的表格
  2. 按照行列顺序填入键位标识符(如K000, K001等)
  3. 在单元格间添加逗号分隔符
  4. 复制整个表格数据到代码编辑器
  5. 使用查找替换功能调整格式

5.2 代码优化与调试技巧

  1. 保持代码整洁:适当的缩进和注释可以使代码更易于阅读和维护
  2. 模块化设计:将复杂功能拆分为单独的函数,提高代码可维护性
  3. 使用条件编译:对于可选功能,使用条件编译可以减小固件体积
  4. 日志输出:在调试复杂问题时,可以使用printdprintf函数输出调试信息

5.3 常见问题解决方案

  1. 编译错误:检查括号、逗号是否正确,确保所有必需文件都已创建
  2. 按键不响应:检查键盘矩阵定义是否正确,二极管方向是否设置正确
  3. 层切换问题:确认层切换键的位置和功能是否正确配置
  4. 固件太大:尝试启用LTO,或禁用不需要的功能
  5. USB不识别:检查VID/PID配置,确保已正确设置USB参数

六、结语

通过本教程,您已经学习了如何从零开始创建QMK键盘固件。这只是QMK功能的冰山一角,随着您的深入学习,还可以探索更多高级功能,如RGB灯光效果、OLED显示、旋钮编码器控制等。

持续学习QMK文档和社区资源,将帮助您进一步掌握键盘固件开发技术,创造出完全符合个人需求的独特键盘体验。

如果您在开发过程中遇到任何问题,欢迎在评论区留言交流,也可以加入QMK官方Discord社区获取更多帮助。


参考资源

  • QMK官方文档
  • QMK GitHub仓库
  • 键码列表
  • QMK设置指南

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/81877.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/81877.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/81877.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPF 导航

WPF 导航相关控件/机制 控件 / 类说明常用属性/方法Frame用来承载不同的页面 (Page) 并在它们之间切换的容器。Source&#xff08;导航到的 URI&#xff09; Navigate()&#xff08;导航方法&#xff09; CanGoBack / GoBack() CanGoForward / GoForward()Page表示一个单独的可…

时序建模演进之路:从 MLP、RNN 到 LSTM 与 GRU

时序建模演进之路&#xff1a;从 MLP、RNN 到 LSTM 与 GRU 您是否好奇机器如何能像人类一样理解、生成流畅的文本&#xff0c;甚至是从海量代码中自动生成文档&#xff1f;这些自然语言处理 (NLP) 领域的迷人挑战&#xff0c;其核心在于模型处理和记忆 序列数据 的能力。 然而…

【Redis——数据类型和内部编码和Redis使用单线程模型的分析】

文章目录 Redis的数据类型和内部编码单线程模型的工作过程Redis在处理命令时虽然是一个单线程模型&#xff0c;为啥效率那么高&#xff0c;速度快呢&#xff1f; 总而言之&#xff0c;Redis提供的哈希表容器并不一定真的是真的哈希表&#xff0c;而是在特点的场景下&#xff0c…

鸿蒙NEXT开发动画(风格的旋转加载动画组件)

1.创建空白项目 2.Page文件夹下面新建Spin.ets文件&#xff0c;代码如下&#xff1a; /*** SpinKit 风格的旋转加载动画组件。** component* param spinSize - 动画容器大小&#xff08;必须为正数&#xff09;* param spinColor - 动画颜色&#xff08;支持资源引用&#xf…

后端接口请求http改为https

1、使用 OpenSSL 生成自签名证书 在Linxu服务器上执行如下命令&#xff1a; openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes 运行此命令后&#xff0c;会提示输入一些信息&#xff08;如国家、省份、城市、组织名称等&#xff09;&…

工作记录 2017-12-12 + 在IIS下发布wordpress

工作记录 2017-12-12 序号 工作 相关人员 1 修改邮件上的问题。 更新RD服务器。 在IIS下发布wordpress。 郝 服务器更新 RD服务器更新了&#xff0c;更新的文件放在190的D:\Temp\CHTeam\fnehr_update_20171212\下了。 数据库更新: 数据库没有更新 更新的文件&#xf…

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】1.2 安装与配置PostgreSQL(Windows/Linux/macOS)

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 1.2 安装与配置 PostgreSQL(Windows/Linux/macOS)1.2.1 操作系统兼容性与硬件要求1.2.2 Windows 安装与配置1.2.2.1 安装步骤1.2.2.2 服务管理1.2.2.3 配置文件路径1.2.3 Linux 安装与配置(以 Ubuntu…

epub格式转txt格式工具,txt批量转PDF

epub格式转txt格式工具&#xff0c;功能如图&#xff1a; txt格式批量转PDF 参考原文&#xff1a;epub格式转txt格式工具&#xff0c;txt批量转PDF 轻轻一点就关注, 好运连连挡不住&#xff0c;点个关注吧。

56.[前端开发-前端工程化]Day03-webpack构建工具

邂逅Webpack和打包过程 1 认识webpack工具 前端开发的流程 内置模块path path常见的API 在webpack中的使用 认识webpack 脚手架依赖webpack Webpack到底是什么呢 Webpack官方的图片 Vue项目加载的文件有哪些呢&#xff1f; Webpack的使用前提 Webpack的安装 2 webpack基本打包…

Rockchip Android平台打开GKI无法开机问题

Rockchip Android平台打开GKI无法开机问题 问题描述 Rockchip Android平台由于编译环境对pahole版本有要求&#xff0c;如果版本不对会导致ko无法加载从而导致系统无法开机。pahole的版本具体要求如下&#xff1a; Android版本pahole版本Android12/13版本pahole v1.21Androi…

SQL命令二:SQL 高级查询与特殊算法

引言 在掌握了 SQL 的基础操作和建表约束后&#xff0c;我们可以进一步探索 SQL 的高级查询功能和一些特殊算法。这些高级技巧能够帮助我们更高效地处理和分析数据&#xff0c;满足复杂的业务需求。 一、查询进阶 &#xff08;一&#xff09;简单查询 简单查询通过 select 语…

HTML04:图像标签

图像标签 常见的图像标签 JPGGIFPNGBMP <img src"路径" alt"名称" title"悬停名称" width"高" height"宽"/><!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&quo…

Docker —— 技术架构的演进

Docker —— 技术架构的演进 技术架构演进总结单机架构优点缺点总结 应用数据分离架构优点缺点总结 应用服务集群架构1. Nginx2. HAProxy3. LVS&#xff08;Linux Virtual Server&#xff09;4. F5 BIG-IP对比总结选型建议 读写分离/主从分离架构1. MyCat简介 2. TDDL&#xff…

[machine learning] Transformer - Attention (一)

Attention是Transformer的核心&#xff0c;本系列先通过介绍Attention来学习Transformer。本文先介绍简单版的Attention。 在Attention出现之前&#xff0c;通常使用recurrent neural networds (RNNs)来处理长序列数据。模型架构上&#xff0c;又通常使用encoder-decoder的结构…

Android 输入控件事件使用示例

一 前端 <EditTextandroid:id="@+id/editTextText2"android:layout_width="match_parent"android:layout_height="wrap_content"android:ems="10"android:inputType="text"android:text="Name" />二 后台代…

【向量数据库】用披萨点餐解释向量数据库:一个美味的技术类比

文章目录 前言场景设定&#xff1a;披萨特征向量化顾客到来&#xff1a;生成查询向量相似度计算实战1. 欧氏距离计算&#xff08;值越小越相似&#xff09;2. 余弦相似度计算&#xff08;值越大越相似&#xff09; 关键发现&#xff1a;度量选择影响结果现实启示结语 前言 想象…

人工智能和机器学习在包装仿真中的应用与价值

引言 随着包装成为消费品关键的差异化因素&#xff0c;对智能设计、可持续性和高性能的要求比以往任何时候都更高 。为了满足这些复杂的期望&#xff0c;公司越来越多地采用先进的仿真方法&#xff0c;而现在人工智能 (AI) 和机器学习 (ML) 又极大地增强了这些方法 。本文探讨…

【人工智能】深入探索Python中的自然语言理解:实现实体识别系统

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 自然语言理解(NLU)是人工智能(AI)领域中的重要研究方向之一,其目标是让计算机理解和处理人类语言。在NLU的众多应用中,实体识别(Nam…

个人健康中枢的多元化AI硬件革新与精准健康路径探析

在医疗信息化领域,个人健康中枢正经历着一场由硬件技术革新驱动的深刻变革。随着可穿戴设备、传感器技术和人工智能算法的快速发展,新一代健康监测硬件能够采集前所未有的多维度生物数据,并通过智能分析提供精准的健康建议。本文将深入探讨构成个人健康中枢的最新硬件技术,…

深入了解Linux系统—— 进程切换和调度

前言&#xff1a; 了解了进程的状态和进程的优先级&#xff0c;我们现在来看进程是如何被CPU调度执行的。 在单CPU的系统在&#xff0c;程序是并发执行的&#xff1b;也就是说在一段时间呢&#xff0c;进程是轮番执行的&#xff1b; 这也是说一个进程在运行时不会一直占用CPU直…