QMK自定义4*4键盘固件创建教程:最新架构详解

QMK自定义4*4键盘固件创建教程:最新架构详解

前言

通过本教程,你将学习如何在QMK框架下创建自己的键盘固件。QMK是一个强大的开源键盘固件框架,广泛用于DIY机械键盘的制作。本文将详细介绍最新架构下所需创建的文件及其功能。

准备工作

在开始之前,我们需要理解QMK架构中必须创建的几个核心文件:

  • info.json:键盘的基本信息配置
  • config.h:硬件和功能的配置头文件
  • rules.mk:编译选项和功能开关
  • <keyboard_name>.c:键盘的主要C源文件
  • <keyboard_name>.h:键盘矩阵定义的头文件

接下来,我们将一步步实现这些文件的创建。

实操步骤

1. 创建键盘目录

首先导航到QMK固件的keyboards目录:

keyboards目录

2. 创建自定义键盘文件夹

在keyboards目录下创建一个新的文件夹,使用你自定义的键盘名称(本例中使用"despacito0o"):

创建新文件夹

文件夹创建完成

3. 打开IDE并开始编辑

使用VSCode打开刚创建的文件夹(可以直接将文件夹拖到VSCode图标上):

打开VSCode

4. 创建rules.mk文件

首先创建rules.mk文件,这是编译选项和功能开关的配置文件:

创建rules.mk

rules.mk示例

在rules.mk文件中写入以下内容:

MCU = STM32F103          # 主控型号,使用的是 STM32F103 微控制器
BOOTLOADER = stm32duino  # 启动加载器类型,使用 stm32duino 引导程序
NKRO_ENABLE = yes        # 启用 NKRO (N-Key Rollover),支持多键同时按下
EXTRAKEY_ENABLE = yes    # 启用额外按键功能,例如媒体键(用键盘控制音量大小等)
# LTO_ENABLE = yes        # 是否启用链接时优化 (Link Time Optimization),暂时不需要注释掉
rules.mk文件说明

rules.mk文件是QMK的顶级Makefile,用于设置关于MCU的信息以及启用/禁用特定功能。主要包含:

  • 构建选项:指定默认文件夹、固件格式等
  • 功能开关:通过设置yes/no来启用或禁用功能
  • MCU选项:设置微控制器类型、时钟频率等
  • 编译优化:如LTO_ENABLE可显著减少编译大小

5. 创建键盘头文件

接下来创建键盘的.h头文件(使用你的键盘名称):

创建头文件

在头文件中添加以下内容:

#pragma once // 防止头文件被重复包含#include "quantum.h" // 包含 QMK 的核心头文件
键盘头文件说明

该头文件用于定义键盘的矩阵布局。应至少定义一个C宏,将数组转换为代表键盘物理开关矩阵的矩阵。如果你的键盘可以构建多种布局,则应定义多个宏。

  • 对于单一布局,应使用LAYOUT
  • 对于多布局键盘,应有一个支持所有可能开关位置的基本布局LAYOUT_all,以及其他特定布局如LAYOUT_ansiLAYOUT_iso

6. 创建键盘C源文件

创建键盘的主C源文件(使用你的键盘名称):

创建C源文件

添加以下内容:

#include "Despacito0o.h" // 包含键盘的头文件(使用你自定义的名称)

7. 创建config.h文件

创建config.h配置文件:

创建config.h

添加以下内容:

#pragma once // 防止头文件被重复包含#define MATRIX_ROWS 4 // 定义矩阵的行数
#define MATRIX_COLS 4 // 定义矩阵的列数
#define MATRIX_ROW_PINS {B3, A1 , A2 , A3} // 定义行引脚
#define MATRIX_COL_PINS {A4, A15, A14, A8} // 定义列引脚
#define DIODE_DIRECTION COL2ROW // 定义二极管方向为列到行
config.h文件说明

config.h是最先被包含的C头文件,其中设置的变量会在整个项目中持续存在。主要配置内容包括:

  • 硬件选项:VID/PID、设备版本、厂商信息等
  • 矩阵配置:行列数、引脚定义、二极管方向等
  • 功能配置:背光、音频、RGB灯效、防抖等
  • 键盘行为:按键触发时间、组合键设置等

8. 创建键盘映射文件

创建键盘映射的文件结构:先创建keymaps文件夹,然后在其中创建default文件夹,最后在default文件夹中创建keymap.c文件:

创建keymap.c

在keymap.c中添加以下内容:

#include  QMK_KEYBOARD_Hconst uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {[0] = LAYOUT(MI_B2  , KC_Q   , KC_W,  MI_C3  ,  // 第一行按键映射MI_F2  , MI_G2  , MI_A2, MI_OCTU, // 第二行按键映射MI_C2  , MI_D2  , MI_E2, MI_OCTD, // 第三行按键映射KC_PSLS, MI_OCTD, MO(1), KC_PENT  // 第四行按键映射,包含层切换按键MO(1)),[1] = LAYOUT(QK_BOOT, KC_P8 , RGB_MOD, RGB_TOG, // 第二层第一行:包含重启引导和RGB控制KC_P4  , KC_G  , KC_A   , KC_PAST, // 第二层第二行KC_P1  , KC_P2 , KC_P3  , KC_PMNS, // 第二层第三行KC_PSLS, KC_P0 , KC_PDOT, KC_PENT  // 第二层第四行)
};

9. 创建键盘JSON配置文件

最后,创建一个keyboard.json文件(注意JSON文件中不能有注释):

创建keyboard.json

添加以下内容:

{"keyboard_name": "Despacito0o", "manufacturer": "Despacito0o", "usb": {"vid": "0x1564", "pid": "0x8456", "device_version": "0.0.1" },"layouts": {"LAYOUT": {"layout": [{"matrix": [0, 0], "x": 0, "y": 0}, {"matrix": [0, 1], "x": 1, "y": 0}, {"matrix": [0, 2], "x": 2, "y": 0}, {"matrix": [0, 3], "x": 3, "y": 0}, {"matrix": [1, 0], "x": 0, "y": 1}, {"matrix": [1, 1], "x": 1, "y": 1}, {"matrix": [1, 2], "x": 2, "y": 1}, {"matrix": [1, 3], "x": 3, "y": 1}, {"matrix": [2, 0], "x": 0, "y": 2}, {"matrix": [2, 1], "x": 1, "y": 2}, {"matrix": [2, 2], "x": 2, "y": 2}, {"matrix": [2, 3], "x": 3, "y": 2}, {"matrix": [3, 0], "x": 0, "y": 3}, {"matrix": [3, 1], "x": 1, "y": 3}, {"matrix": [3, 2], "x": 2, "y": 3}, {"matrix": [3, 3], "x": 3, "y": 3}  ]}}
}

编译固件

完成所有文件创建后,打开QMK MSYS终端,输入以下命令进行编译:

qmk compile -kb despacito0o -km default

编译成功

看到绿色的成功信息,恭喜你已经成功创建了自己的键盘固件!

知识拓展:QMK架构关键概念

1. 键码(Keycode)系统

QMK提供了丰富的键码系统,包括:

  • 基础字母数字键(KC_A到KC_Z,KC_1到KC_0)
  • 功能键(KC_F1到KC_F24)
  • 特殊功能键(媒体控制、RGB控制等)
  • 层控制键(MO、LT、TO、TG等)

2. 层(Layer)系统

QMK的层系统允许在有限的物理按键上实现多层功能:

  • 基础层(Base Layer):默认层,通常为0
  • 功能层:通过层控制键临时激活或锁定
  • 层优先级:高层级覆盖低层级的按键定义

3. Quantum键码

QMK引入了独特的高级键码,如:

  • Mod-Tap:按下为修饰键,点击为普通键
  • Layer-Tap:按下激活层,点击为普通键
  • One-Shot Keys:点击后效果持续到下一个按键

4. 矩阵扫描

QMK通过矩阵扫描检测按键状态:

  • 行列式矩阵:减少所需引脚数
  • 二极管方向:COL2ROW或ROW2COL定义电流流向
  • 防抖处理:避免按键弹跳导致的误触

结语

通过本教程,你已经掌握了QMK最新架构下创建自定义键盘固件的完整流程。这些基础知识将帮助你进一步探索QMK的强大功能,如RGB灯光效果、OLED屏幕控制、旋钮编码器配置等高级特性。

希望这篇教程对你有所帮助,祝你在DIY键盘的道路上越走越远!
QMK键码参照表大全

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

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

相关文章

DAMA第10章深度解析:参考数据与主数据管理的核心要义与实践指南

引言 在数字化转型的浪潮中&#xff0c;数据已成为企业的核心资产。然而&#xff0c;数据孤岛、冗余和不一致问题严重制约了数据价值的释放。DAMA&#xff08;数据管理协会&#xff09;提出的参考数据&#xff08;Reference Data&#xff09;与主数据&#xff08;Master Data&…

力扣题解:2、两数相加

个人认为&#xff0c;该题目可以看作合并两个链表的变种题&#xff0c;本题与21题不同的是&#xff0c;再处理两个结点时&#xff0c;对比的不是两者的大小&#xff0c;而是两者和是否大于10&#xff0c;加法计算中大于10要进位&#xff0c;所以我们需要声明一个用来标记是否进…

深度学习部署包含哪些步骤?

深度学习部署包含哪些步骤&#xff1f; 阶段说明示例工具模型导出把 .pt、.h5 等格式模型导出为通用格式&#xff08;如ONNX&#xff09;PyTorch, TensorFlow, ONNX推理优化减小模型体积、加速推理&#xff08;量化、剪枝&#xff09;TensorRT, ONNX Runtime系统集成将模型嵌入…

路由策略和策略路由的区别以及配置案例

区别 路由策略&#xff1a;路由策略是通过ACL等方式控制路由发布&#xff0c;让对方学到适当路由条目&#xff0c;比如有20条路由&#xff0c;只想让某个路由器学到10条&#xff0c;可以通过路由策略进行过滤。 策略路由&#xff1a;策略路由是通过定义策略和应用&#xff0c…

LeetCode 热题 100 64. 最小路径和

LeetCode 热题 100 | 64. 最小路径和 大家好&#xff0c;今天我们来解决一道经典的动态规划问题——最小路径和。这道题在 LeetCode 上被标记为中等难度&#xff0c;要求找到从网格的左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 问题描述 给定一个包含非负…

JavaSE核心知识点02面向对象编程02-06(泛型)

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 JavaSE核心知识点02面向对象编程02-06&#…

LVGL对象的盒子模型和样式

文章目录 &#x1f9f1; LVGL 对象盒子模型结构&#x1f50d; 组成部分说明&#x1f3ae; 示例代码&#x1f4cc; 总结一句话 &#x1f9f1; 一、样式的本质&#xff1a;lv_style_t 对象&#x1f3a8; 二、样式应用的方式&#x1f9e9; 三、样式属性分类&#xff08;核心&#…

Github上如何准确地搜索开源项目

Github上如何准确地搜索开源项目&#xff1a; 因为寻找项目练手是最快速掌握技术的途径&#xff0c;而Github上有最全最好的开源项目。 就像我的毕业设计“机器翻译”就可以在Github上查找开源项目来参考。 以下搜索针对&#xff1a;项目名的关键词&#xff0c;关注数限制&a…

正点原子IMX6U开发板移植Qt时出现乱码

移植Qt时出现乱码 1、前言2、问题3、总结 1、前言 记录一下正点原子IMX6U开发板移植Qt时出现乱码的解决方法&#xff0c;方便自己日后回顾&#xff0c;也可以给有需要的人提供帮助。 2、问题 用正点原子IMX6U开发板移植Qt时移植Qt后&#xff0c;sd卡里已经存储了Qt的各种库&…

python-django项目启动寻找静态页面html顺序

目录结构 settings模块 urls模块 views模块 1.settings文件下没有DIR目录,按照各app注册顺序寻找静态页面 启动效果&#xff0c;直接返回注册的app即app01下的templates文件夹下的html页面 2.settings文件添加上DIR目录 启动效果&#xff0c;会优先去找项目下的templates文件…

MySQL索引详解(上)(结构/分类/语法篇)

一、索引概述 索引本质是帮助MySQL高效获取数据的排序数据结构&#xff08;类似书籍目录&#xff09;&#xff0c;通过减少磁盘I/O次数提升查询效率。其核心价值体现在大数据量场景下的快速定位能力&#xff0c;但同时带来存储和维护成本。 核心特点&#xff1a; 优点&#…

数据集-目标检测系列- 烟雾 检测数据集 smoke >> DataBall

数据集-目标检测系列- 消防 浓烟 检测数据集 smoke>> DataBall 数据集-目标检测系列- 烟雾 检测数据集 smoke &#xff1e;&#xff1e; DataBall * 相关项目 1&#xff09;数据集可视化项目&#xff1a;gitcode: https://gitcode.com/DataBall/DataBall-detections-10…

docker + K3S + Jenkins + Harbor自动化部署

最近公司在研究自动化部署的一套流程&#xff0c;下面记录一下配置流程 需要提前准备好Jenkins Harbor Git(其他管理工具也可以) 我这里的打包编译流程是Jenkins上配置打包任务-->自动到git目录下找打包文件---->项目编译后打镜像包------>打完镜像包将镜像上传到…

《用MATLAB玩转游戏开发:从零开始打造你的数字乐园》基础篇(2D图形交互)-《打砖块:向量反射与实时物理模拟》MATLAB教程

《用MATLAB玩转游戏开发&#xff1a;从零开始打造你的数字乐园》基础篇&#xff08;2D图形交互&#xff09;-《打砖块&#xff1a;向量反射与实时物理模拟》MATLAB教程 &#x1f3ae; 文章目录 《用MATLAB玩转游戏开发&#xff1a;从零开始打造你的数字乐园》基础篇&#xff08…

Redisson 看门狗机制

何为看门狗 看门狗机制的主要作用是自动续期锁&#xff0c;确保在节点完成任务之前&#xff0c;锁不会过期。具体来说&#xff0c;当一个节点获取到锁后&#xff0c;看门狗会定期检查该锁的过期时间&#xff0c;并在必要时延长锁的过期时间&#xff0c;确保节点可以顺利完成任…

[架构之美]linux常见故障问题解决方案(十九)

[架构之美]linux下常见故障问题解决方案 一&#xff0c;文本文件忙 问题一&#xff1a;rootwh-VMware-Virtual-Platform:/home/hail# cp /root/containerd/bin/* /usr/bin/ cp: 无法创建普通文件 ‘/usr/bin/containerd’: 文本文件忙 在Linux系统中遇到“文本文件忙”错误时…

QT实现曲线图缩放、拖拽以及框选放大

.h文件 protected: void saveAxisRange();void wheelEvent(QWheelEvent *event) override;void mousePressEvent(QMouseEvent *event) override;void mouseMoveEvent(QMouseEvent *event) override;void mouseReleaseEvent(QMouseEvent *event) override;private:QPoint m_…

【Pandas】pandas DataFrame corr

Pandas2.2 DataFrame Computations descriptive stats 方法描述DataFrame.abs()用于返回 DataFrame 中每个元素的绝对值DataFrame.all([axis, bool_only, skipna])用于判断 DataFrame 中是否所有元素在指定轴上都为 TrueDataFrame.any(*[, axis, bool_only, skipna])用于判断…

青藏高原七大河流源区径流深、蒸散发数据集(TPRED)

时间分辨率 月空间分辨率 1km - 10km共享方式 开放获取数据大小 83.27 MB数据时间范围 1998-07-01 — 2017-12-31元数据更新时间 2024-07-22 数据集摘要 通过构建耦合积雪、冻土、冰川等冰冻圈水文物理过程的WEB-DHM模型&#xff08;Water and Energy Budget-based Distribute…

window环境下,如何通过USB接口控制打印机

虽然说大多数情况下&#xff0c;我们可以非常便利的通过打印机驱动来控制打印机&#xff0c;但还是有一些特殊情况&#xff0c;导致无法通过打印机驱动来完成我们预想的任务&#xff0c;比如&#xff0c;打印机只是一个系统设备中的一部分&#xff0c;需要协调其它设备一起工作…