STM32的USB模块特性
- 遵循USB2.0全速设备标准
- 支持双向8个端点,即8个IN端点和8个OUT端点
- 硬件实现CRC自动生成/校验,NRZI编码/解码和bit-stuffing
- 支持控制传输,中断传输,大容量传输和同步传输四种传输类型,并内置专为大容量传输和同步传输所设定的双缓存区
- 支持USB挂起/唤醒
- 串行接口引擎(SIE):该模块包括的功能有:帧头同步域的识别,位填充,CRC的产生和校验,PID的验证/产生,和握手分组处理等。它与USB收发器交互,利用分组缓冲接口提供的虚拟缓冲区存储局部数据。它也根据USB事件,和类似于传输结束或一个包正确接收等和端点相关时间生成信号,例如 帧首(Start of Frame),USB复位,数据错误等等,这些信号用来产生中断。
- 定时器:此模块为任何要求帧首同步的其他部分产生帧锁时钟脉冲,并且在USB线上无数据传输的时间超过3ms时,就判定为一USB全局挂起事件。
- 分组缓冲器接口:此模块管理那些勇于发送和接收的临时本地内存单元。它根据SIE的要求分配合适的缓冲区,并定位到端点寄存器所指向的存储区地址。它在每个字节传输后,自动递增地址,直到数据分组传输结束。它记录传输的字节数并防止缓冲区溢出。
- 端点相关寄存器:每个端点都有一个与之相关的寄存器,用于描述端点类型和当前状态。对于单向和单缓冲端点,一个寄存器就可以用于实现两个不同的端点。一共8个寄存器,可以用于实现最多16个单向/单缓冲的端点或者7个双缓冲的端点或者这些端点的组合。例如,可以同时实现4个双缓冲端点和8个单缓冲/单向端点。
- 控制寄存器:这些寄存器包含整个USB模块的状态信息,用来触发诸如恢复,低功耗等USB事件。
- 中断寄存器:这些寄存器包含中断屏蔽信息和中断事件的记录信息。配置和访问这些寄存器可以获取中断源,中断状态等信息,并能清楚待处理中断的状态标志。
实现一个USB设备的步骤
1.根据应用选择合适的USB类实现
2.根据所选择的USB类协议,完成各个描述符(包括设备描述符、配置描述符、接口描述符、端点描述符和字符描述符)
3.根据描述符,初始化端点数目,分配各端点所需使用的Packet Buffer
4.初始化所使用的的端点,配置端点的传输类型,方向,Packet Buffer地址,和初始状态
5.在需要发送或接收数据的时候,使能端点
6.在该端点的中断回调函数中,处理数据,如果需要则使能下一次传输
STM32的USB类
- 音频类(Audio)
- 通信类-虚拟串口类(CDC)
- 设备固件升级类(DFU)
- 人机接口类(HID)
- 大容量存储设备类(Mass Storage)
- 智能卡接口设备类(CCID)
- 图像类(Image)
- IrDA桥接设备类(IrDA Bridge)
- 监视设备类(Monitor)
- 个人保健设备类(Personal Health Care)
- 电源设备类(Power Device)
- 物理接口设备类(Physical Interface)
- 打印设备类(Printer)
- 视频类(Video)
- 测试测量类(Test & Measurement)
USB的设备端
接口:接口用于描述特定的功能,每个接口都有一个端点集,用于实现 接口功能。
端点:通信频率 、带宽、端点号、错误处理、最大包长度、传输类型、方向。
Packet Buffer 的设置
每个端点对应于两个分组缓冲区(一般一个用于发送,另一个用于接收)。这些缓冲区可以位于整个分组存储区的任意位置,因为它们的地址和长度都定义在缓冲区描述表中,而缓冲区描述表也同样位于分组缓冲区中,其地址由寄存器确定。
STM32 的 USB 库函数
stm32f10x_it.c:该文件中包含USB中断服务程序,由于USB中断由很多情况,这里的中断服务程序只是调用usb_Istr.c文件中的USB_Istr函数,由USB_Istr函数再做轮询处理。
usb_istr.c:该文件中只有一个函数,即USB中断的USB_Istr函数,该函数对各类引起USB中断的事件作轮询处理。
usb_prop.c:该文件用于实现相关设备的USB协议,例如初始化、SETUP包、IN包、OUT包等等。
usb_pwr.c:该文件中包含梳理上电、调电、挂起和和恢复时间的函数。
hw_config.c:改文件中包含系统配置的函数。