stm32 usb 设备描述符该stm32头文件怎么写写

梁山夫妻大办离婚庆典,两人亲自把喜字剪开。
让人意想不到的是,其中还有产妇和6个月孕妇。
声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
  接下来介绍 设备的枚举,枚举就是从设备读取各种描述符信息,这样主机就可以根据这些信息来加载合适的驱动,从而知道是什么样的设备,如何进行通信。 使用的是控制传输。控制传输可以保证数据的正确性。控制传输分三个过程:建立过程,可选数据过程及状态过程。
  下面介绍枚举的详细过程。
  USB主机检测到USB设备插入后,就会先对设备复位,并通过一个带数据过程的控制传输完成设备描述符的获取。
  第一步,USB主机会往地址0的端点0发送获取设备描述符的标准请求,发送请求属于控制传输的建立过程。建立过程是一个事务。首先是令牌包,即主机发送一个SETUP令牌,令牌的格式如上一篇描述的那样,有令牌的PID,地址和端点号等;其次是数据包,SETUP使用DATA0数据包,数据包中包括标准请求的ID;最后是握手包,设备只能使用ACK来应答,除非出错不应答。下面根据网上找的USB协议分析捕捉的图分析该建立过程。
  下面通过官方的USB的例子,自己添加打印信息,查看该控制传输的建立工程中USB主机发送的请求。如上一篇介绍,我们只需根据硬件置的标志位来判断USB传输的状态即可。在usb_istr.c的USB_Istr()函数中,根据中断标志,添加打印信息。在正确传输中断的处理函数CTR_LP()中Setup0_Process()函数表示端点0的建立过程,即上面USB主机复位获取设备描述符将执行的函数。增加打印信息的函数如下:
  [cpp] view plain copy
/*******************************************************************************
* Function Name : Setup0_Process
* Deiption : Get the device rest data and dispatch to individual process.
* Input : None.
* Output : None.
* Return : Post0_Process.
*******************************************************************************/
uint8_t Setup0_Process(void)
#ifdef STM32F10X_CL
USB_OTG_EP *
uint16_t offset = 0;
ep = PCD_GetOutEP(ENDP0);
pBuf.b = ep-&xfer_
uint16_t offset = 1;
pBuf.b = PMAAddr + (uint8_t *)(_GetEPRxAddr(ENDP0) * 2); /* *2 for 32 bits addr */
#endif /* STM32F10X_CL */
#ifdef USB_DEBUG0
printf(&\r\nSETUP0中断--&控制传输.建立过程\r\n&);
#endif /* #if USB_DEBUG0 */
if (pInformation-&ControlState != PAUSE)
#ifdef USB_DEBUG0
printf(&设备可以接收新的数据\r\n&);
#endif /* USB_DEBUG0 */
pInformation-&USBbmRequestType = *pBuf.b++; /* bmRequestType */
pInformation-&USBbRequest = *pBuf.b++; /* bRequest */
pBuf.w += /* word not accessed because of 32 bits addressing */
pInformation-&USBwValue = ByteSwap(*pBuf.w++); /* wValue */
pBuf.w += /* word not accessed because of 32 bits addressing */
pInformation-&USBwIndex = ByteSwap(*pBuf.w++); /* wIndex */
pBuf.w += /* word not accessed because of 32 bits addressing */
pInformation-&USBwLength = *pBuf.w; /* wLength */
#ifdef USB_DEBUG0
printf(&设备接收数据如下:\r\n&);
printf(&0x%x &,pInformation-&USBbmRequestType);//用于指定请求的 数据传输反向 请求类型 请求的接收者
printf(&0x%x &,pInformation-&USBbRequest);//标准请求及代码
printf(&0x%x &,pInformation-&USBwValue0);
printf(&0x%x &,pInformation-&USBwValue1);//具体见圈圈书P77页
printf(&0x%x &,pInformation-&USBwIndex0);
printf(&0x%x &,pInformation-&USBwIndex1);
printf(&0x%x &,pInformation-&USBwLength1);
printf(&0x%x &,pInformation-&USBwLength0);
printf(&\r\n&);
#endif /* USB_DEBUG0 */
return Post0_Process();
pInformation-&ControlState = SETTING_UP;
if (pInformation-&USBwLength == 0)
/* Setup with no data stage */
NoData_Setup0();
/* Setup with data stage */
Data_Setup0();
return Post0_Process();
  在打印信息之后直接就让函数返回,使主机得不到ACK应答,下面根据打印信息看下测试情况。
  根据打印信息,由于从机没有ACK应答给PC机的请求,在PC机尝试发了3次请求后,就放弃了。可以在PC机的设备管理器看到,在请求打印3次以后出现了unknown device。
  关于8个字节的请求代码的具体含义请参照USB协议,或者在《圈圈教你玩USB》里面对照。
  以上就是枚举过程获取设备描述符的第一步控制传输的建立过程,主机发送获取描述符的请求,下一篇我们将代码中ACK返回,使主机接收到建立过程的应答,从而进入到数据过程,即设备响应主机的请求,将设备描述符发送给主机。
  原文链接:
欢迎举报抄袭、转载、暴力色情及含有欺诈和虚假信息的不良文章。
请先登录再操作
请先登录再操作
微信扫一扫分享至朋友圈
搜狐公众平台官方账号
生活时尚&搭配博主 /生活时尚自媒体 /时尚类书籍作者
搜狐网教育频道官方账号
全球最大华文占星网站-专业研究星座命理及测算服务机构
电子工程世界(EEWorld)是一家专为中国电子工程师和电...
13051文章数
主演:黄晓明/陈乔恩/乔任梁/谢君豪/吕佳容/戚迹
主演:陈晓/陈妍希/张馨予/杨明娜/毛晓彤/孙耀琦
主演:陈键锋/李依晓/张迪/郑亦桐/张明明/何彦霓
主演:尚格?云顿/乔?弗拉尼甘/Bianca Bree
主演:艾斯?库珀/ 查宁?塔图姆/ 乔纳?希尔
baby14岁写真曝光
李冰冰向成龙撒娇争宠
李湘遭闺蜜曝光旧爱
美女模特教老板走秀
曝搬砖男神奇葩择偶观
柳岩被迫成赚钱工具
大屁小P虐心恋
匆匆那年大结局
乔杉遭粉丝骚扰
男闺蜜的尴尬初夜
客服热线:86-10-
客服邮箱:21ic官方微信 -->
热门搜索:
您现在的位置是: > > >
推荐星级:
已有 196454 个资源
stm32自定义USB设备,基于HID修改的USB自定义设备,屏蔽了USB描述符符的复杂性。
部分文件列表
Custom_HID.rar
该用户分享的资料
该资料最近下载的用户君,已阅读到文档的结尾了呢~~
如何修改stm32的USB例程为自己所用如何修改st
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
如何修改stm32的USB例程为自己所用
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口基于STM32的USB枚举过程学习笔记(五)
09:50:19&&&来源:eefocus &&
接下来,主机将使用新的设备地址和设备进行通信。 主机需要再次获取设备描述符,配置描述符,字符串描述符,另外HID设备还要获取报告描述符等。根据《圈圈教你玩》里面介绍,我们可以使用BUS Hound工具,对主机发送给设备的数据进行抓包,分析数据包,根据USB协议完成相应的主机的请求。
在 USB_HID的例子中,和以上获取描述符相关的主要文件有Usb_desc.c(定义了各种描述符),Usb_prop.c&(其中的CustomHID_GetStringDeiptor函数完成了对主机获取字符串描述符种类的细分)。具体的内容可以自己根据调试信息按照之前几篇文章中介绍的分析方法分析。
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
电机助力相关资源
转向系统相关资源
编辑:什么鱼
本文引用地址:
大学堂最新课程
本周热门资源推荐
EEWORLD独家基于STM32的USB程序开发笔记(五) - STM32/STM8技术论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
基于STM32的USB程序开发笔记(五)
高级工程师
10:58:18  
基于STM32的USB程序开发笔记(五) ——USB设备的枚举(下)SETUP事件正确接收后,根据该事件提供的请求类型进行对主机的响应。SETUP数据结构的wLength字段说明的是请求返回或者提供的数据长度。
如果判断出的请求信息错误或者说不被支持,STM32 USB设备需要中断此次请求:
& & SetEPR_RXStatus(ENDP0, EP_RX_VALID);
& & SetEPR_TXStatus(ENDP0, EP_TX_STALL);
正确获取到请求信息后,如果wLength为0,设备需要发送一个0长度数据包以响应主机:
// *****************************************************************************
// Function Name&&: SETUP0_Trans0Data
// Description& & :
// Input& && && & :
// Output& && && &:
// Return& && && &:
// *****************************************************************************
RESULT SETUP0_Trans0Data(void)
&&// Send 0-length data frame as ACK to host
&&SetBuffDescTable_TXCount(ENDP0, 0);
&&SetEPR_RXStatus(ENDP0, EP_RX_NAK);
&&SetEPR_TXStatus(ENDP0, EP_TX_VALID);
&&return RESULT_SUCCESS;
如果wLength不为0,设备则需要根据请求的数据长度发送数据包以响应主机:
// *****************************************************************************
// Function Name&&: SETUP0_TransData
// Description& & :
// Input& && && & :
// Output& && && &:
// Return& && && &:
// *****************************************************************************
RESULT SETUP0_TransData(void)
&&unsigned short wLength = vsDeviceInfo.TransInfo.wL
&&unsigned short wOffset = vsDeviceInfo.TransInfo.wO
&&unsigned short wMaxSize = vsDeviceInfo.TransInfo.wPacketS
&&if(wLength)
& & if(wLength & wMaxSize)
& && &wLength = wMaxS& && &
& & // Copy the transfer buffer to the endpoint0's buffer
& & BufferCopy_UserToPMA( vsDeviceInfo.TransInfo.pBuffer+wOffset,& &// transfer buffer
& && && && && && && && &&&GetBuffDescTable_TXAddr(ENDP0),& && && &&&// endpoint 0 TX address
& && && && && && && && &&&wLength);
& & SetBuffDescTable_TXCount(ENDP0, wLength);
& & SetEPR_RXStatus(ENDP0, EP_RX_NAK);
& & SetEPR_TXStatus(ENDP0, EP_TX_VALID);
& & // Update the data lengths
& & vsDeviceInfo.TransInfo.wLength -= wL
& & vsDeviceInfo.TransInfo.wOffset += wL
& & return RESULT_LASTDATA;& && && &
&&return RESULT_SUCCESS;
如果发送的数据长度大于端点设置的最大数据包长度,数据将分割为若干次发送,记录发送数据的状态包含在结构体TRANSFER_INFO中:
// *****************************************************************************
// TRANSFER_INFO
// *****************************************************************************
typedef struct _TRANSFER_INFO
&&unsigned short wL& && && && && &&&// total lengths data will be transmit
&&unsigned short wO& && && && && &&&// number of data be transmited
&&unsigned short wPacketS& && && && & // endpoints packet max size
&&unsigned char* pB& && && && && &&&// address of data buffer
TRANSFER_INFO,
*PTRANSFER_INFO;
TRANSFER_INFO.wLength记录发送的数据长度,如果非0,表示有数据需要被发送。
TRANSFER_INFO.wOffset记录已发送的数据长度,用以确定数据缓冲TRANSFER_INFO.pBuffer的偏移量。
需要了解的一点:USB主机向USB设备正确发送一请求后(这部分的处理由硬件完成),USB主机将间隔若干次的向USB设备索取响应数据,STM32 USB TX状态为NAK说明不响应USB主机,USB主机在超时后退出此次请求;TX状态为STLL说明中断此次请求,USB主机将无条件退出请求;TX状态为 VALID说明设备已准备好数据发送,USB主机将从USB设备读取数据。
以非0长度数据请求的GET_DESCRIPTOR请求为例的响应过程:
CTR_SETUP0()-&SETUP0_Data()-&SR_GetDescriptor()-&SETUP0_TransData()
RESULT SR_GetDescriptor(void)
&&// RequestType: device-&host, standard request and device recipient
&&if(vsDeviceInfo.SetupData.bmRequestType == RT_D2H_STANDARD_DEVICE)
& & // SetupData.wValue.b.MSB: descriptor type
& & // SetupData.wValue.b.LSB: descriptor index
& & switch(vsDeviceInfo.SetupData.wValue.b.MSB)
& & case DESCRIPTOR_DEVICE:& && && && && &return SR_GetDescriptor_Device();
& & case DESCRIPTOR_CONFIG:& && && && && &return SR_GetDescriptor_Config();
& & case DESCRIPTOR_STRING:& && && && && &return SR_GetDescriptor_String();
& & default:&&return RESULT_UNSUPPORT;
&&return RESULT_UNSUPPORT;
GET_DESCRIPTOR请求属于USB协议中的标准请求(standard request)并且数据方向为设备至主机(device-&host),分设备描述符、配置描述符、字符串描述符三种。已设备描述符为例:
RESULT SR_GetDescriptor_Device(void)
&&// Assigned the device descriptor to the transfer
&&vsDeviceInfo.TransInfo.wOffset = 0;
&&vsDeviceInfo.TransInfo.wPacketSize = ENDP0_PACKETSIZE;
&&vsDeviceInfo.TransInfo.pBuffer = DescBuffer_Device.pB
&&vsDeviceInfo.TransInfo.wLength = DescBuffer_Device.wL
&&vsDeviceInfo.eControlState = CS_GET_DESCRIPTOR;
&&if(vsDeviceInfo.TransInfo.wLength & vsDeviceInfo.SetupData.wLength.w)
& & vsDeviceInfo.TransInfo.wLength = vsDeviceInfo.SetupData.wLength.w;
&&return SETUP0_TransData();
这里说明了发送数据的长度、缓冲、偏移、端点包大小以及当前的控制状态,并说明了如果发送的数据长度超出请求的数据长度,则将舍弃超出的部分。数据配置好后,调用SETUP0_TransData()进行数据发送。
在USB主机查询到USB设备准备就绪后,将读取出这些数据,完成后,USB设备将产生IN事件,此时将响应CTR_IN0()函数:
// *****************************************************************************
// Function Name&&: CTR_IN
// Description& & :
// Input& && && & :
// Output& && && &:
// Return& && && &:
// *****************************************************************************
void CTR_IN0(void)
&&switch(vsDeviceInfo.eControlState)
&&case CS_GET_DESCRIPTOR:
& & if(SETUP0_TransData() == RESULT_SUCCESS)
& && &SetEPR_TXStatus(ENDP0, EP_TX_NAK);
& && &SetEPR_RXStatus(ENDP0, EP_RX_VALID);
&&case CS_SET_ADDRESS:
& & SetEPR_TXStatus(ENDP0, EP_TX_NAK);
& & SetEPR_RXStatus(ENDP0, EP_RX_VALID);
& & SetDADDR(0x0080 | vsDeviceInfo.bDeviceAddress);
& & vsDeviceInfo.eDeviceState = DS_ADDRESSED;& &
&&case CS_SET_CONFIGURATION:
& & SetEPR_TXStatus(ENDP0, EP_TX_NAK);
& & SetEPR_RXStatus(ENDP0, EP_RX_VALID);
& & vsDeviceInfo.eDeviceState = DS_CONFIGURED;
&&default:
再这如果响应GET_DESCRIPTOR请求发送的数据如果全部发送完毕,SETUP0_TransData()返回RESULT_SUCCESS,并设置TX状态为NAK;否则返回RESULT_LASTDATA,将继续发送剩余的数据直到数据全部被发送。至此,整个的GET_DESCRIPTOR请求过程完成。
0长度的数据请求在发送0长度数据响应后,因为不存在可能还未传送的数据,因而IN事件后直接结束此次请求。
在数据方向为USB主机-&USB设备时,如果正确接收到数据,将响应CTR_OUT0()函数,处理过程类同CTR_IN0()函数。
在USB设备的枚举过程中,USB的一些描述符数据结构需要了解,具体在USB协议中有详细的说明,在usb_desc(.c/.h)文件中,定义了这些结构,这些结构是特定的:
设备描述符:长度、格式固定,其中VENDOR_ID与PRODUCT_ID决定上位机驱动的识别。设备分属类别决定了设备的性质,如果为自定义USB设备,设备分属类别值为0,同时上位机驱动必须配合编写;如果为标准USB设备,则必须使用这些标准设备的驱动、数据结构等等,条件是你必须了解这些标准设备的一些信息,好处是省去一些麻烦的驱动编写。
const unsigned char cbDescriptor_Device[DESC_SIZE_DEVICE] =
&&DESC_SIZE_DEVICE,& &&&// bLength: 18
&&DESCRIPTOR_DEVICE,& & // descriptor type
&&0x00,& && && && &// bcdUSB LSB: USB release number -& USB2.0
&&0x02,& && & // bcdUSB MSB: USB release number -& USB2.0
&&0x00,& && && &// bDeviceClass:& & Class information in the interface descriptors
&&0x00,& && & // bDeviceSubClass:
&&0x00,& && & // bDeviceProtocol:
&&0x40,& && & // bMaxPacketSize0:&&LowS(8), FullS(8,16,32,64), HighS(64)
&&LOWORD(VENDOR_ID),& && & // idVendor LSB:
&&HIWORD(VENDOR_ID),& && & // idVendor MSB:
&&LOWORD(PRODUCT_ID),& && &// idProduct LSB:
&&HIWORD(PRODUCT_ID),& && &// idProduct MSB:
&&LOWORD(DEVICE_VERSION),&&// bcdDevice LSB:
&&HIWORD(DEVICE_VERSION),&&// bcdDevice MSB:
&&0x01,& && & // iManufacturer: Index of string descriptor describing manufacturer
&&0x02,& && & // iProduct: Index of string descriptor describing product
&&0x03,& && & // iSerialNumber: Index of string descriptor describing the device serial number
&&0x01& && &&&// bNumConfigurations: number of configurations
配置描述符:前9个字节格式固定,后面紧跟的各种描述结构跟实际配置有关,每增加一种描述结构,该描述结构的第一字节说明了结构的长度,第二直接说明了结构的类型。在配置描述符中一般包含配置描述、接口描述、端点描述,如果需要同样可增加自定义的描述。使用标准USB设备类别时,配置描述符的结构也必须满足此类标准设备的数据结构。
const unsigned char cbDescriptor_Config[DESC_SIZE_CONFIG] =
&&// Descriptor of configuration
0x09,& && && && && && & // lengths& &
&&DESCRIPTOR_CONFIG,& && &// descriptor type
&&DESC_SIZE_CONFIG,& && & // Total configuration descriptor lengths LSB
&&0x00,& && && && && && & // Total configuration descriptor lengths MSB
&&0x01,& && & // bNumInterfaces: Total number of interfaces
&&0x01,& && & // bConfigurationValue: Configuration value
&&0x00,& && & // iConfiguration: Index of string descriptor describing the configuration
&&0xA0,& && & // bmAttributes: bus powered
& && && && && && && && &// bit 4...0 : Reserved, set to 0
& && && && && && && && &// bit 5& &&&: Remote wakeup (1:yes)
& && && && && && && && &// bit 6& &&&: Self power (1:yes)
& && && && && && && && &// bit 7& &&&: Reserved, set to 1
&&0x32,& && & // bMaxPower: this current is used for detecting Vbus = 100mA
&&// Descriptor of interface
&&DESCRIPTOR_INTERFACE,
&&0x00,& && & // bInterfaceNumber: Number of Interface
&&0x00,& && & // bAlternateSetting: Alternate setting
&&0x02,& && & // bNumEndpoints: Number of endpoints except EP0
&&0x00,& && & // bInterfaceClass:
&&0x00,& && & // bInterfaceSubClass:
&&0x00,& && & // nInterfaceProtocol:
&&0x00,& && & // iInterface: Index of string descriptor describing the interface
&&// Descriptor of endpoint1 OUT
&&DESCRIPTOR_ENDPOINT,
&&0x01,& && & // bEndpointAddress
& && && && &&&// bit 3...0 : the endpoint number
& && && && &&&// bit 6...4 : reserved
& && && && &&&// bit 7& &&&: 0(OUT), 1(IN)
0x03,& && & // bmAttributes
& && && && &&&// bit 1...0 : Transfer type
& && && && &&&//& && && && && & 00(CONTROL), 01(ISOCHRONOUS), 10(BULK), 11(INTERRUPT)
& && && && &&&// bit 3...2 : Synchronization type
& && && && &&&//& && && && && & 00(No Synch), 01(Asynchronous), 10(Adaptive), 11(Synchronous)
& && && && &&&// bit 5...4 : Endpoint Usage type
& && && && &&&//& && && && && & 00(data), 01(Feedback), 10(Implicit feedback data endpoint), 11(Reserved)
& && && && &&&// bit 7...6 : Reserved, must be zero
&&0x40,& && & // packet size LSB
&&0x00,& && & // packet size MSB
&&0x20,& && &&&// polling interval time: 32ms
&&// Descriptor of endpoint2 IN
&&DESCRIPTOR_ENDPOINT,
&&0x82,& && & // bEndpointAddress
& && && && &&&// bit 3...0 : the endpoint number
& && && && &&&// bit 6...4 : reserved
& && && && &&&// bit 7& &&&: 0(OUT), 1(IN)
&&0x03,& && & // bmAttributes
& && && && &&&// bit 1...0 : Transfer type
& && && && &&&//& && && && && & 00(CONTROL), 01(ISOCHRONOUS), 10(BULK), 11(INTERRUPT)
& && && && &&&// bit 3...2 : Synchronization type
& && && && &&&//& && && && && & 00(No Synch), 01(Asynchronous), 10(Adaptive), 11(Synchronous)
& && && && &&&// bit 5...4 : Endpoint Usage type
& && && && &&&//& && && && && & 00(data), 01(Feedback), 10(Implicit feedback data endpoint), 11(Reserved)
& && && && &&&// bit 7...6 : Reserved, must be zero
&&0x40,& && & // packet size LSB
&&0x00,& && & // packet size MSB
&&0x20& && &&&// polling interval time: 32ms
字符串描述符:定义了与设备有关的一些信息,常见的为以下四种,如果有需要,同样可以定义自己的字符串描述符。
const unsigned char cbDescriptor_StringLangID[DESC_SIZE_STRING_LANGID] =
&&DESC_SIZE_STRING_LANGID,&&// bLength
DESCRIPTOR_STRING,& && &&&// bDescriptorType = String Descriptor
&&0x09,& && && && && && && && && && && & // LangID LSB:
&&0x04& && && && && && && && && && && & // LangID MSB: 0x0409(U.S. English)
const unsigned char cbDescriptor_StringVendor[DESC_SIZE_STRING_VENDOR] =
&&DESC_SIZE_STRING_VENDOR,&&// bLength
&&DESCRIPTOR_STRING,& && &&&// bDescriptorType = String Descriptor
&&// String: &LaBiXiaoXiaoXin&
&&'L',0, 'a',0, 'B',0, 'i',0, 'X',0, 'i',0, 'a',0, 'o',0,
& &'X',0, 'i',0, 'a',0, 'o',0, 'X',0, 'i',0, 'n',0
const unsigned char cbDescriptor_StringProduct[DESC_SIZE_STRING_PRODUCT] =
&&DESC_SIZE_STRING_PRODUCT, // bLength
&&DESCRIPTOR_STRING,& && &&&// bDescriptorType = String Descriptor
& & // String: &STM32 ezUSB-CORE V1.01&
&&'S',0, 'T',0, 'M',0, '3',0, '2',0, ' ',0, 'e',0, 'z',0, 'U',0, 'S',0, 'B',0,
&&'-',0, 'C',0, 'O',0, 'R',0, 'E',0, ' ',0, 'V',0, '1',0, '.',0, '0',0, '1',0
const unsigned char cbDescriptor_StringSerial[DESC_SIZE_STRING_SERIAL] =
&&DESC_SIZE_STRING_SERIAL,&&// bLength
&&DESCRIPTOR_STRING,& && &&&// bDescriptorType = String Descriptor
& & // String: &ezUSB-CORE Demo &
&&'e',0, 'z',0, 'U',0, 'S',0, 'B',0, '-',0, 'C',0, 'O',0, 'R',0, 'E',0, ' ',0,
&&'D',0, 'e',0, 'm',0, 'o',0, ' ',0, '2',0, '0',0, '0',0, '8',0, '/',0, '1',0, '1',0, '/',0, '1',0, '8',0
了解这些描述符的用法以及作用,最好的方法的是编写自定义的USB上位机驱动以及应用程序,这样你可以深刻了解USB设备与主机间的数据交换方式以及实现手段。
14:17:48  
aaa{:1:}a{:1:}a{:1:}a{:1:}a{:1:}a{:1:}a{:1:}a{:1:}a
高级工程师
01:15:21  
谢谢楼主分享...............
14:53:50  
值得学习,感谢分享
15:51:25  
值得学习,感谢分享
13:55:25  
赞一个,赞一个
Powered by

我要回帖

更多关于 stm32 usb 描述符 的文章

 

随机推荐