1、USB库简介
环境:
CUBEMX 5.6.1
STM32Cube MCU Package for STM32F1 Series 1.8.0
STM32F1xx HAL Driver version number V1.1.4
STM32官方提供了两套USB的库,一套用于HOST,一套用于DEVICE,且提供了一些参考资料,如下.
在这里,我只使用了DEVICE,所以笔记也只有DEVICE库的一些个人理解.
2、USB_DEVICE框架
先对USB_DEVICE有一个全面性的了解,这样对后续的修改和理解会有一个很好的帮助.下面的图是CDC工程中的一个举例.
- 最底层是STM32官方的HAL库。
- 最底层的文件是STM32F1XX_LL_USB.C,该文件封装了所有寄存器的操作,提供API被PCD文件调用.
- PCD文件主要包含了USB通信流程中的一些回调函数和对设备句柄的一系列操作的API,及最重要的
HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd),该函数包含了USB处理的所有流程.
-
USB_CONF.C位于HAL驱动与协议栈之间,主要目的就是为了将协议栈与底层硬件完全分离,使得USB设备库可以兼容STM32所有系列,保持通用性.如果想要将ST的USB库移植到到其他芯片,且功能无变化的话,则只需要修改这个文件和更换底层驱动文件即可.ST官方提供了usbd_conf_template.c文件给有需求的用户使用.
-
该层主要分为两部分.分为内核和类驱动.
内核 – USB_CORE.C 内核模块:提供本级 API、管理内部 USB 设备库状态机、处理 USB 中断的回调
– USB_CTLREQ.C请求模块:处理 USB 标准协议中第 9 章所规定的请求
– USB_IOREQ.C I/O 请求模块:处理底层 I/O 请求
– USB 日志和调试模块:遵循调试级别 USB_DEBUG_LEVEL, 输出用户、日志、错误和调试消息。
类驱动 USB 设备库包括一组预定义的类驱动,可通过 USBD_RegisterClass () 程序链接至 USB内核。ST官方提供了写好的部分类文件,如下所示.
- 应用层,根据用户需求不同文件也不尽相同,以CDC类举例说明各个文件的作用.
- USBD_DEVICE.C 该文件只有一个函数,功能是为设备句柄注册接口.这里要说一下,USB库的的所有操作几乎都是对设备句柄的维护.这个还要专门来记录一下.
- USBD_DESC.C 该文件存放着枚举过程中所需要的设备描述符和各种各样的字符串描述符,如果想在电脑上显示出不一样的名字话,只需要修改这个文件即可.
- USBD_CDC_IF.C CDC类将自己对应该的操作接口封装在一个操作数据结构中,由应用来具体实现这些操作,在系统初始化时,由应用将已经定义好的操作接口注册到对应的USB类中,该文件就是实现的CDC的操作接口的具体实现.在USBD_DEVICE.C文件内注册.在使用官方提供的类文件的时候,有部分类不需要该类型的文件(比如HID类).
3、需要注意的头文件
在使用过程中,ST的USB_DEVICE库里面有可能需要修改的并不是很多,如果需要修改则基本聚集在一下两个文件中.
- USBD_CONF.H
该文件内主要分为三大块,分别是USB参数配置,内存管理配置,调试等级配置,我们需要注意的是前面两个.
先说最简单的,USB内核里面唯一涉及到动态内存分配的只有类驱动文件的初始化函数.如果不想使用可以手动静态分配,如果有自己的内存管理模块,可以通过宏进行替换.
其次时USB参数配置,这个主要主要就是根据所使用的类进行配置了,通用的有最大接口数,最大配置数,字符串描述符的最大长度,自供电的开关(F1的开关只是一个标志位,不涉及到硬件).
- USBD_XXX.H
该文件为类驱动头文件,随着使用的类不同参数不同,大致分为两类,分别是端点的分配和端点描述符的参数,类的一些标准请求码.
我们可以根据自身需求修改端点的分配及端点描述符的参数,类的bRequest都是USB官方规定好的,不能修改.