项目:USB键盘和鼠标的复合设备

我们的复合设备使用一个物理设备就可以完成多个功能。

使用复合设备同时完成USB键盘和鼠标功能,它的主要实现方式有两种,

第一个就是我们将多个设备描述符合并成一个,这个相对比较简单,我们只要根据相应的报告描述符处理数据就可以。

第二个就是使用多个接口来实现复合设备,每一个接口实现一个功能,这个做法比较复杂,能让我们更加深入的了解USB,所以这次我们使用这种做法来实现复合设备。

我们的代码就使用STM32的官方例程,如下图:

我们会在这个官方例程游戏操作杆上进行修改,所有和USB键盘有关的项目都会使用"_KB"字符加以区分,没有的话就是鼠标的。Joystick_ReportDescriptor 这个报告描述符就是鼠标,Joystick_KB_ReportDescriptor这个报告描述符就是键盘。

第一步,我们将鼠标和键盘的报告描述符添加进去。

原来的如下图:

现在增加鼠标和报告描述符:

然后我们报告描述符的长度也要改一下

还要记得extern声明一下

第二步,我们修改完报告描述符以后就是修改配置描述符,

首先就是 接口增加到两个,bNumInterfaces 的接口值修改成0x02,然后配置描述符的总长度从34增加到66 JOYSTICK_SIZ_CONFIG_DESC

然后还要增加一个接口描述符(HID描述符和端点描述符)端点1用给鼠标 端点2用给键盘

第三步就是复合设备需要相应总线枚举,我们的主机首先要对设备进行复位,所以会进入Joystick_Reset函数中,加上键盘的端点2的初始化

第四步,我们的复合设备是两个接口,每个接口就是对应一个HID设备类,因此我们的主机必须对每个接口获取相应的HID描述符与报告描述符,那么怎么样提交这些描述符的数据呢?根据之前对控制传输的分析,设备必须在usb_prop.c源文件中预先定义ONE_DESCRIPTOR结构体变量对"需要提交的描述符数据数组"定位的那些变量,如下图:

第五步就是把发送数据的一些应用层函数还有回调函数加上去。如下图都是要改的地方,我都截图框出来。

主要就是按键 ,发送的应用层逻辑编写,还有按键的初始化,最后这个一定要全部再回顾一遍,特别是枚举 初始化 数据发送过程。然后其实这个项目还能扩展一下,后面有空我还会优化的,如果有朋友看到这里可以自己试试。

第一个就是可以自己做一个矩阵扫描

第二个就是实现全键无冲,我们现在是键盘最多只能发送六个数据,全键无冲就可以发送多个

第三个就是使用上位机发送数据下来控制MCU,可以使用下面这个软件模拟一下。

后面有时间我会把这三个拓展方向优化加进来,不过最近一个月都在搞USB也是乏味了hhhh,想换个口味了,准备下一个学习232,485,CAN总线吧。

相关推荐
小小de风呀1 分钟前
de风——【从零开始学习Linux】(九):进程基础 —— 从冯诺依曼体系到 fork 创建进程
linux·学习
李某学编程6 分钟前
基于ARM的微机原理学习笔记(一)
arm开发·笔记·学习
zhangrelay1 小时前
单片机原理与接口技术-2026融合版-从MEGA2560-ESP32与Wokwi到ROS2-Lyrical与具身智能栈
单片机·嵌入式硬件
Song_RsHt1 小时前
Redis 与微服务,什么场景下无可替代
java·redis·后端·学习·微服务
sbjdhjd1 小时前
AI产业周度动态:从“更强模型”走向“可执行、可治理、可计价”的系统竞争 (2026年10月19日—10月25日)
人工智能·笔记·ai·开源·gemini·信息差·claude code
lhbweilai1 小时前
分析FreeRTOS内核对象API的源码实现(八)
c语言·开发语言·stm32·单片机
艾络迅Acceleronix2 小时前
环境监测终端:STM32+EG800Z AT+ 艾络迅平台实战|多传感器采集联动全流程
c语言·stm32·单片机·嵌入式硬件·物联网·1024程序员节
涂山苏苏⁠2 小时前
stm32复习总结
stm32·单片机·嵌入式硬件
ss2732 小时前
AI时代首先数据库-PostgreSQL实战笔记 27 PostgreSQL数据写入与读取流程解析
数据库·笔记·postgresql
Zwawa2 小时前
一只按键不只“按下”:短按、长按和连按如何共存
c语言·单片机·嵌入式