本文目的:将STM32F103C8T6的CustomHID和MSC USB设备进行复合,EP0用于枚举 ,EP1用于键盘设备,EP2用于鼠标设备(支持绝对模式和相对模式),EP3用于MSC设备(配有官方demo版本和FAT16版本(默认)),以上全部为双端口。
正常情况下,键鼠设备可以共用一个接口,利用报告ID作为前缀,发送不同的report到主机上。但是这种情况下,报告描述符是写在同一个数组内的,当遇到某些主机(如IBM的AIX7系统)枚举阶段是boot启动模式时,并不会启动报告描述符的请求,那么键鼠均不能用,因此键鼠需要分配不同的接口(interface)。
本文虽然以CUSTOMHID和MSC为复合对象,但是也可为其他复合设备,其他型号的单片机提供参考,如F1 F4 F0 等单片机的HID+MSC,CDC+MSC,HID+CDC等,双复合,甚至是三复合均可。
本文某些内容不会写得太详细,仅为一些需要修改的东西,所涉及的内容某些作者也不是很理解。要求读者有一定的USB device的相关知识[1],本文方可有参考意义。
- STM32Cube分别新建customhid和msc的工程文件。
- 两个工程的HAL版本和USB库版本要一致,否则可能出现问题。
- 新建工程的步骤在此不做过多的叙述,可以参考CSDN上的相关例子[2][3]。
- 上述工作完成后,即可选定一个工程作为母版,建议选择较难的为母版,本位以cusomhid作为母版(注意:该母版也是经过我修改后的customhid工程)
- 添加MSC类的inc和src文件(位于class文件夹类的文件)到HID的Class文件夹中,如图所示。


- 添加usbd_storge_if.c和usbd_storge_if.h文件到工程中,添加h文件的路径
- 新建usbd_composite.c和usbd_composite.h文件,并添加h文件的路径。这两个文件的作用是整合customhid和msc设备的各项操作,如Init,DeInit,Setup等操作。
- composite两个文件可暂时不用书写,尝试编译一下工程,正常情况下,是编译成功的,若不成功,自行根据前面步骤及错误提示加以修改。
- 定义两个全局变量,因为有两个设备,如果有三个,记得这里也要定义三个。这里的解释可以参考这个网址[4]。此处的复合程序编写可以参考[4][5]

- 定义复合函数结构体,这里面的函数都是完成两个设备的初始化,设置等操作。

- 编写配置描述符,两个设备的配置描述符合写在一起,注意其中某些项。详情参考代码




- IDA描述符
此处不需要IDA描述符,有关该描述符的定义参考该网站[6]。
- PMA地址设置。
每个EP(EP0、EP1 EP2 PE3)都要有一个缓存区,需要配置每个EP的IN和OUT端点的缓存地址,该函数在usbd_conf.c函数里面。


注意这里的端点0的初始值是0x18,但是我参考了这个网站[7][8][9]的相关配置,故设置成EP0设置成0x40? 而端点1属于键盘的接口,数据量一般不大,这里只设置了16个字节(0xd0-0xc0),其他的端口按规矩设置0x40,也就是64个字节,这里中断说明一下,PMA地址的最大值不能超过0x1C0,否则枚举不成功。
- 为每个设备配置静态内存,修改文件名为usbd_conf.c和usbd_conf.h。
每个设备需要占据不同的内存空间,而默认生成的工程是以你母版工程的默认设备的地址如,如图所示,为USBD_mallc,



故要将相关函数及宏定义修改成以下的样子。




- 去掉CustomHID发送report函数的state判断,直接往某个端点上发送报文。


正确的结果是识别出如下的设备,弹出一个U盘,鼠标不断往下移动,并且不断输出一个a(英文输入法下)。



有关U盘文件系统参考[10]。
- https://blog.csdn.net/laifengyuan1/article/details/107954222
- https://blog.csdn.net/laifengyuan1/article/details/108243418
- https://blog.csdn.net/laifengyuan1/article/details/108243474
- https://blog.csdn.net/laifengyuan1/article/details/109624730
- https://blog.csdn.net/laifengyuan1/article/details/108243522
- https://blog.csdn.net/u013256018/article/details/61947232
- https://blog.csdn.net/lanmanck/article/details/8943501
- https://www.amobbs.com/thread-5692754-1-1.html
- https://blog.csdn.net/wlcwjy/article/details/110222891?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-5.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-5.control
- https://www.cnblogs.com/libra13179/p/7156363.html
- 《圈圈教你玩USB》书籍
? ? ? ? ? ? 工程下载链接:? ?? ?F103C8T6_USB_CUSTOMHID+MSC? ? ?
|