IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32F103 USB customhid+msc复合 (键鼠+U盘)三个接口,EP1键盘,EP2鼠标 EP3 MSC鼠标同时支持相对模式和绝对模式U盘支持FAT16文件系统 -> 正文阅读

[嵌入式]STM32F103 USB customhid+msc复合 (键鼠+U盘)三个接口,EP1键盘,EP2鼠标 EP3 MSC鼠标同时支持相对模式和绝对模式U盘支持FAT16文件系统

本文目的:将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的工程文件。
  1. 两个工程的HAL版本和USB库版本要一致,否则可能出现问题。
  2. 新建工程的步骤在此不做过多的叙述,可以参考CSDN上的相关例子[2][3]。
  3. 上述工作完成后,即可选定一个工程作为母版,建议选择较难的为母版,本位以cusomhid作为母版(注意:该母版也是经过我修改后的customhid工程)
  4. 添加MSC类的inc和src文件(位于class文件夹类的文件)到HID的Class文件夹中,如图所示。

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

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

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

  1. IDA描述符

此处不需要IDA描述符,有关该描述符的定义参考该网站[6]。

  1. 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]。

  • 参考网站及书籍
  1. https://blog.csdn.net/laifengyuan1/article/details/107954222
  2. https://blog.csdn.net/laifengyuan1/article/details/108243418
  3. https://blog.csdn.net/laifengyuan1/article/details/108243474
  4. https://blog.csdn.net/laifengyuan1/article/details/109624730
  5. https://blog.csdn.net/laifengyuan1/article/details/108243522
  6. https://blog.csdn.net/u013256018/article/details/61947232
  7. https://blog.csdn.net/lanmanck/article/details/8943501
  8. https://www.amobbs.com/thread-5692754-1-1.html
  9. 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
  10. https://www.cnblogs.com/libra13179/p/7156363.html
  11. 《圈圈教你玩USB》书籍

? ? ? ? ? ? 工程下载链接:? ?? ?F103C8T6_USB_CUSTOMHID+MSC? ? ?

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-30 12:54:10  更:2021-07-30 12:56:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 10:12:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计