历史上的今天
今天是:2025年03月11日(星期二)
2019年03月11日 | STM32 USB学习笔记1
2019-03-11 来源:eefocus
主机环境:Windows 7 SP1
开发环境:MDK5.14
目标板:STM32F103C8T6
开发库:STM32F1Cube库和STM32_USB_Device_Library
之前在STM32论坛里领取过一块STM32开发板,本来以为是带有USB模块接口的,最后发现NUCLEO里是没有把USB模块外接出来的,所以就自个儿掏钱买了一块单板,如下图所示:

单板很简单,单纯是为了学习一下STM32的USB模块,之所以选择这个是因为它便宜,而且ST官方有提供USB模块库方便开发。
USB开发博大精深,比之串口,SPI,I2C来说多了很多东西,一个很简单的例子就是串口,SPI,I2C都可以使用通用IO口来模拟实现,但USB却很少有人这么做。学习USB模块就要学习USB协议,USB协议从1.1到2.0再到3.0,现在貌似到3.1版本了都,版本更替了这么多但不影响我们学习,因为USB协议都是向后兼容的,学习了一个就够了。
STM32F103C8T6的USB模块实现了USB2.0全速总线,符合USB2.0全速设备的计数规范,支持8个双向端点等。
USB总线使用两根线实现差分传输D+、D-,这跟485总线类似。因此,在USB总线上同一时刻只能有一个方向上的传输。
有关USB2.0协议规范可以从USB官网上下载,重点看第9章节即可,600多页的文档从头看到尾是很枯燥的。当然如果有精力的话,整个规范都看完也是很有好处的。跟USB2.0规范相关的还有很多类规范,在开发时如果有需要再看就可以了。
一、USB器件库概述
ST官网提供的USB文档有STM32Cube USB器件库,以及USB培训的一些文档,重点看USB器件库文档就好了,因为我们是把STM32的USB模块当作从设备,当然如果STM32支持USB主机的话还有另外一个主机库(不在这里讨论)。通过查看STM32Cube USB器件库,可以帮助我们快速理解USB模块的架构,简化应用开发。STM32CubeUSB设备库在Cube中所处位置如下:

USB设备库位于HAL驱动层之上,在开发中我们只需关注USB设备库即可,不必关注USB设备的HAL驱动,不然USB设备库就没有存在的意义了。而且USB设备库代码是只读的,不需要修改。
设备库中使用的主要结构体为设备句柄,其类型为USBD_HandleTypeDef,我们不必刻意关注USB HAL驱动中USB所使用的数据结构,因为它们对于我们来说是隐藏的,只需关注设备库曝露给我们的接口即可,设备库是和USB2.0协议密切相关的,因此需要熟悉USB2.0文档有助于我们理解设备库的工作流程。
USB设备库目录分为两层:一层为Core(核心层);另一层为Class(类层),目录结构如下:

结构比较清晰,核心层是不需要动的,类层是扩展用的。
USB设备库中核心层的usbd_conf文件是需要用户自己实现的,用来配置USB的属性,其各个文件的作用如下:

其中usbd_req改为了usbd_ioreq。由表7就可以看出USB2.0规范中第9章很重要。USB器件库文档还详细说明了一下控制端点0,这在USB开发中是一个重要的端点。其作为默认的控制端点用于接收主机发来的各种请求,请求作为Setup包发送到设备,请求又分为标准请求和非标准请求,标准请求在控制端点0上就可处理了,对于非标准请求通过回调函数传递给特定类进行进一步处理。
USB设备库的类层中各个文件作用如下:

其中的usbd_xxx_if_template文件需要由用户实现,目前跟USB设备库相关的文件有两个需要用户去实现即usbd_conf文件和usbd_xxx_if_template文件。至此USB器件库的概述说明就完毕了,更多详细情况查看USB器件库文档即可。
二、USB协议概述
USB协议中用到的一些逻辑部件:
端点:数据传输的最终对象
管道:主机和设备端点之间数据传输的模型
接口:用于描述特定的功能(有一组端点组成)
设备:由一个或多个接口组成
USB传输分为了3层:Packet、Transaction、Transfer,三者是由小到大,关系如下图:

一次Transfer传输分为几个Transaction,一次Transaction由几次Packer组成。
Packet包格式如下:

所有的USB传输都是由USB主机发起,这点跟I2C通信有些类似。
USB的传输分为4类:控制传输、中断传输、同步传输、批量传输,由此引申出4类端点类型:控制端点、中断端点、同步端点、批量端点。

控制传输是双向的,须有IN和OUT两个方向上的端点号。其他类型的传输是单向的。各类传输差别不是很大,只是对时间的要求不同。
有关USB协议的大概情况就介绍到这,更多详情请查阅USB2.0规范以及STM32F103的参考手册。后面将通过VCP具体示例来分析USB开发。
上一篇:STM32 USB学习笔记2
史海拾趣
|
本帖最后由 paulhyde 于 2014-9-15 09:38 编辑 我看了半天,要我在3天3夜做出来,不可想象。 我都3年研发经验了,而且参加过05年的电子竞赛,是天津市2等奖。 可是,看到现在的题目,我怀疑是大学生能做出来的吗??? 如果真能大学生自己做出 ...… 查看全部问答> |
|
蒙soso厚爱,在此向电路新手介绍一个tl431芯片的应用。这颗芯片本身是一个并联基准芯片,由于检测端的存在,可以衍生出很多应用。 tl431应用 [ 本帖最后由 张杰克 于 2010-6-25 18:17 编辑 ]… 查看全部问答> |
|
在一个线程中定义一个数组, 大小为320*240*8 定义1:U8 cData[320*240*8]; 这个应该存在系统的stack里面,结果data abort失败了,提示就是stack的问题,于是重新 定义2:U8 *cData = new U8[320*240*8] ,这个没有问题 ...… 查看全部问答> |
|
C中嵌入asm(\\"SETC INTM\\"编译通不过,嵌入其它语句也一样,但是asm(\\"NOP\\"没问题,请问这是怎么回事? … 查看全部问答> |
|
如题,手头上多了一套板子,139美金的那种,未拆封过,或许可以换TI的LM4F板子,可以加钱换。不过得提下,TI的M4板子似乎有点贵的,呃,相对塔式板似乎不值那么多。换等值的东西也行,暂时没想到可以换什么… 查看全部问答> |




