打印
[应用相关]

USB IP(USB模块)、官方驱动版本 详解

[复制链接]
2219|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nawu|  楼主 | 2021-9-1 16:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
模块分类

  在 STM32 众多系列的 MCU 中,USB模块并不是相同的,官方称呼为USB IP 不同。总的来说可以分文两大类:USB IP、OTG IP。这两种 IP又可以进行更进一步的细分,如下图:

上图中罗列的芯片并不是很全面,某些新系列的芯片可能与上图有出入。各IP的主要区别如下:


  • USB IP:
  • 仅可作为全速或低速的USB设备;
  • 符合USB2.0中的全速规范
  • 可用资源:8个双向可配置端点
  • 512字节 的专用数据包缓冲存储器SRAM
  • CRC(循环冗余校验)生成/校验,反向不归零(NRZI)编码/解码和位填充
  • 支持四种传输类型:对于bulk和同步传输,还支持double buffer模式;使得一个buffer用于USB硬件和PC
  • 交换数据的同时,另外一个buffer可被MCU使用
  • 支持USB设备的挂起和唤醒操作(写控制寄存器),从而停止设备时钟,以进入低功耗模式


F102/103中的USB和CAN共享512字节的专用SRAM来进行数据收发操作,因此两个IP不能同时使用

  • USB+ IP: 是针对USB IP的扩展版本,同样仅可作为全速或低速的USB设备,但是ST针对这部分的USB模块进行了扩展,例如添加了USB低功耗管理等。除了以上USB IP特性外,还有如下:
  • 1024字节 的专用数据包缓冲存储器SRAM
  • 同步传输支持
  • USB 2.0 Link电源管理支持
  • 电池充电规范修订版1.2支持
  • USB连接/断开功能(USB_DP线上可控嵌入式上拉电阻)


  • FS OTG IP: 可作为全速和低速USB主机;可作为全速USB设备
  • HS OTG IP: 可作为高速、全速和低速USB主机;可作为高速和全速USB设备

无论以上哪种 IP,其全部符合USB 2.0规范。

使用特权

评论回复
沙发
nawu|  楼主 | 2021-9-1 16:34 | 只看该作者
Packet buffer的使用
  Packet buffer存在于USB IP和USB+ IP中(在 OTG IP中称为FIFO),其用法是一致的。每个双向端点对应两个packet buffer,分别用于发送和接收。软件通过packet buffer interface来访问它们。
  这些packet buffer的位置和大小都可配置,由***buffer描述表***指定 ,Buffer描述表本身也在这块memory里,它自己的地址是由USB_BTABLE寄存器指定的。Table里每个entry由4个半字组成(分别表示双向EP的接收packet和发送packet的位置和大小) 因此***该table的位置本身必须以8字节对齐***,即USB_BTABLE的低三位全部为0。
  USB外设硬件不会把本EP的数据溢出到与其相邻的其他packet 如果收到的数据多于buffer的长度,则只把前length个数据放到该EP对应的Packet buffer中。


  • 在ST给出的驱动中,各端点的初始化情况如下:
  • 硬件发送缓冲区
  • 在初始化时设定各个EP硬件发送缓冲区的起始地址 @ADDRn_TX@硬件缓冲描述表
  • 在准备好要发送的数据后,设置发送长度@COUNTn_TX@硬件缓冲描述表
  • 硬件接收缓冲区
  • 在初始化时设定各个EP硬件接收缓冲区的起始地址 @ADDRn_RX@硬件缓冲描述表
  • 在初始化时设定各个EP硬件接收缓冲区的长度 @COUNTn_RX的高位@硬件缓冲描述表,以允许接收缓冲区的溢出检测;一般都是接收EP的最大包长
  • 在收到数据并产生ISR中,从硬件接收缓存读取数据之前先要看收到了多少数据(实际收到的数据不一定填满接收缓存的)



使用特权

评论回复
板凳
nawu|  楼主 | 2021-9-1 16:35 | 只看该作者
FIFO的使用
  存在于 OTG IP中。使用相对来说要复杂不少。

驱动程序
  在实际使用中,发现USB驱动有许多bug,需要特殊注意!关于这部分请参考针对USB部分的独立博文。无论是标准外设库版还是HAL库版,ST官方有针对各BUG的独立说明文档,这个在做具体移植时需要特殊注意。

标准外设库版(官方培训文档称为 Legacy library )
  针对不同的芯片有不同的独立版本驱动(主要是USB IP是有区别的)。目前有如下几个:

STSW-STM32046: 主要是针对STM32F105/7, STM32F2 and STM32F4 USB on-the-go Host and device library,对应的说明文档为UM1021。下载地址为 https://www.st.com/content/st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software/stm32-standard-peripheral-library-expansion/stsw-stm32046.html ,该版本的驱动 最新版本为 2.2.1 。
  实现的设备例程:AUDIO、DFU、HID、MSC、VCP、Dual Core(FS IP和HS IP同时工作,分别实现MSC和HID设备)
  实现的主机例程:MSC、HID、Dual Core(FS IP和HS IP同时工作,分别实现MSC和HID主机功能)
  实现的双角色例程:DRD(根据插入电缆的不同,分别作MSC主机和MSC设备功能)
STSW-STM32121: 主要是针对STM32F10x, STM32L1xx and STM32F3xx USB full speed device library,对应的说明文档为UM0424。
下载地址为 https://www.st.com/content/st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software/stm32-standard-peripheral-library-expansion/stsw-stm32121.html ,该版本的驱动 最新版本为 4.1.0 。
  实现的例程(只能是Device):Audio_Speaker、DFU、MSC、Joystick、Custom_HID、VCP、MSC+HID 复合设备
STSW-STM32092: 主要是针对STM32F0x2xx USB FS device library,对应的说明为UM1717。下载地址为 https://www.st.com/content/st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software/stm32-standard-peripheral-library-expansion/stsw-stm32092.html, 该版本驱动的 最新版本为 1.0.0 。这里需要注意,该驱动是针对STM32F0x2xx的,但是可以非常方便的移植到STM32F0xx系列得MCU中。 需要根据具体芯片的时钟,修改驱动的usb_conf.h和usb_bsp.c。关于具体的移植可参考网友的该**USB库STM32F0x2移植到STM32F070笔记
  实现的例程(只能是Device):Audio_Speaker、CCID、MSC、Custom_HID、HID、HID_LPM_test、DFU、Virtual_COM_Port、CDC+HID复合设备、MSC+HID复合设备

  该版本的驱动不但可以非常方便的与之前的标准外设库一同使用,而且可以非常方便的与 HAL 库一起使用。 博文STM32之标准外设版USB驱动+MSC(Host)+Fatfs移植 就是使用的HAL外设库+标准外设库版的USB驱动的移植。使用标准外设库版版USB库的主要原因是,该版本的USB库经过多年验证,相对稳定!而在使用HAL版USB库时,发现了许多BUG。
  以上这些驱动在ST官网一次次改版之后,已经非常难找到!我记得在之前都不需要登陆就可以下载,现在还必须登陆才可以下载!

HAL库版(官方培训文档称为 Cube library )
  从目前的情况来看,ST已经彻底放弃了之前用了很久的标准外设库,全面转投 STM32CubeTM。在驱动程序方面,标准外设库也基本不再维护更新!
  STM32CubeTM系列的驱动相比较标准外设库来说更将全面,同样USB驱动也比标准外设库更加全面。这部分驱动一般很少手动来移植处理,直接使用STM32CubeMX工具来处理。
  不同芯片的USB驱动均包含在针对各芯片的独立Cube驱动包中。其中的USB驱动或多好少回有点区别,也可能没有区别。具体可直接查看Cube驱动包的驱动说明。总结一下:



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

72

主题

3307

帖子

3

粉丝