STM自定义USB设备开发详细流程讲解及全套资料源码下载.pdf
- 文档编号:3438193
- 上传时间:2023-05-05
- 格式:PDF
- 页数:13
- 大小:729.40KB
STM自定义USB设备开发详细流程讲解及全套资料源码下载.pdf
《STM自定义USB设备开发详细流程讲解及全套资料源码下载.pdf》由会员分享,可在线阅读,更多相关《STM自定义USB设备开发详细流程讲解及全套资料源码下载.pdf(13页珍藏版)》请在冰点文库上搜索。
STM32自定义USB设备开发详细流程讲解及全套资料源码下载(基于libusb)一、前言前言USB的用途就不多说了,下面的内容主要就是讲解如何利用ST提供的USB驱动库和libusb上位机驱动库实现一个USB数据传输功能,为了降低开发难度,我们仅仅讲解Bulk传输模式,当然这也是用得比较多的传输模式。
二、开发流程开发流程1.完成STM32单片机端的USB程序;2.利用linusb自带的inf-wizard工具生成USB驱动;3.基于libusb编写USB通信程序;4.测试PC和单片机的数据通信。
三、三、STM32STM32程序编写程序编写1.完成描述符的修改,修改后的描述符如下(在usb_desc.c文件中)。
配置描述符就包含了端点描述符,我们用了4个端点,两个BULK-OUT端点,两个BULK-IN端点。
A.设备描述符010203040506070809101112131415161718192021constuint8_tCustomHID_DeviceDescriptorCUSTOMHID_SIZ_DEVICE_DESC=0x12,/*bLength*/USB_DEVICE_DESCRIPTOR_TYPE,/*bDescriptorType*/0x00,/*bcdUSB*/0x02,0x00,/*bDeviceClass*/0x00,/*bDeviceSubClass*/0x00,/*bDeviceProtocol*/0x40,/*bMaxPacketSize40*/LOBYTE(USBD_VID),/*idVendor*/HIBYTE(USBD_VID),/*idVendor*/LOBYTE(USBD_PID),/*idVendor*/HIBYTE(USBD_PID),/*idVendor*/0x00,/*bcdDevicerel.2.00*/0x02,1,/*Indexofstringdescriptordescribingmanufacturer*/2,/*Indexofstringdescriptordescribingproduct*/3,/*Indexofstringdescriptordescribingthedeviceserialnumber*/0x01/*bNumConfigurations*/;/*CustomHID_DeviceDescriptor*/B.配置描述符01020304050607080910constuint8_tCustomHID_ConfigDescriptorCUSTOMHID_SIZ_CONFIG_DESC=0x09,/*bLength:
ConfiguationDescriptorsize*/USB_CONFIGURATION_DESCRIPTOR_TYPE,/*bDescriptorType:
Configuration*/CUSTOMHID_SIZ_CONFIG_DESC,/*wTotalLength:
Bytesreturned*/0x00,0x01,/*bNumInterfaces:
1interface*/0x01,/*bConfigurationValue:
Configurationvalue*/0x00,/*iConfiguration:
Indexofstringdescriptordescribingtheconfiguration*/11121314151617181920212223242526272829303132333435363738394041424344454647484950510xE0,/*bmAttributes:
Buspowered*/*Buspowered:
7thbit,SelfPowered:
6thbit,Remotewakeup:
5thbit,reserved:
4.0bits*/0xFA,/*MaxPower500mA:
thiscurrentisusedfordetectingVbus*/*DescriptorofCustomHIDinterface*/*09*/0x09,/*bLength:
InterfaceDescriptorsize*/USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType:
Interfacedescriptortype*/0x00,/*bInterfaceNumber:
NumberofInterface*/0x00,/*bAlternateSetting:
Alternatesetting*/0x04,/*bNumEndpoints*/0xDC,/*bInterfaceClass:
Classcode=0DCH*/0xA0,/*bInterfaceSubClass:
Subclasscode=0A0H*/0xB0,/*nInterfaceProtocol:
Protocolcode=0B0H*/0,/*iInterface:
Indexofstringdescriptor*/*endpointdescriptor*/*18*/0x07,/*endpointdescriptorlength=07H*/USB_ENDPOINT_DESCRIPTOR_TYPE,/*endpointdescriptortype=05H*/0x81,/*endpoint1IN*/0x02,/*bulktransfer=02H*/0x40,0x00,/*endpointmaxpacketsize=0040H*/0x00,/*thevalueisinvalidwhenbulktransfer*/0x07,/*endpointdescriptorlength=07H*/USB_ENDPOINT_DESCRIPTOR_TYPE,/*endpointdescriptortype=05H*/0x01,/*endpoint1OUT*/0x02,/*bulktransfer=02H*/0x40,0x00,/*endpointmaxpacketsize=0040H*/0x00,/*thevalueisinvalidwhenbulktransfer*/0x07,/*endpointdescriptorlength=07H*/USB_ENDPOINT_DESCRIPTOR_TYPE,/*endpointdescriptortype=05H*/0x82,/*endpoint2IN*/0x02,/*bulktransfer=02H*/0x40,0x00,/*endpointmaxpacketsize=0040H*/0x00,/*thevalueisinvalidwhenbulktransfer*/0x07,/*endpointdescriptorlength=07H*/USB_ENDPOINT_DESCRIPTOR_TYPE,/*endpointdescriptortype=05H*/0x02,/*endpoint2OUT*/0x02,/*bulktransfer=02H*/0x40,0x00,/*endpointmaxpacketsize=0040H*/0x00,/*thevalueisinvalidwhenbulktransfer*/;/*CustomHID_ConfigDescriptor*/C.其他的描述符01020304050607/*USBStringDescriptors(optional)*/constuint8_tCustomHID_StringLangIDCUSTOMHID_SIZ_STRING_LANGID=CUSTOMHID_SIZ_STRING_LANGID,USB_STRING_DESCRIPTOR_TYPE,0x09,0x040809101112131415161718192021222324252627;/*LangID=0x0409:
U.S.English*/constuint8_tCustomHID_StringVendorCUSTOMHID_SIZ_STRING_VENDOR=CUSTOMHID_SIZ_STRING_VENDOR,/*SizeofVendorstring*/USB_STRING_DESCRIPTOR_TYPE,/*bDescriptorType*/Manufacturer:
STMicroelectronicsM,0,y,0,U,0,S,0,B,0,_,0,H,0,I,0,D,0;constuint8_tCustomHID_StringProductCUSTOMHID_SIZ_STRING_PRODUCT=CUSTOMHID_SIZ_STRING_PRODUCT,/*bLength*/USB_STRING_DESCRIPTOR_TYPE,/*bDescriptorType*/B,0,y,0,0,e,0,m,0,b,0,e,0,d,0,-,0,n,0,e,0,t,0;uint8_tCustomHID_StringSerialCUSTOMHID_SIZ_STRING_SERIAL=CUSTOMHID_SIZ_STRING_SERIAL,/*bLength*/USB_STRING_DESCRIPTOR_TYPE,/*bDescriptorType*/x,0,x,0,x,0,x,0,x,0,x,0,x,0;2.根据端点缓冲区大小配置端点缓冲区地址,配置信息如下(在usb_conf.h文件中):
0102030405060708091011121314151617/*buffertablebaseaddress*/#defineBTABLE_ADDRESS(0x00)/*EP0*/*rx/txbufferbaseaddress*/#defineENDP0_RXADDR(0x18)#defineENDP0_TXADDR(0x58)/*EP1*/*txbufferbaseaddress*/地址为32位对其,位4的倍数,不能超过bMaxPacketSize/EP1#defineENDP1_RXADDR(0x98)#defineENDP1_TXADDR(0x98+64)/EP2#defineENDP2_RXADDR(0xA0+64+64)#defineENDP2_TXADDR(0xA0+64+64+64)3.初始化每个端点(在usb_prop.c文件中的CustomHID_Reset函数中)01020304050607080910/*InitializeEndpoint0*/SetEPType(ENDP0,EP_CONTROL);SetEPTxStatus(ENDP0,EP_TX_STALL);SetEPRxAddr(ENDP0,ENDP0_RXADDR);SetEPTxAddr(ENDP0,ENDP0_TXADDR);Clear_Status_Out(ENDP0);SetEPRxCount(ENDP0,Device_Property.MaxPacketSize);SetEPRxValid(ENDP0);/*InitializeEndpoint1*/SetEPType(ENDP1,EP_BULK);111213141516171819202122SetEPRxAddr(ENDP1,ENDP1_RXADDR);SetEPTxAddr(ENDP1,ENDP1_TXADDR);SetEPRxCount(ENDP1,EP_SIZE);SetEPRxStatus(ENDP1,EP_RX_VALID);SetEPTxStatus(ENDP1,EP_TX_NAK);/*InitializeEndpoint2*/SetEPType(ENDP2,EP_BULK);SetEPRxAddr(ENDP2,ENDP2_RXADDR);SetEPTxAddr(ENDP2,ENDP2_TXADDR);SetEPRxCount(ENDP2,EP_SIZE);SetEPRxStatus(ENDP2,EP_RX_VALID);SetEPTxStatus(ENDP2,EP_TX_NAK);4.实现端点的回调函数(需要在usb_conf.h中注释掉对应的回调函数宏定义)0102030405060708091011121314151617181920212223242526/*FunctionName:
EP1_OUT_Callback.*Description:
EP1OUTCallbackRoutine.*Input:
None.*Output:
None.*Return:
None.*/voidEP1_OUT_Callback(void)EP1_ReceivedCount=GetEPRxCount(ENDP1);PMAToUserBufferCopy(USB_Receive_Buffer,ENDP1_RXADDR,EP1_ReceivedCount);SetEPRxStatus(ENDP1,EP_RX_VALID);/*FunctionName:
EP2_OUT_Callback.*Description:
EP2OUTCallbackRoutine.*Input:
None.*Output:
None.*Return:
None.*/voidEP2_OUT_Callback(void)EP2_ReceivedCount=GetEPRxCount(ENDP2);PMAToUserBufferCopy(USB_Receive_Buffer,ENDP2_RXADDR,EP2_ReceivedCount);SetEPRxStatus(ENDP2,EP_RX_VALID);5.完成主函数的测试程序010203040506070809intmain(void)uint8_tdata256;uint32_ti=0;Set_System();/系统时钟初始化USART_Configuration();/串口1初始化printf(x0c0);printf(x0c0);/超级终端清屏printf(0331;40;32m);/设置超级终端背景为黑色,字符为绿色printf(rn*);101112131415161718192021222324252627282930313233343536373839404142printf(rn*Copyright2009-2012,EmbedNet*);printf(rn*url=http:
/www.embed-http:
/www.embed-RightsReserved*);printf(rn*);printf(rn);USB_Interrupts_Config();Set_USBClock();USB_Init();while
(1)if(EP1_ReceivedCount0)USB_GetData(ENDP1,data,EP1_ReceivedCount);USB_SendData(ENDP1,data,EP1_ReceivedCount);printf(usbEP1getdata%dbytedatanr,EP1_ReceivedCount);for(i=0;i0)USB_GetData(ENDP2,data,EP2_ReceivedCount);USB_SendData(ENDP2,data,EP2_ReceivedCount);printf(usbEP2getdata%dbytedatanr,EP2_ReceivedCount);for(i=0;iEP2_ReceivedCount;i+)printf(0x%02X,datai);printf(nr);EP2_ReceivedCount=0;到此,STM32的程序基本上编写完成,然后编译下载程序,如果一切顺利,系统会检测到一个新的设备并试图加载对应的驱动,由于我们还没做驱动程序,所以肯定会加载驱动失败,如下图所示:
四、驱动程序生成四、驱动程序生成下面我们就利用libusb自带的inf-wizard工具生成USB驱动程序,该工具可以到本文章的附件下载,其具体过程如下:
运行该程序,出现下图对话框,点击“Next”;出现下图对话框后选择我们需要生成驱动程序的设备;这里可以写该DeviceName,我们保持默认值,其他的都不需要修改;点击Next后出现下图对话框,我们选择一个目录保存这个inf文件;保存后的文件若要立即安装驱动,可以点击下面对话框的红色框按钮;Win7下可能会出现如下对话框,点击始终安装;到此,USB驱动程序自动生成完毕,若安装了驱动,则在设备管理器里面会看到如下信息五、基于五、基于libusblibusb的上位机驱动程序编写的上位机驱动程序编写首先建立一个驱动程序工程,然后将libusb的库(附件有下载)添加到工程里面,编写以下几个函数:
A设备扫描函数,该函数用来找到插入电脑上的USB设备01/*02030405060708091011121314*brief扫描设备连接数*paramNeedInit是否需要初始化,第一次调用该函数需要初始化*retval识别到的指定设备个数*/int_stdcallUSBScanDev(intNeedInit)if(NeedInit)usb_init();/*initializethelibrary*/usb_find_busses();/*findallbusses*/usb_find_devices();/*findallconnecteddevices*/returnscan_dev(pBoard);B打开设备0102030405060708091011121314/*brief打开指定的USB设备*paramdevNum需要打开的设备号*retval打开状态*/int_stdcallUSBOpenDev(intDevIndex)pBoardHandleDevIndex=open_dev(DevIndex,pBoard);if(pBoardHandleDevIndex=NULL)returnSEVERITY_ERROR;elsereturnSEVERITY_SUCCESS;C关闭设备1234567/*brief关闭指定的USB设备*paramdevNum需要关闭的设备号*retval打开状态*/int_stdcallUSBCloseDev(intDevIndex)returnclose_dev(DevIndex,pBoardHandle);DBULK端点写数据010203040506070809101112/*briefUSBBulk端点写数据*paramnBoardID设备号*parampipenum端点号*paramsendbuffer发送数据缓冲区*paramlen发送数据字节数*paramwaittime超时时间*retval成功发送的数据字节数*/int_stdcallUSBBulkWriteData(unsignedintnBoardID,intpipenum,char*sendbuffer,intlen,intwaittime)intret=0;if(pBoardHandlenBoardID=NULL)returnSEVERITY_ERROR;131415161718192021222324252627282930313233343536373839404142#ifdefTEST_SET_CONFIGURATIONif(usb_set_configuration(pBoardHandlenBoardID,MY_CONFIG)0)usb_close(pBoardHandlenBoardID);returnSEVERITY_ERROR;#endif#ifdefTEST_CLAIM_INTERFACEif(usb_claim_interface(pBoardHandlenBoardID,0)0)usb_close(pBoardHandlenBoardID);returnSEVERITY_ERROR;#endif#ifTEST_ASYNC/Runninganasyncwritetestret=transfer_bulk_async(dev,pipenum,sendbuffer,len,waittime);#elseret=usb_bulk_write(pBoardHandlenBoardID,pipenum,sendbuffer,len,waittime);/*if(len%64)=0)usb_bulk_write(pBoardHandlenBoardID,pipenum,sendbuffer,0,waittime);*/#endif#ifdefTEST_CLAIM_INTERFACEusb_release_interface(pBoardHandlenBoardID,0);#endifreturnret;EBULK端点读数据010203040506070809101112131415161718/*briefUSBBulk读数据*paramnBoardID设备号*parampipenum端点号*paramreadbuffer读取数据缓冲区*paramlen读取数据字节数*paramwaittime超时时间*retval读到的数据字节数*/int_stdcallUSBBulkReadData(unsignedintnBoardID,intpipenum,char*readbuffer,intlen,intwaittime)intret=0;if(pBoardHandlenBoardID=NULL)returnSEVERITY_ERROR;#ifdefTEST_SET_CONFIGURATIONif(usb_set_configuration(pBoardHandlenBoardID,MY_CONFIG)0)usb_close(pBoardHandlenBoardID);returnSEVERITY_ERROR;1920212223242526272829303132333435363738#endif#ifdefTEST_CLAIM_INTERFACEif(usb_claim_interface(pBoardHandlenBoardID,0)0)usb_close(pBoardHandlenBoardID);returnSEVERITY_ERROR;#endif#ifTEST_ASYNC/Runninganasyncreadtestret=transfer_bulk_async(pGinkgoBoardHandlenBoardID,pipenum,sendbuffer,len,waittime);#elseret=usb_bulk_read(pBoardHandlenBoardID,pipenum,readbuffer,len,waittime);#endif#ifdefTEST_CLAIM_INTERFACEusb_release_interface(pBoardHandlenBoardID,0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- STM 自定义 USB 设备 开发 详细 流程 讲解 全套 资料 源码 下载