USB — STM32-FS-USB-Device驱动代码简述(二) 目录 链接快速定位 前沿 1 STM32-FS-USB驱动程序下载 2 STM32-USB-FS设备固件库 2.1 USB应用程序层次结构 2.2 USB-FS_Device peripheral interface 2.3 USB-FS-Device_Driver medium layer 2.3 Application interface 3 代码讲解 3.1 初始化代码讲解 3.2 描述符讲解 3.3 中断处理函数 3.3.1 复位函数 3.3.2 正确传输完成函数 3.3.2.1 枚举过程正确传输完成函数 3.3.2.2 非端点0正确传输完成函数 链接快速定位 USB — 初识USB协议(一) STM32F10x, STM32L1xx and STM32F3xx USB full speed device library (UM0424) STM32 USB-FS-Device development kit 前沿 本小节主要讲述STM32F103USB设备模式下的标准库驱动程序结构,代码比较复杂,需要读者对USB协议有一个全面的了解,这里只讲述一下比较浅显的东西。 更多资料请参考:STM32 USB-FS-Device development kit
1 STM32-FS-USB驱动程序下载 每个芯片厂商都会提供一套属于自己的外设驱动及应用程序,这也是我们所说的生态的一部分,可以在官网下载。我们这里主要讲解STM32F103的USB驱动,所以我们需要去ST的官网下载我们需要的驱动程序,STM32F10x, STM32L1xx and STM32F3xx USB full speed device library (UM0424)。
2 STM32-USB-FS设备固件库 2.1 USB应用程序层次结构 下图显示了典型USB的不同组件之间的交互应用程序和USB FS设备库。
从上图可知,USB设备固件库被分为两层: STM32_USB-FS_Device_Driver:该层管理与USB-FS_ Device外围设备和USB标准协议的直接通信。STM32_USBFS_ Device_Driver符合USB 2.0规范,与标准STM32标准外设库分离。Application Interface layer:该层为用户提供了库核心和最终应用程序之间的完整接口。 下图显示了USB FS设备库的程序包组织以及所有演示和子文件夹。
2.2 USB-FS_Device peripheral interface USB全速设备外设接口层主要由以下部分组成: 硬件抽象层正确传输中断服务例程数据传输管理
2.3 USB-FS-Device_Driver medium layer USB全速设备驱动中间层主要由以下部分组成: USB设备全局变量初始化USB协议管理简化了对端点的读写访问功能(USB-FS_Device外围设备的抽象层)库中使用的USB定义和类型根据使用的评估板定义硬件
2.3 Application interface 应用接口主要由以下部分组成: USB全速设备配置文件USB设备描述符USB设备应用程序特定属性不带控制端点的正确传输中断例程USB设备中断处理函数USB设备电源和连接管理函数
3 代码讲解 代码讲解主要涉及以下几个方面: 初始化描述符中断处理函数 复位函数正确传输完成函数 这里以“VirtualComport_Loopback”工程为例进行讲解。 3.1 初始化代码讲解 GPIO初始化 GPIO初始化程序主要是初始化通信所使用的DM和DP引脚以及USB全速设备的DP上拉引脚。 USB时钟配置 USB时钟配置主要是配置USB的PHY时钟,运行在48MHz的时钟下(系统时钟72M),并使能USB时钟。
USB中断初始化 USB中断初始化,主要是使能USB的中断,并且使能中断屏蔽位。 经过上面的配置,当USB设备端接入主机的时候,设备端的中断处理函数就能响应相应的中断请求,开始建立通信。 3.2 描述符讲解 描述符放在“usb_desc.c”和“usb_desc.h”文件中,更多细节参见USB — 初识USB协议(一)。 设备描述符 包含了设备的基本信息,比如USB版本号,端点0的传输大小,VID,PID,设备的类型等。 配置描述符 配置描述符数组包含了配置描述符、接口描述符、功能描述符,端点描述符等,具体的描述符含义根据每种USB的CLASS不同而含义有所不同,后期小节会陆续讲解。 其它描述符 其它描述符包括语言描述符,PID描述符、VID描述符,报告描述符等,这些描述符根据不同的厂商,不同的产品以及不同的USB应用而有所不通,我们会在后续的类容对这些描述符做一个简单的讲解。 3.3 中断处理函数 USB驱动最关键的部分在于中断处理函数部分,协议的大部分实现都是在中断中实现的,我们这里简单的讲解一下。首先进入USB中断处理函数,进入到USB_Istr()函数中去。 可以看到USB_Istr()函数实现了USB的中断的所有功能,我们这里只针对几个比较重要的函数进行讲解: 复位函数正确传输完成函数 3.3.1 复位函数 复位是在USB识别到设备的时候,主机主动发出的特定序列,当USB设备收到这个特定序列的时候,就会产生中断相应,并进入中断中去处理相应的函数,这里的复位中断处理函数主要是配置端点的属性及端点的大小。 注意一下宏定义“BTABLE_ADDRESS”的对应的USB中断缓存区地址的偏移,也就是512Byte的RAM空间,宏“ENDP0_RXADDR”等是定义端点的发送和接收地址存放在RAM空间的具体位置,以“BTABLE_ADDRESS”为偏移。 3.3.2 正确传输完成函数 正确传输完成函数分为枚举过程(端点0)的正确传输完成函数和非端点0的正确传输完成函数。 3.3.2.1 枚举过程正确传输完成函数 枚举过程的正确传输完成函数主要是接收SETUP指令请求,并相应的告知USB主机设备的描述符信息。 以下代码是处理USB主机的数据,把USB主机的SETUP请求数据存在pInformation结构体中,并在后续的函数进行指令的解析,并通过相对应的SETUP请求发送相对应的数据。 3.3.2.2 非端点0正确传输完成函数 非控制端点0正确传输完成函数根据不同的USB应用存在不同的差距,但是主体框架已经完成,只需要用户在特定的框架中填写特定的程序即可。 比如当前程序只用到端点1的TX和端点3的RX,就只需要在端点1的TX和端点3的RX中编写相应的应用程序,其它端点不必理会。 到这里,本章就基本上讲完了,主要还是从应用的角度去简单的讲解了一下代码,如果读者需要更深入的了解代码的结构,还是需要大家仔细去学习USB的驱动源码的。 接下来讲解STM32 USB的虚拟串口环回功能实现,敬请期待。。。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/61834.html