STM32F10xxx
USB开发人员工具包
USB
开发人员
工具包
STM32F10 xxx ADC 应用示例©2007 MXCHIP Corporation.All rights 021-52655026/025 1用户手册 STM32F10 xxx USB 开发人员工具包 介绍 STM32F10 xxx USB 开发人员工具包是一个完整的固件和软件包,并且包括所有 USB 传输方式(控制,中断,块,同步的方式)的实例和范例,支持 STM32F10 xxx 系列的所有微控制器。STM32F10 xxx USB 开发人员工具包的目标是在每种 USB 传输方式都提供一个使用STM32F10 xxx USB 库的固件范例。本文档是对 STM32F10 xxx USB 开发人员工具包的所有组件的描述,包括以下内容:?STM32F10 xxx USB 库,关于默认端点和标准请求的过程?设备固件升级范例:控制传输方式?操纵杆鼠标范例:中断传输方式?大容量存储范例:批量传输方式?虚拟 COM 端口:批量传输方式?USB 音频范例(USB 扬声器):同步传输方式。STM32F10 xxx ADC 应用示例©2007 MXCHIP Corporation.All rights 021-52655026/025 2目录 1STM32F10 xxx USB固件库.51.1USB应用层次.51.2USB库内核.61.2.1usb_type.h.61.2.2Usb_reg(.c,.h).71.2.3usb_int(.c,.h).141.2.4usb_core(.c,.h).141.3应用接口.191.3.1usb_istr(.c).201.3.2usb_conf(.h).201.3.3usb_endp(.c).201.3.4usb_prop(.c,.h).201.3.5usb_pwr(.c,.h).231.4用STM32F10 xxx USB 库实现USB应用.231.4.1实现无数据类专用请求.231.4.2如何管理非控制端点的数据传输.262操纵杆鼠标范例.263设备固件升级.263.1DFU扩展协议.273.1.1介绍.273.1.2阶段.283.1.3请求.283.2DFU 模式选择.293.2.1运行时描述集.293.2.2DFU模式描述符集.30 STM32F10 xxx ADC 应用示例©2007 MXCHIP Corporation.All rights 021-52655026/025 33.3重配置阶段.363.4传输阶段.363.4.1请求.373.4.2特殊指令/协议描述.373.4.3DFU 状态图.383.4.4下载和上传.403.4.5显示阶段.413.5STM32F10 xxx DFU 实现.413.5.1支持的存储器.413.5.2DFU 模式进入机制.413.5.3STM32F10 xxx的可用DFU 映像.424大容量存储范例.424.1大容量存储范例总论.434.2大容量存储协议.434.2.1仅块传输.434.2.2小型计算机系统接口(SCSI).464.3大容量范例的实现.484.3.1硬件配置接口.484.3.2端点配置和数据管理.494.3.3类细节请求.504.3.4标准请求规需求.524.3.5BOT 状态机.52 STM32F10 xxx ADC 应用示例©2007 MXCHIP Corporation.All rights 021-52655026/025 44.3.6SCSI 协议实现.534.4如何定制大容量存储范例.555虚拟COM端口范例.595.1虚拟COM端口范例建议.595.2软件驱动安装.605.3实现.615.3.1硬件实现.615.3.2固件实现.616USB音频范例.636.1同步传输综述.636.2音频设备类综述.646.3STM32FF10 xxx USB扬声器范例.656.3.1通用功能.666.3.2实现.677修改历史.768版权声明:.77 STM32F10 xxx ADC 应用示例©2007 MXCHIP Corporation.All rights 021-52655026/025 51 STM32F10 xxx USB固件库 本章节介绍用于管理 STM32F10 xxx USB 2.0 全速设备外设的固件接口(称之为 USB 库)。固件库的主要用途是利用 STM32F10 xxx 系列微控制器家族中的 USB 宏单元来简化应用开发。1.1 USB应用层次 图 1 显示了典型 USB 应用中不同组件和 USB 库之间的交互。图 1 USB 应用层次 USB 库分为两个层次:?USB 库内核层:该层管理使用 USB IP 硬件和 USB 标准协议的直接传输。USB 库内核遵从 USB2.0标准并和标准的 STM32F10 xxx 固件库分离。?用户接口层:本层为用户提供了库内核和最终应用之间的完整接口。注意:用户接口层和最终应用可以与固件库通信来管理应用的硬件需求。STM32F10 xxx ADC 应用示例©2007 MXCHIP Corporation.All rights 021-52655026/025 6 关于两个层的编码规则将在接下来的两个章节中介绍。1.2 USB库内核 表 1 介绍了 USB 库的内核模块:表 1 USB 库内核模块 文件 描述 Usb_type.h 库内核用到的数据类型,本文件用于保证USB 库的独立性。Usb_reg(.h,.c)硬件抽象层 Usb_int.c 正确传输中断服务程序 Usb_init(.h,.c)USB 初始化 Usb_core(.h,.c)USB 协议管理(服从 USB2.0 规范的第九章)Usb_mem(.h,.c)数据传输管理(从包存储器区域发出的或者发往包存储器区域的)Usb_def.h USB 定义 1.2.1 usb_type.h 该文件提供了库中使用的主要数据类型,这些数据类型和使用的微控制器家族有关。注意:USB 库中类型的定义和 STM32F10 xxx 固件库中相同,这保证了整个代码的一致性。STM32F10 xxx ADC 应用示例©2007 MXCHIP Corporation.All rights 021-52655026/025 71.2.2 Usb_reg(.c,.h)Usb_reg 模块实现了硬件抽象层,它提供了访问 USB 宏单元寄存器的一组基本函数。注意:可用函数有两种调用方式:作为宏:_调用方式是:函数名(参数 1,2)作为子程序:调用方式是:函数名(参数 1,2)通用寄存器函数 这些函数可以用于设置或获得不同寄存器的值。表 2 通用寄存器函数 寄存器 函数 CNTR Void SetCNTR(u16 wValue)U16 GetCNTR(void)ISTR Void SetISTR(u16 wValue)U16 GetISTR(void)FNR U16 GetIFNR(void)DADDR Void SetIDADDR(u16 wValue)U16 GetIDADDR(void)BTABLE Void SetBTABLE(u16 wValue)U16 GetBTABLEI(void)端点寄存器函数 所有端点寄存器的操作可以通过 SetENDPOINT 和 GetENDPOINT 函数完成。但是,为了能够 STM32F10 xxx ADC 应用示例©2007 MXCHIP Corporation.All rights 021-52655026/025 8直接对特定字段操作,从这两个函数派生了很多函数。a)设置/获取端点值 SetENDPOINT:void SetENDPOINT(u8 bEpNum,u16 wRegValue)bEpNum=端点编号,wRegValue=要写入的值 GetENDPOINT:u16 GetENDPOINT(u8 bEpNum)bEpNum=端点编号 返回值:端点寄存器的值 b)端点类型字段 端点类型方式字段可以取如下定义的值:#define EP_BULK (0 x0000)/批量端点#define EP_CONTROL (0 x0200)/控制端点#define EP_ISOCHRNOUS (0 x0400)/同步端点#define EP_INTERRUPT (0 x0600)/中断端点 SetEPType:void SetEPType(u8 bEpNum,u16 wtype)bEpNum=端点编号,wtype=端点类型 GetEPType:u16 GetEPType(u8 bEpNum)bEpNum=端点编号 返回值:如上定义的值。c)端点状态字段 端点状态寄存器的 STAT_TX/STAT_RX 字段可以取如下定义的值:STM32F10 xxx ADC 应用示例©2007 MXCHIP Corporation.All rights 021-52655026/025 9#define EP_TX_DIS (0 x0000)/端点发送关闭#define EP_TX_STALL (0 x0010)/端点发送延迟#define EP_TX_NAK (0 x0020)/端点发送不应答#define EP_TX_VALID (0 x0030)/端点发送有效#define EP_RX_DIS (0 x0000)/端点接收关闭#define EP_RX_STALL (0 x1000)/端点接收延迟#define EP_RX_NAK (0 x2000)/端点接收不应答#define EP_RX_VALID (0 x3000)/端点接收有效 SetEPTxStatus:void SetEPTxStatus(u8 bEpNum,u16 wState)SetEPRxStatus:void SetEPRxStatus(u8 bEpNum,u16 wState)bEpNum=端点编号,wState=如上定义的值 GetEPTxStatus:u16 GetEPTxStatus(u8 bEpNum)GetEPRxStatus:u16 GetEPRxStatus(u8 bEpNum)bEpNum=端点编号 返回值:如上定义的值。d)端点种类字段 SetEP_KIND :void SetEP_KIND(u8 bEpNum)ClearEP_KIND:void ClearEP_KIND(u8 bEpNum)bEpNum=端点编号 Set_Status_Out :void Set_Status_Out(u8 bEpNum)Clear_Status_Out:void Clear_Status_Out(u8 bEpNum)STM32F10 xxx ADC 应用示例©2007 MXCHIP Corporation.All rights 021-52655026/025 10bEpNum=端点编号 SetEPDoubleBuff :void SetEPDoubleBuff(u8 bEpNum)ClearEPDoubleBuff:void ClearEPDoubleBuff(u8 bEpNum)bEpNum=端点编号 e)正确传输 Rx/Tx 字段 ClearEP_CTR_RX:void ClearEP_CTR_RX(u8 bEpNum)ClearEP_CTR_TX:void ClearEP_CTR_TX(u8 bEpNum)bEpNum=端点编号 f)数据翻转 Rx/Tx 字段 ToggleDTOG_RX:void ToggleDTOG_RX(u8 bEpNum)ToggleDTOG_TX:void ToggleDTOG_TX(u8 bEpNum)bEpNum=端点编号 g)地址字段 SetEPAdress:void SetEPAddress(u8 bEpNum,u8 bAddr)bEpNum=端点编号 bAddr =要设置的地址 GetEPAdress:BYTE GetEPAddress(u8 bEpNum)bEpNum=端点编号 缓冲描述符函数 这些函数用于设置或获取端点接收和发送缓冲地址和大小 a)Tx/Rx 缓冲地址字段 STM32F10 xxx ADC 应用示例©2007 MXCHIP Corporation.All rights 021-52655026/025 11SetEPTxAddr:void SetEPTxAddr(u8 bEpNum,u16 wAddr);SetEPRxAddr:void SetEPRxAddr(u8 bEpNum,u16 wAddr);bEpNum=端点编号 wAddr =要设置的地址(PMA 缓存地址表示)GetEPTxAddr:u16 GetEPTxAddr(u8 bEpNum);GetEPRxAddr:u16 GetEPRxAddr(u8 bEpNum);bEpNum=端点编号 返回值:地址(PMA 缓冲地址表示)b)Tx/Rx 缓冲计数器字段 SetEPTxCount:void SetEPTxCount(u8 bEpNum,u16 wCount);SetEPRxCount:void SetEPRxCount(u8 bEpNum,u16 wCount);bEpNum=端点编号 wCount=要设置的计数器值 GetEPTxCount:u16 GetEPTxCount(u8 bEpNum);GetEPRxCount:u16 GetEPRxCount(u8 bEpNum);bEpNum=端点编号 返回值:计数器值 双缓存端点函数 双缓存模式是为了在批量和同步模式下得到高速的数据传输率而设计的。在这种模式下端点寄存器和缓冲描述符单元的某些字段会有不同的含义。STM32F10 xxx ADC 应用示例©2007 MXCHIP Corporation.All rights 021-52655026/025 12为了简化这一特性的使用,开发出一些函数。SetEPDoubleBuff:工作在批量模式下的断点可以通过设置 EP-KIND 位进入双缓存模式。SetEPDoubleBuff()函数完成此任务。SetEPDoubleBuff:void SetEPDoubleBuff(u8 bEpNum);bEpNum=端点编号 FreeUserBuffer:在双缓存模式下端点变为为单向的,不用方向的缓存描述符单元可以用于处理其他的缓存区。地址和计数器必须使用不同的方法操作。Rx 和 Tx 地址和计数器单元变为缓存 0 和缓存 1。用于这个操作模式的函数在库中提供。在批量传输时,传输线路填满其中一个缓存,另一个缓存保留给应用。用户应用必须在批量传输需要缓存之前处理数据。为应用保留的缓存必须及时地释放。使用 FreeUserBuffer 函数释放使用中的缓存 FreeUserBuffer:void FreeUserBuffer(u8 bEpNum,u8 bDir);bEpNum=端点编号 a)双缓存地址 这些函数再双缓存模式下从缓存描述符中设置或获取缓存的地址。SetEPDblBuffAddr:void SetEPDblBuffAddr(u8 bEpNum,u16 wBuf0Addr,u16 wBuf1Addr);SetEPDblbuf0Addr:void SetEPDblBuf0Addr(u8 bEpNum,u16 wBuf0Addr);SetEPDblbuf1Addr:void SetEPDblBuf1Addr(u8 bEpNum,u16 wBuf1Addr);bEpNum=端点编号 STM32F10 xxx ADC 应用示例©2007 MXCHIP Corporation.All rights 021-52655026/025 13wBuf0Addr,wBuf1Addr=缓存地址(PMA 缓存地址表示)GetEPDblBuf0Addr:u16 GetEPDblBuf0Addr(u8 bEpNum);GetEPDblbuf1Addr:u16 GetEPDblBuf1Addr(u8 bEpNum);bEpNum=端点编号 返回值:缓存地址 b)双缓存计数器 这些函数再双缓存模式下从缓存描述符中设置或获取缓存计数器的值。SetEPDblBuffCount:void SetEPDblBuffCount(u8 bEpNum,u8 bDir,u16 wCount);SetEPDblBuf0Count:void SetEPDblBuf0Count(u8 bEpNum,u8 bDir,u16 wCount);SetEPDblBuf1Count:void SetEPDblBuf1Count(u8 bEpNum,u8 bDir,u16 wCount);bEpNum=端点编号 bDir =端点方向 wCount=缓存计数器值 GetEPDblBuf0Count:u16 GetEPDblBuf0Count(u8 bEpNum);GetEPDblBuf1Count:u16 GetEPDblBuf1Count(u8 bEpNum);bEpNum =端点编号 返回值:缓存计数器 c)双缓存状态字段 在单一缓存和双缓存模式中使用一样的函数管理端点状态(除了 STALL 状态仅用于双缓存状态),这个功能由下面这个函数管理。SetDouBleBuffEPStall:void SetDouBleBuffEPStall(u8 bEpNum,u8 bDir)STM32F10 xxx ADC 应用示例©2007 MXCHIP Corporation.All rights 021-52655026/025 14bEpNum=端点编号 bDir =端点方向 1.2.3 usb_int(.c,.h)usb_int 模块处理正确的传输中断服务程序,提供了 USB 协议事件和库内核之间的连接。The STM32F10 xxx USB 外设提供两种正确传输例程。?低优先级中断:由 CTR_LP()函数管理,在控制,中断,批量模式下使用(单缓存模式)。?高优先级中断:由 CTR_HP()函数管理,在快速传输方式(如同步,批量模式)(双缓存模式)1.2.4 usb_core(.c,.h)usb_core 模块是库的内核,实现了 USB 2.0 规范中第九章描述的所有功能。可用的子例程覆盖了和控制端点(EP0)有关的 USB 标准请求处理以及为完成列举过程所需代码的提供。为了处理设置事务的不同阶段,内核实现了一个状态机。USB 内核模块还利用结构体 User_Standard_Requests 实现了标准请求和用户实现之间的动态接口。只要需要,USB 内核可以将一些类专用的请求和总线事件分配给用户程序处理。用户处理过程在Device_Property 结构中给出。下面的段落中给出内核中使用的各种数据和函数结构。1.设备表结构 内核将设备级信息保存在设备表结构中,设备表结构是 DEVICE 类型,类型定义如下:STM32F10 xxx ADC 应用示例©2007 MXCHIP Corporation.All rights 021-52655026/025 15typedef struct _DEVICE u8 Total_Endpoint;u8 Total_Configuration;DEVICE;2.设备信息结构 USB 内核将主机发送过来的用于实现 USB 设备的设置包保存在设备信息结构中,该结构类型是DEVICE_INFOR,类型定义如下:typedef struct _DEVICE_INFO u8 USBbmRequestType;u8 USBbRequest;u16_u8 USBwValues;u16_u8 USBwIndexs;u16_u8 USBwLengths;u8 ControlState;u8 Current_Feature;u8 Current_Configuration;u8 Current_Interface;u8 Current_AlternateSetting;ENDPOINT_INFO Ctrl_Info;DEVICE_INFO;为了简化对 DEVICE_INFO 结构中的某些字段的访问(以 u16 或 u8 格式),定义了一个共用体u16_u8。STM32F10 xxx ADC 应用示例©2007 MXCHIP Corporation.All rights 021-52655026/025 16typedef union u16 w;struct BW u8 bb1;u8 bb0;bw;u16_u8;结构体字段描述 USBbmRequestType 是设置包中的 bmRequestType 的副本 USBbRequest 是设置包中的 bRequest 的副本 USBwValues 定义为 WORD_BYTE 类型并可以通过 3 个宏访问:#define USBwValue USBwValues.w#define USBwValue0 USBwValues.bw.bb0#define USBwValue1 USBwValues.bw.bb1 USBwValue 是设置包中的 wValue 的副本 USBwValue0 是 wValue 的低字节,USBwValue1 是 wValue 的高字节 USBwIndexs 定义为 USBwValues 类型并可以通过 3 个宏访问::#define USBwIndex USBwIndexs.w#define USBwIndex0 USBwIndexs.bw.bb0#define USBwIndex1 USBwIndexs.bw.bb1 USBwIndex 是设置包中的 wIndex 的副本 STM32F10 xxx ADC 应用示例©2007 MXCHIP Corporation.All rights 021-52655026/025 17USBwIndex0 是 wIndex 的低字节,USBwIndex1 是 wIndex,的高字节 USBwLengths 定义为 WORD_BYTE 类型并可以通过 3 个宏访问:#define USBwLength USBwLengths.w#define USBwLength0 USBwLengths.bw.bb0#define USBwLength1 USBwLengths.bw.bb1 USBwLength 设置包中的 wLength 的副本 USBwLength0 是 wLength,的低字节,USBwLength1 是 wLength 的高字节 ControlState 是内核的状态,可用的值定义在 CONTROL_STATE 中。Current_Feature 反映了当前设备的特性。由 SET_FEATURE,CLEAR_FEATURE 改写,GET_STATUS 来取值。用户代码不使用这个字段。Current_Configuration 指 工 作 中 设 备 的 设 置。由SET_CONFIGURATION 和 GET_CONFIGURATION 分别设值和取值。Current_Interface 是选中的接口。Current_Alternatesetting 是为当前工作设置和接口的选中的备用设置。由 SET_ _INTERFACE和 GET_ _INTERFACE 分别设值和取值。Ctrl_Info 是 ENDPOINT_INFO 类型 全局变量pInformation用于简化对设备信息表的访问,是一个指向DEVICE_INFO结构的指针。事实上,pInformation=&Device_Info.3.设备属性结构 USB 内核在必要时将控制权交给用户程序。用户处理过程以 Device_Property 数组给出,该结构属于 DEVICE_PROP 类型,类型定义如下:typedef struct _DEVICE_PROP STM32F10 xxx ADC 应用示例©2007 MXCHIP Corporation.All rights 021-52655026/025 18void(*Init)(void);void(*Reset)(void);void(*Process_Status_IN)(void);void(*Process_Status_OUT)(void);RESULT(*Class_Data_Setup)(u8 RequestNo);RESULT(*Class_NoData_Setup)(u8 RequestNo);RESULT (*Class_Get_Interface_Setting)(u8 Interface,u8 AlternateSetting);u8*(*GetDeviceDescriptor)(u16 Length);u8*(*GetConfigDescriptor)(u16 Length);u8*(*GetStringDescriptor)(u16 Length);u8 MaxPacketSize;DEVICE_PROP;4.用户标准请求结构 用 户 标 准 需 求 结 构 是 用 户 代 码 和 标 准 请 求 管 理 之 间 的 接 口,该 结 构 属 于USER_STARDARD_REQUESTS 类型,类型定义如下:typedef struct _USER_STANDARD_REQUESTS void(*User_GetConfiguration)(void);void(*User_SetConfiguration)(void);void(*User_GetInterface)(void);void(*User_SetInterface)(void);STM32F10 xxx ADC 应用示例©2007 MXCHIP Corporation.All rights 021-52655026/025 19void(*User_GetStatus)(void);void(*User_ClearFeature)(void);void(*User_SetEndPointFeature)(void);void(*User_SetDeviceFeature)(void);void(*User_SetDeviceAddress)(void);USER_STANDARD_REQUESTS;如果用户想要在收到标准 USB 请求后实现特定的代码,那么将不得不使用本结构中的相应函数。应用开发人员必须实现 DEVICE_PROP,Device_Table,USER_STANDARD 这三个树结构(用于管理类专用请求和应用相关的控制)。这些结构中的不同字段会在下个章节中介绍。1.3 应用接口 应用接口模块是作为一个模版提供给用户的,开发人员可以根据实际的应用对模版进行裁剪,表 3 显示了应用接口中使用的各种模块。表 3 应用接口模块 文件 描述 usb_istr(.c,.h)USB 中断处理函数 usb_conf.h USB 配置文件 usb_prop(.c,.h)USB 应用相关属性 usb_endp.c CTR 中断处理程序(非控制端点)usb_pwr(.h,.c)USB 电源管理模块 usb_desc(.c,.h)USB 描述符 STM32F10 xxx ADC 应用示例©2007 MXCHIP Corporation.All rights 021-52655026/025 20 1.3.1 usb_istr(.c)USB_istr 提供了一个名为 USB_Istr()的函数,该函数用于处理所有的 USB 宏单元中断。每一个 USB 中断源有一个名为 XXX_Callback(如 RESET_Callback)的回调函数,这些回调函数用于实现用户中断处理器。为了启用回调程序,必须在 USB 配置文件 USB_conf.h 中 定义名为 XXX_Callback 的与处理程序开关。1.3.2 usb_conf(.h)usb_conf.h 用于:?定义 BTABLE 和 PMA 中的所有端点地址?定义相应事件中的中断掩码 1.3.3 usb_endp(.c)USB_endp 模块处理除端点 0(EP0)外所有的 CTR 的正确传输程序。为了启用回调处理器进程,必须在 USB_conf.h 中定义一个名为 EPx_IN_Callback(IN 传输)和 EPx_OUT_Callback(OUT 传输)的预处理器 1.3.4 usb_prop(.c,.h)USB_prop 模块实现了 USB 内核使用的 Device_Property,Device_Table 和 USER_STANDARD_REQUEST 结构。STM32F10 xxx ADC 应用示例©2007 MXCHIP Corporation.All rights 021-52655026/025 21设备属性的实现 设备属性结构字段的描述如下:void Init(void):USB IP 的初始化过程.在应用开始时调用一次,用于管理初始化进程。void Reset(void):USB IP 复位过程.当宏单元收到 RESET 信号时调用,用户程序应该在此过程中设置端点(设置默认的控制端点并使能接收)。void Process_Status_IN(void):回调函数,当一个进入某个阶段状态结束时调用。用户程序可以使用这个回调函数执行类或者应用相关的过程。void Process_Status_OUT(void):回调函数,当一个退出某个阶段状态结束时调用,和Process_Status_IN 一样,用户程序可以在退出某个阶段状态后执行一些动作。RESULT(看下面的注意事项)*(Class_Data_Setup)(BYTE RequestNo):回调函数,当一个需要 data stage 的类请求到来时调用,内核无法处理该请求,在这种情况下,用户代码使用用户编写的代码分析请求,准备数据,并把数据传给内核。再和主机交换信息。参数 RequestNo 显示了请求的数量,返回值为:RESULT 类型.。表示给内核的请求处理结果 RESULT(*Class_NoData_Setup)(BYTE RequestNo)回调函数,当一个不需要data stage的非标准设备请求到来时调用,内核无法处理该请求,用户代码使用用户编写的代码分析请求并处理,返回值为:RESULT 类型.。表示给内核的请求处理结果 RESULT(*Class_GET_Interface_Setting)(u8 Interface,u8 AlternateSetting):该回调用于测试收到的设置接口的标准请求。用户必须根据它们自身的实现检验接口和预备设置,如果这两个域出错则返回 USB_UNSUPPORT。BYTE*GetDeviceDescriptor(WORD Length):内核得到设备描述符 BYTE*GetConfigDescriptor(WORD Length):内核得到配置描述符 BYTE*GetStringDescriptor(WORD Length):内核得到字符串描述符 STM32F10 xxx ADC 应用示例©2007 MXCHIP Corporation.All rights 021-52655026/025 22 WORD MaxPacketSize:默认控制端点的最大分组大小 注意:RESULT 类型如下 typedef enum _RESULT USB_SUCCESS=0,/*请求成功进行*/USB_ERROR,/*错误 USB_UNSUPPORT,/*请求不支持 USB_NOT_READY/*请求过程还没有完成,*/*端点将对此后的请求不应答*/RESULT;设备表实现 结构字段描述:Total_Endpoint 代表 USB 应用使用的端点数量 Total_Configuration 代表 USB 应用使用的配置数量 USER_STANDARD_REQUEST 实现 该结构用于管理接收到所有标准请求(获取描述符请求除外)之后用户处理。该结构的字段有:void(*User_GetConfiguration)(void):在收到 Get Configuration(获得配置)标准请求后调用。void(*User_SetConfiguration)(void):在收到 Set Configuration(设置配置)标准请求后调用。void(*User_GetInterface)(void):在收到 Get interface(获取接口)标准请求后调用。STM32F10 xxx ADC 应用示例©2007 MXCHIP Corporation.All rights 021-52655026/025 23 void(*User_SetInterface)(void):在收到 Set interface(设置接口)标准请求后调用。void(*User_GetStatus)(void):在收到 Get interface(获得状态)标准请求后调用。void(*User_ClearFeature)(void):在收到 Clear Feature(清除)标准请求后调用。void(*User_SetEndPointFeature)(void):在收到 Set Feature(设置)标准请求后调用。void(*User_SetDeviceFeature)(void):在收到 Set Feature(设置)标准请求后调用。void(*User_SetDeviceAddress)(void):在收到 set Address(设置地址)标准请求后调用。1.3.5 usb_pwr(.c,.h)本模块管理 USB 设备的电源,提供了表 4 种列出的函数。表 4 电源管理函数 函数名 描述 RESULT Power_on(void)处理开关开情形 RESULT Power_off(void)处理开关关情形 void Suspend(void)设置挂起模式运行清醒 Void Resume(RESUME_STATE eResumeSetVal)处理唤醒操作 1.4 用STM32F10 xxx USB 库实现USB应用 1.4.1 实现无数据类专用请求 所 有 不 带 数 据 传 输 的 类 专 用 请 求 都 实 现 了 设 备 属 性 结 构 的RESULT(*Class_NoData_Setup)(BYTE RequestNo)字段。请求的 RequestNo 参数可以为 USBbRequest,其他的请求字段保持在设备信息结构体中。用户需要测试请求的所有字段,如果请求可以用类实现,STM32F10 xxx ADC 应用示例©2007 MXCHIP Corporation.All rights 021-52655026/025 24函数返回 USB_SUCCESS,否则,函数返回 UNSUPPORT,库以 STALL 握手的方式来应答。1.4.2 如何实现数据类专用请求 当类请求事件需要数据传输时,用户实现向 USB 库报告所需数据的长度和内存中的位置(如果是从主机接收的数据则是 RAM,如果是发往主机的则是 RAM 或者 Flash)。这类的请求由 RESULT(*Class_Data_Setup)(BYTE RequestNo)函数管理,用户需要为每个类数据传输请求按下列的格式编写特定的函数:u8*My_First_Data_Request(u16 Length)如果Length参数为0,则把pInformation-Ctrl_Info.Usb_wLength字段置为要传输的数据长度,并返回空指针,其它情况返回数据传输地址。下面是一个用 C 实现的例子 u8*My_Fir