模块分类
在 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规范。
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硬件发送缓冲区的起始地址 @[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驱动包的驱动说明。总结一下:
上图由于比较早,其中部分芯片没有列出。
配套工具
ST为开发者提供了一些常用的工具,具体如下:
- PC端VCP驱动(STSW-STM32102): http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1533/PF257938
- DFU PC端程序(STSW-STM32080): http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1533/PF257916
- HID PC端程序(STSW-STM32084): http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1533/PF257920
参考
ST 的各种培训资料