单片机学习小组
登录
直播中
周煌煦
8年用户
1129经验值
私信
关注
如何将STM32F103C8T6的CustomHID和MSC USB设备进行复合?
开启该帖子的消息推送
usb
如何将
STM32
F103C8T6的CustomHID和MSC USB设备进行复合?
回帖
(1)
张玉珍
2022-2-22 11:02:49
本文目的:将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文件夹中,如图所示。
在工程母版中新建两个文件
添加u***d_storge_if.c和u***d_storge_if.h文件到工程中,添加h文件的路径
新建u***d_composite.c和u***d_composite.h文件,并添加h文件的路径。这两个文件的作用是整合customhid和msc设备的各项操作,如Init,DeInit,Setup等操作。
composite两个文件可暂时不用书写,尝试编译一下工程,正常情况下,是编译成功的,若不成功,自行根据前面步骤及错误提示加以修改。
编写composite.c和.h文件
定义两个全局变量,因为有两个设备,如果有三个,记得这里也要定义三个。这里的解释可以参考这个网址[4]。此处的复合程序编写可以参考[4][5]
定义复合函数结构体,这里面的函数都是完成两个设备的初始化,设置等操作。
编写配置描述符,两个设备的配置描述符合写在一起,注意其中某些项。详情参考代码
IDA描述符
此处不需要IDA描述符,有关该描述符的定义参考该网站[6]。
PMA地址设置。
每个EP(EP0、EP1 EP2 PE3)都要有一个缓存区,需要配置每个EP的IN和OUT端点的缓存地址,该函数在u***d_conf.c函数里面。
注意这里的端点0的初始值是0x18,但是我参考了这个网站[7][8][9]的相关配置,故设置成EP0设置成0x40 而端点1属于键盘的接口,数据量一般不大,这里只设置了16个字节(0xd0-0xc0),其他的端口按规矩设置0x40,也就是64个字节,这里中断说明一下,PMA地址的最大值不能超过0x1C0,否则枚举不成功。
为每个设备配置静态内存,修改文件名为u***d_conf.c和u***d_conf.h。
每个设备需要占据不同的内存空间,而默认生成的工程是以你母版工程的默认设备的地址如,如图所示,为USBD_mallc,
故要将相关函数及宏定义修改成以下的样子。
去掉CustomHID发送report函数的state判断,直接往某个端点上发送报文。
最后测试。
正确的结果是识别出如下的设备,弹出一个U盘,鼠标不断往下移动,并且不断输出一个a(英文输入法下)。
本文目的:将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文件夹中,如图所示。
在工程母版中新建两个文件
添加u***d_storge_if.c和u***d_storge_if.h文件到工程中,添加h文件的路径
新建u***d_composite.c和u***d_composite.h文件,并添加h文件的路径。这两个文件的作用是整合customhid和msc设备的各项操作,如Init,DeInit,Setup等操作。
composite两个文件可暂时不用书写,尝试编译一下工程,正常情况下,是编译成功的,若不成功,自行根据前面步骤及错误提示加以修改。
编写composite.c和.h文件
定义两个全局变量,因为有两个设备,如果有三个,记得这里也要定义三个。这里的解释可以参考这个网址[4]。此处的复合程序编写可以参考[4][5]
定义复合函数结构体,这里面的函数都是完成两个设备的初始化,设置等操作。
编写配置描述符,两个设备的配置描述符合写在一起,注意其中某些项。详情参考代码
IDA描述符
此处不需要IDA描述符,有关该描述符的定义参考该网站[6]。
PMA地址设置。
每个EP(EP0、EP1 EP2 PE3)都要有一个缓存区,需要配置每个EP的IN和OUT端点的缓存地址,该函数在u***d_conf.c函数里面。
注意这里的端点0的初始值是0x18,但是我参考了这个网站[7][8][9]的相关配置,故设置成EP0设置成0x40 而端点1属于键盘的接口,数据量一般不大,这里只设置了16个字节(0xd0-0xc0),其他的端口按规矩设置0x40,也就是64个字节,这里中断说明一下,PMA地址的最大值不能超过0x1C0,否则枚举不成功。
为每个设备配置静态内存,修改文件名为u***d_conf.c和u***d_conf.h。
每个设备需要占据不同的内存空间,而默认生成的工程是以你母版工程的默认设备的地址如,如图所示,为USBD_mallc,
故要将相关函数及宏定义修改成以下的样子。
去掉CustomHID发送report函数的state判断,直接往某个端点上发送报文。
最后测试。
正确的结果是识别出如下的设备,弹出一个U盘,鼠标不断往下移动,并且不断输出一个a(英文输入法下)。
举报
更多回帖
rotate(-90deg);
回复
相关问答
usb
可以通过
USB
端口对
STM32F103C8T6
进行
编程吗?
2022-12-23
567
STM32f103c8t6
的引脚有哪些
2021-10-26
4754
STM32F103C8T6
的硬件介绍
2021-09-24
8665
如何用ArduinoIDE对
STM32F103C8T6
进行
编程?
2021-12-14
1445
怎样去实现
STM32F103C8T6
的
USB
虚拟串口呢
2021-11-18
2369
如何对
stm32F103c8t6
的固件
进行
烧录呢
2022-01-18
3260
STM32F103C8T6
可以分成哪几个部分
2021-10-18
1591
如何将
MAX30100模块、MAX30205mta模块、Pulsesensors模块连接到
STM32F103C8T6
开发板上
2022-04-28
12159
关于
STM32F103c8T6
虚拟
USB
的问题
2018-09-14
7217
怎样
将
stm32rct6
的串口例程移植到
stm32f103c8t6
上去呢
2021-10-18
2171
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分