STM32 之 USB IP(USB模块) 详解

时间:2024-04-08 14:43:22

模块分类

  在 STM32 众多系列的 MCU 中,USB模块并不是相同的,官方称呼为USB IP 不同。总的来说可以分文两大类:USB IP、OTG IP。这两种 IP又可以进行更进一步的细分,如下图:
STM32 之 USB IP(USB模块) 详解
上图中罗列的芯片并不是很全面,某些新系列的芯片可能与上图有出入。各IP的主要区别如下:

  • USB IP:
    • 仅可作为全速或低速的USB设备;
    • 符合USB2.0中的全速规范
    • 可用资源:8个双向可配置端点
    • 512字节 的专用数据包缓冲存储器SRAM
    • CRC(循环冗余校验)生成/校验,反向不归零(NRZI)编码/解码和位填充
    • 支持四种传输类型:对于bulk和同步传输,还支持double buffer模式;使得一个buffer用于USB硬件和PC
      交换数据的同时,另外一个buffer可被MCU使用
    • 支持USB设备的挂起和唤醒操作(写控制寄存器),从而停止设备时钟,以进入低功耗模式
      STM32 之 USB IP(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线上可控嵌入式上拉电阻)
      STM32 之 USB IP(USB模块) 详解
  • FS OTG IP: 可作为全速和低速USB主机;可作为全速USB设备
    STM32 之 USB IP(USB模块) 详解
  • HS OTG IP: 可作为高速、全速和低速USB主机;可作为高速和全速USB设备
    STM32 之 USB IP(USB模块) 详解
    无论以上哪种 IP,其全部符合USB 2.0规范。

Packet buffer的使用

  Packet buffer存在于USB IPUSB+ 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中。
STM32 之 USB IP(USB模块) 详解
在ST给出的驱动中,各端点的初始化情况如下:

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

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.0
  实现的设备例程: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.0.1
  实现的例程(只能是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驱动包的驱动说明。总结一下:
STM32 之 USB IP(USB模块) 详解
上图由于比较早,其中部分芯片没有列出。

配套工具

  ST为开发者提供了一些常用的工具,具体如下:

参考

  ST 的各种培训资料