QMK 移植实战:用 Blue Pill STM32F103C8T6 为老式西门子键盘打造 USB 转换器(Siemens Tastatur)

📅 发布时间:2026/9/19 13:32:37
QMK 移植实战:用 Blue Pill STM32F103C8T6 为老式西门子键盘打造 USB 转换器(Siemens Tastatur)
嵌入式固件驱动开发硬件开发【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址https://gitcode.com/GitHub_Trending/qm/qmk_firmware点击查看免费下载本篇技术指南以 QMK Firmware 仓库中的converter/siemens_tastatur键盘定义为核心剖析如何在一块 Blue Pill STM32F103C8T6 最小系统板上为一台非常非常老的西门子键盘编写固件使其重新通过 USB 在现代电脑上工作。读完本文你将掌握 QMK Converter 类键盘的目录组织、自定义矩阵CUSTOM_MATRIX的中断驱动实现思路、keyboard.json的声明式配置方式以及如何用make converter/siemens_tastatur:default一键完成编译。项目定位QMK 的 Converter 家族keyboards/converter/是 QMK 仓库中专门收纳协议/接口转换器的一类键盘目录。与直接驱动矩阵扫描芯片的传统键盘不同这些转换器的任务是读懂一种已经过时的键盘协议再翻译成现代 USB HID 键盘信号。同目录下还有 adb_usbApple ADB 键盘、ibm_terminalIBM 终端键盘、m0110_usbMacintosh M0110、xt_usbIBM XT、sun_usbSun Type 键盘等siemens_tastatur 正是其中之一——Tastatur即德语键盘。该转换器由 Yiancar 设计键盘维护者信息见 readme.md硬件基于Blue Pill STM32F103C8T6开发板一块 72 MHz 的 ARM Cortex-M3 主控内置 64 KB Flash 与 20 KB SRAM价格低廉、引脚充足非常适合承载这类读老协议、出 USB的转换任务。配套的自制转换 PCB 需要联系作者获取。构建固件一条 make 命令即可在搭建好 QMK 构建环境后新手可参考 Complete Newbs Guide 与 build environment setup编译该转换器默认键位图的命令为make converter/siemens_tastatur:defaultconverter/siemens_tastatur是 QMK 的键盘路径格式make 键盘路径:键位图详细说明见 make instructionsdefault对应 keymaps/default/ 目录下的默认键位图。固件编译完成后通过 ST-Link 或串口 Bootloader 烧录到 Blue Pill。原文档特别强调了一个易被忽略的操作要点固件更新后必须拔下并重新插上键盘Unplugging and replugging。这是因为转换器内部依赖外部键盘的协议握手与感应线电平重新插拔能让转换器重新初始化引脚中断与端口状态确保老键盘被正确枚举和扫描。源码解剖这不是一块普通键盘siemens_tastatur目录体积很小但结构完整正好作为研究 QMK 转换器固件的绝佳样本keyboards/converter/siemens_tastatur/ ├── keymaps/ │ └── default/ │ └── keymap.c # 默认键位图 自定义键码 LED 控制 ├── config.h # 矩阵尺寸等编译期配置 ├── halconf.h # ChibiOS HAL 配置PAL 回调、SPI ├── keyboard.json # 声明式键盘配置VID/PID、特性、布局 ├── matrix.c # 自定义矩阵扫描核心 ├── readme.md # 项目说明 └── rules.mk # 构建规则启用 CUSTOM_MATRIX1. 自定义矩阵CUSTOM_MATRIX与大多数键盘不同这里没有在keyboard.json或config.h里声明传统行列 GPIO 矩阵而是在 rules.mk 中显式声明CUSTOM_MATRIX yes SRC matrix.cCUSTOM_MATRIX yes告知 QMK 构建系统矩阵扫描逻辑完全由键盘目录自定义跳过框架默认的按键矩阵驱动。在 builddefs/common_features.mk 中可以看到 QMK 对CUSTOM_MATRIX的取值校验逻辑合法值包括yes、lite与no且yes模式下SRC中新增的matrix.c会被编译进固件。而 config.h 中定义的矩阵尺寸也印证了这点#define MATRIX_ROWS 5 #define MATRIX_COLS 19这是一个 5 行 × 19 列的虚拟矩阵——它并不对应真实的行列导线而是用来容纳老键盘上每个物理按键的唯一编码。2. 中断驱动的键盘读取PAL 回调老式西门子键盘通过多根感应线sense lines以并行方式输出按键状态。转换板把 9 条感应线接到了 Blue Pill 的 GPIO 上PA0/PA1/PA2/PA9/PA10与PB12/PB13/PB14/PB15。matrix.c 中的enable_input_events()为这 9 个引脚逐一做了三件事palDisablePadEventI()先禁用旧事件去抖期间的自我锁定palEnablePadEventI(pad, PAL_EVENT_MODE_FALLING_EDGE)使能下降沿中断——按键按下时感应线被拉低触发中断palSetPadCallbackI(pad, pal_cb, 0)注册统一的中断回调。matrix_init()则先把A0~A10、B3~B9、B11~B15全部配置为上拉输入gpio_set_pin_input_high清空矩阵与去抖缓冲后调用matrix_init_kb()最后在锁内使能输入事件。中断回调pal_cb()是整段逻辑的关键matrix.cstatic void pal_cb(void* unused) { (void)unused; chSysLockFromISR(); porta_buffer palReadPort(GPIOA); portb_buffer palReadPort(GPIOB); //Disable further interrupts that might occur on same button press. enable_input_events(); chSysUnlockFromISR(); }回调在中断上下文中一次性并行读取整个 GPIOA 与 GPIOB 端口把 32 位端口快照存入porta_buffer/portb_buffer然后立刻重新执行enable_input_events()——通过先palDisablePadEventI再palEnablePadEventI的方式屏蔽同一按键持续抖动产生的重复中断。这种读取快照 禁止重复触发的模式是处理并行感应线协议时的高效做法。3. 查表解码把端口快照翻译成按键matrix_scan()matrix.c把两次端口快照压缩成一个 32 位键值switch_buffer ((uint32_t)(porta_buffer 0x7FF)) | ((uint32_t)(portb_buffer 0x3F8) 8);随后用一个庞大的switch查找表将其解码为虚拟矩阵中的按键位。例如case 0x1134E: matrix[0] 0x01; break; case 0x3774D: matrix[0] 0x02; break; ...每一条case对应老键盘上一个键的感应线组合命中后把对应的 bit 写入matrix[row]从而映射到LAYOUT中某个物理位置。代码注释中清晰标注了哪些按键Does not exist in matrix不存在于矩阵、哪些是Special pin特殊引脚说明该查找表是作者对原键盘逐键实测得出的结果。switch的default分支处理了四颗特殊引脚按键——当PB12/PB13/PB14/PB15中某一位为低时直接向对应行写入位值同时把所有行清零作为无按键的兜底路径。此外还有一处 Shift 特判matrix.c//Special case for Shift if (gpio_read_pin(B11) 0) { matrix[3] | 0x01; }扫描结束时把porta_buffer/portb_buffer复位为65535为下一次按键做准备。由此可见这套转换器的矩阵本质上是老键盘感应线组合到 QMK 虚拟矩阵的译码表这正是 Converter 类固件的典型实现范式。4. 声明式配置keyboard.json现代 QMK 采用>#define HAL_USE_SPI TRUE #define PAL_USE_CALLBACKS TRUE #include_next halconf.hPAL_USE_CALLBACKS TRUE是中断回调机制能工作的前提——没有它palSetPadCallbackI系列 API 根本不会被编译进系统HAL_USE_SPI TRUE则为转换板与老键盘之间可能存在的 SPI 通信链路预留了支持。默认键位图老键盘的现代重生默认键位图 用LAYOUT()把老西门子键盘的物理键位映射成现代键码——数字行、字母区、KC_BSPC、KC_ENT、方向键与数字小键盘一应俱全。值得注意的两处自定义逻辑① DCAPS 自定义键码keymap.cenum custom_keycodes { DCAPS SAFE_RANGE, }; bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case DCAPS: if (record-event.pressed) { // This is needed for mac. tap_code(KC_CAPS); } break; } return true; }DCAPS从SAFE_RANGE起分配自定义键码按下时通过tap_code(KC_CAPS)发送一次 Caps Lock——注释指出这是为 macOS 兼容性而做的特殊处理Mac 上直接锁定/解锁 Caps Lock 的行为与 Windows 不同改为敲击式发送更可靠。② Caps Lock LED 硬件驱动keymap.cvoid matrix_init_user(void) { gpio_set_pin_output(B0); gpio_write_pin_low(B0); } bool led_update_user(led_t led_state) { if (led_state.caps_lock) { gpio_write_pin_high(B0); } else { gpio_write_pin_low(B0); } return false; }matrix_init_user()把PB0配置为输出并初始拉低led_update_user()根据led_state.caps_lock状态驱动PB0从而点亮/熄灭老键盘上的 Caps Lock 指示灯并在返回false时阻止框架重复处理 LED 状态。老键盘的物理指示与虚拟锁定状态由此保持同步。接线要点与使用前提从源码可以归纳出该转换器的硬件接口约定均为实现事实接线时以作者提供的 PCB 原理图为准9 根感应线输入接PA0、PA1、PA2、PA9、PA10、PB12、PB13、PB14、PB15全部配置为上拉输入下降沿触发中断Shift 特判引脚PB11作为上拉输入单独读取Caps Lock 指示输出PB0输出高电平点亮供电与下载遵循 Blue Pill 标准USB 直连或通过 ST-Link 烧录。需要说明的适用前提该固件针对特定型号的西门子老键盘协议编写查找表中的端口组合码是逐键实测得到的因此不能直接通用于其他键盘若移植到不同型号需要重新采集感应线组合并重建 matrix.c 中的译码表。固件升级后记得重新插拔键盘让转换器完成引脚与协议状态的重新初始化。小结converter/siemens_tastatur是一个麻雀虽小、五脏俱全的 QMK 移植范例它展示了如何用CUSTOM_MATRIX yes接管矩阵扫描、如何借助 ChibiOS PAL 回调与端口快照读取并行感应线协议、如何用switch查表把老键盘编码映射进虚拟矩阵以及如何通过keyboard.json与halconf.h完成声明式配置。对于想要移植其他古董键盘、或研究 QMK 自定义矩阵机制的开发者而言这份代码是绝佳的入门教材——一条make converter/siemens_tastatur:default就能让尘封多年的西门子键盘在现代电脑上重新打字。赞分享嵌入式固件驱动开发硬件开发【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址https://gitcode.com/GitHub_Trending/qm/qmk_firmware点击查看免费下载相关推荐Practice 65 键盘移植解析QMK 数据驱动配置与 Blue Pill STM32F103C8T6 实战指南Practice 65 键盘移植解析QMK 数据驱动配置与 Blue Pill STM32F103C8T6 实战指南 导读 Practice 65 是 Can嵌入式固件驱动开发硬件开发QMK 固件中的 CannonKeys Ortho75基于 Blue Pill STM32F103C8T6 的 15×5 正交键盘移植与配置实战QMK 固件中的 CannonKeys Ortho75基于 Blue Pill STM32F103C8T6 的 15×5 正交键盘移植与配置实战 本文以 QM嵌入式固件驱动开发硬件开发QMK 中的 CannonKeys Practice 60基于 Blue Pill STM32F103C8T6 的 60% ANSI 键盘固件实战指南QMK 中的 CannonKeys Practice 60基于 Blue Pill STM32F103C8T6 的 60% ANSI 键盘固件实战指南 导读嵌入式固件驱动开发硬件开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考