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.pswp.cn/web/79312.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79312.shtml
英文地址,請注明出處:http://en.pswp.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;需要協調其它設備一起工作…