USB解析

上传人:nt****6 文档编号:55782412 上传时间:2018-10-06 格式:DOC 页数:23 大小:123KB
返回 下载 相关 举报
USB解析_第1页
第1页 / 共23页
USB解析_第2页
第2页 / 共23页
USB解析_第3页
第3页 / 共23页
USB解析_第4页
第4页 / 共23页
USB解析_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《USB解析》由会员分享,可在线阅读,更多相关《USB解析(23页珍藏版)》请在金锄头文库上搜索。

1、STM32官方官方 USB 例程详解例程详解一、一、USB 的的“JoyStickMouse”例程结构分析例程结构分析 1、例程的结构、例程的结构 (1)底层结构)底层结构 包包 括括5个文件:个文件:usb_core.c(USB 总线数据处理的核心文件)总线数据处理的核心文件) ,usb_init.c,usb_int.c(用于(用于 端点数据输入输入中断处端点数据输入输入中断处 理)理) ,usb_mem.c(用于缓冲区操作)(用于缓冲区操作) ,usb_regs.c(用于寄存器(用于寄存器 操作)操作) 。它们都包含了头文件。它们都包含了头文件“usb_lib.h”。在这个头文件中,又。在

2、这个头文件中,又 有以下定义:有以下定义: #include “usb_type.h“ #include “usb_regs.h“ #include “usb_def.h“ #include “usb_core.h“ #include “usb_init.h“ #include “usb_mem.h“ #include “usb_int.h“ usb_lib.h 中又包含了七个头文件,其中中又包含了七个头文件,其中 usb_type.h 中主要是用中主要是用 typedef 为为 stm32支持的数支持的数 据类型取一些新的名称。据类型取一些新的名称。usb_def.h 中主要是定义一些相关的

3、数据类型。中主要是定义一些相关的数据类型。 还有一个未包含在还有一个未包含在 usb_lib.h 中的头文件,中的头文件,usb_conf.h 用于用于 USB 设备的配置。设备的配置。 (2)上层结构)上层结构 上上 层结构总共层结构总共5个文件:个文件:hw_config.c(用于(用于 USB 硬件配置)硬件配置) 、usb_pwr.c(用于(用于 USB 连接、连接、 断开操作)断开操作) 、usb_istr.c(直接处理(直接处理 USB 中断)中断) 、usb_prop.c(用于上层协议处理,比如(用于上层协议处理,比如 HID 协议,大容量存储设备协议)协议,大容量存储设备协议)

4、 、usb_desc.c(具体设备的相关描述符定义和处(具体设备的相关描述符定义和处 理)理) 。 可见,可见,ST 的的 USB 操作库结构十分清晰明了,我先不准备直接阅读源代码。而是先利用操作库结构十分清晰明了,我先不准备直接阅读源代码。而是先利用 MDK 的软件模拟器仿真执行,先了解一下设备初始化的流程。的软件模拟器仿真执行,先了解一下设备初始化的流程。 2、设备初始化所做的工作、设备初始化所做的工作 (1)Set_System(void) 这个是这个是 main 函数中首先调用的函数,它位于函数中首先调用的函数,它位于 hw_config.c 文件中。它的主要功能是初始化文件中。它的主

5、要功能是初始化 时钟系统、使能相关的外围设备电源。时钟系统、使能相关的外围设备电源。 配置了配置了 JoyStickMouse 所用到的所用到的5个按键,并且配置了两个个按键,并且配置了两个 EXTI 中断,一个是用于把中断,一个是用于把 USB 从挂起模式唤醒,还有一个用途未知。从挂起模式唤醒,还有一个用途未知。 (2)USB_Interrupts_Config(); 这个是这个是 main 函数中调用的第二个函数,它也位于函数中调用的第二个函数,它也位于 hw_config.c 文件中。主要功能是配置文件中。主要功能是配置 USB 所用到的中断。所用到的中断。 跟踪到代码中,主要设配置了跟

6、踪到代码中,主要设配置了 USB 低优先级中断和唤醒中断,又有一个低优先级中断和唤醒中断,又有一个 EXTI 中断功能未中断功能未 知。知。 (3)Set_USBClock() 这个是这个是 main 函数中调用的第三个函数,它也位于函数中调用的第三个函数,它也位于 hw_config.c 文件中。它的功能是配置和文件中。它的功能是配置和 使能使能 USB 时钟。时钟。 (4)USB_Init(void) 这个是这个是 main 函数中调用的第四个函数,它也位于函数中调用的第四个函数,它也位于 usb_init.c 文件中。它初始化了三个全局文件中。它初始化了三个全局 指针,指向指针,指向 D

7、EVICE_INFO、USER_STANDARD_REQUESTS 和和 DEVICE_PROP 结构结构 体。体。 后面两个是函数指针结构体,里面都是后面两个是函数指针结构体,里面都是 USB 请求实现、功能实现的函数指针。请求实现、功能实现的函数指针。void USB_Init(void) pInformation = pInformation-ControlState = 2; pProperty = pUser_Standard_Requests = /* Initialize devices one by one */ pProperty-Init(); 这三个结构体都是与具体设备枚

8、举和功能实现相关的,定义在这三个结构体都是与具体设备枚举和功能实现相关的,定义在 usb_prop.c 和和 usb_desc.c 文文 件中。件中。 DEVICE_PROP Device_Property = Joystick_init, Joystick_Reset, Joystick_Status_In, Joystick_Status_Out, Joystick_Data_Setup, Joystick_NoData_Setup, Joystick_Get_Interface_Setting, Joystick_GetDeviceDescriptor, Joystick_GetConf

9、igDescriptor, Joystick_GetStringDescriptor, 0, 0x40 /*MAX PACKET SIZE*/ ; USER_STANDARD_REQUESTS User_Standard_Requests = Joystick_GetConfiguration, Joystick_SetConfiguration, Joystick_GetInterface, Joystick_SetInterface, Joystick_GetStatus, Joystick_ClearFeature, Joystick_SetEndPointFeature, Joysti

10、ck_SetDeviceFeature, Joystick_SetDeviceAddress ; Usb_init()函数调用函数调用 pProperty-Init()(实质上就是(实质上就是 Joystick_init)完成设备的初始化。上)完成设备的初始化。上 层程序调用下次函数是常规性的操作。而下层函数(层程序调用下次函数是常规性的操作。而下层函数(usb_init 相对于相对于 usb_prop 是输入底层是输入底层 操作文件)调用上层文件函数我们称之为回调。回调函数的意义在于同一种操作模式、提操作文件)调用上层文件函数我们称之为回调。回调函数的意义在于同一种操作模式、提 供不同的回调

11、函数则可以实现不同的功能。供不同的回调函数则可以实现不同的功能。Windows 中处理消息,好像也用到了这种模式。中处理消息,好像也用到了这种模式。 回调函数的实现方法是函数指针数组。这是指针的高级应用。回调函数的实现方法是函数指针数组。这是指针的高级应用。 这是函数的代码:这是函数的代码:void Joystick_init(void) /* Update the serial number string descriptor with the data from the unique ID*/ Get_SerialNum(); /获取设备序列号,转变为获取设备序列号,转变为 unicode

12、 字符串字符串 pInformation-Current_Configuration = 0; /* Connect the device */ PowerOn(); /连接连接 USB 设备,实质是能让主机检测到了。设备,实质是能让主机检测到了。 /* USB interrupts initialization */ _SetISTR(0); /* clear pending interrupts */ wInterrupt_Mask = IMR_MSK; _SetCNTR(wInterrupt_Mask); /* set interrupts mask */ bDeviceState =

13、UNCONNECTED; 实质上,代码执行到这里,开发板已经可以响应主机发来的数据了。但我还是先把实质上,代码执行到这里,开发板已经可以响应主机发来的数据了。但我还是先把 main()函数的代码看完吧。()函数的代码看完吧。 (5)SysTick_Config(); 这个函数调用主要是为程序中用到的精确延时作配置。这个函数调用主要是为程序中用到的精确延时作配置。 3、进入主循环、进入主循环 进入主循环的工作就两个:进入主循环的工作就两个: Joystick_Send(JoyState()。 JoyState()用来获取按键的状态。用来获取按键的状态。 Joystick_Send(JoyStat

14、e()用来把按键状态发到主机。当然这里真正的发送工作并不是由该用来把按键状态发到主机。当然这里真正的发送工作并不是由该 代码完成的。它的工作只是将数据写入代码完成的。它的工作只是将数据写入 IN 端点缓冲区,主机的端点缓冲区,主机的 IN 令牌包来的时候,令牌包来的时候,SIE 负责把它返回给主机。负责把它返回给主机。 主要代码如下:主要代码如下: UserToPMABufferCopy(Mouse_Buffer, GetEPTxAddr(ENDP1), 4); /从用户复制四个字节到端点从用户复制四个字节到端点1缓冲区,控制端点的输入缓冲区。缓冲区,控制端点的输入缓冲区。 SetEPTxVa

15、lid(ENDP1); /* enable endpoint for transmission */ 4、中断处理过程大致理解、中断处理过程大致理解 (1)usb_istr()函数中的中断处理简单分析函数中的中断处理简单分析 有用的代码大概以下几段,首先是处理复位的代码,调用设备结构中的复位处理函数。有用的代码大概以下几段,首先是处理复位的代码,调用设备结构中的复位处理函数。 wIstr = _GetISTR(); if (wIstr /清复位中断清复位中断 Device_Property.Reset(); 处理唤醒的代码:处理唤醒的代码: if (wIstr Resume(RESUME_EX

16、TERNAL); 处理总线挂起的代码:处理总线挂起的代码: if (wIstr else /* if not possible then resume after xx ms */ Resume(RESUME_LATER); /* clear of the ISTR bit must be done after setting of CNTR_FSUSP */ _SetISTR(u16)CLR_SUSP); 处理端点传输完成的代码,这段是最重要的,它调用底层处理端点传输完成的代码,这段是最重要的,它调用底层 usb_int.c()文件中的()文件中的 CTR_LP()函数来处理端点数据传输完成中断。()函数来处理端点数据传输完成中断。 if (wIstr /* servicing of the endpoint correct transfer interrupt */ 二、二、STM32处理器的处理器的 USB 接口接口 1、接口模块的内部结构、

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号