单片机
返回首页

用stm32的usb hid实现游戏控制器

2025-10-22 来源:bilibili

1、 用cubemx生成基础工程,游戏控制器一般就是按钮和旋钮的组合,按钮就是gpio,旋钮是adc。具体配置就不罗嗦了。

connectivity这里打开usb,勾选Device,参数保持默认即可。

Middleware and Software Packs这里选择USB_DEVICE,Mode这里选择Custom HID,参数如果懂可以根据需求改,不懂保持默认,后边我们在代码里改也可以。

之后配置好时钟和其他设置,生成代码即可。

2、   我用的vscode+platformio开发环境,新建工程并打开导出的代码。Cubemx和platformio的文件夹结构不同,需要挪一下文件,主要是将Core/Src下的文件放到src下,将Core/Inc下的头文件放到include下,将USB_DEVICE下的两个文件夹放到lib下。当然也可以在platformio.ini中配置添加这些文件的路径,不过我还是喜欢直接拖拽。

此时编译下载到板子应该是可以被电脑识别为hid设备了。

此时汇报描述符没配置,所以识别类别未知。下面就填充汇报描述符,这是hid进行通信的基础。填充这个结构体需要参考《HID Usage Tables》这个文件,这里定义了各种hid设备的用法。另外官方还提供了一个工具Dt.exe构建汇报描述符。

前三行和最后一行是必须要的,第一行表明是一般桌面应用,第二行指明设备是game pad类型,第三行的Application是规定必须有的。中间部分是实际的按键和旋钮,根据自己的实际需求定义。详细语法规则就不罗嗦了,可以参考《USB Complete_ The Developer’s Guide 4th Edition》这本书。我演示的这个也不规范,不过实测可以用。

配置好后导出为头文件,就生成了我们需要的汇报描述符结构体。将结构体的内容复制到usbd_custom_hid_if.c文件中的CUSTOM_HID_ReportDesc_FS结构体中 

记得修改结构体大小的宏USBD_CUSTOM_HID_REPORT_DESC_SIZE为实际结构体大小,不然会导致识别出错。这个宏下边的宏决定了汇报速度,想要汇报的快就要改小,最小为1。

到此,编译下载电脑应该可以正常识别为一个游戏控制器了。

接下来就是汇报实时数据了,我们需要构建一个结构体,其内容大小和顺序要跟汇报描述符里边定义的一致。

定义结构体要注意结构体对齐的问题,不然会出现汇报数据错位的问题,因为系统会自动对齐结构体成员,可能会添加额外的无用字节占位。 

然后在主程序里开启ad转换并填充结构体,最后调用汇报函数。

汇报函数在usbd_custom_hid_if.c文件中最后,默认是注释掉的,要用的话需要取消注释,并将static关键字去掉,将函数在usbd_custom_hid_if.h中声明一下就OK了。

到此,在游戏控制器中的属性就可以看到轴和按键的情况了。

我发现stm32的adc各个通道之间有影响,目前还没有找到解决办法。以上只是一个演示,要想实际应用还需要进一步优化,要根据自己实际的硬件情况修改引脚配置。


进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 1瓦线性调频增强器

  • 1瓦四级调频发射机

  • 500W MOS场效应管电源逆变器,12V转110V/220V

  • 红外开关

  • LM317过压保护

  • 0-30V/20A 大功率稳压电源(采用LM338)

    相关电子头条文章