1. 立项背景和目标
在工业自动化控制、测试台架以及特殊设备验证场景中,常常需要密集的多路按键与多轴输入设备来模拟人工操作或进行闭环测试。传统键鼠无法满足高密度、多通道的输入需求,而市面成品控制器往往无法深度定制。本项目旨在提供一套纯硬件、免驱、即插即用的定制化HID输入方案,解决非标输入设备开发周期长、软件依赖复杂的产品痛点。
2. 软件功能、核心功能模块的介绍
本作品为一套工业级USB HID输入设备,硬件层基于STM32实现USB HID复合设备,无需编写任何PC端上位机,Windows系统自带驱动直接识别。针对64路独立按键需求,使用8片74HC165D移位寄存器级联,仅通过3根控制线(时钟、数据、锁存)实现并行采集与去抖。保留原生USB接口(PA11=D-, PA12=D+),底层精心编写HID报告描述符。主要功能包括:64路按键映射上报、多轴ADC采集上报。
3. 业务流程、功能路径描述
设备通过USB线连接电脑后,直接枚举为标准的HID游戏控制器或多轴输入设备,无需安装任何驱动或第三方软件。用户操作按键或摇杆时,STM32通过74HC165D级联芯片读取64路按键状态,同时进行多轴ADC采样,将数据打包成标准HID报文上报给Windows。PC端游戏或工业软件直接读取标准输入,即插即用。
1. 整体架构和设计思路,不同模块使用的技术栈
整体采用 C 语言开发,基于 STM32CubeIDE 环境。硬件架构采用 STM32F1系列主控 + 8片74HC165D级联 + 原生USB接口。固件分为三层:底层驱动层(GPIO模拟74HC165D时序、ADC多通道采集)、协议层(HID报告描述符编写、USB中断传输)、应用层(按键去抖、滑动平均滤波、业务逻辑打包)。
2. 我负责的模块和结果(尽可能量化)
独立完成整体硬件方案的原理图核对与修正(AI辅助生成后,逐引脚校验电源、原生USB差分线、晶振、复位、BOOT、8片74HC165D级联电路及ESD保护),独立编写全部STM32底层固件。实现了64路按键的高密度压缩采集,仅占用3个MCU引脚;实现了Windows/Linux系统免驱识别,设备长时间运行不掉线。
3. 我遇到的难点、坑和解决方案
IO资源受限与74HC165D级联时序:单片机原生IO口不足,难点在于8片74HC165D级联时的时钟同步与数据移位时序。解决方案是优化GPIO模拟时序,配合中断触发,实现了64路按键的快速扫描与软件去抖。
USB免驱枚举与HID描述符编写:PA11/PA12作为原生USB D-/D+,差分走线要求极高。难点在于HID报告描述符的编写,必须确保Windows原生识别。解决方案是逐字节核对描述符与固件上报的数据长度、绝对/相对坐标范围,最终实现了免驱识别。
ADC采样噪声导致轴抖动:摇杆轴在静止时数值容易漂移。解决方案是在固件底层实现滑动平均滤波,并对原始数据进行限幅,保证Windows端识别后数据平滑不漂移。