STM32的USB例程修改步驟
一、usb_desc.c文件 根據(jù)你程序使用的通信方式修改。usb_desc.h文件中定義要根據(jù)usb_desc.c文件中的數(shù)組的大??;ConfigDescriptor[SIZ_CONFIG_DESC]下添加需要處理的端點(diǎn);根據(jù)需要添加或刪除報(bào)告描述符(主要用于HID)和CDC接口描述符(主要用于實(shí)現(xiàn)USB轉(zhuǎn)串口)等。具體方法可以下載個(gè)“電腦圈圈”使用D12編寫的例子。 二、Usb_conf.h文件: 1、修改需要處理那些中斷 CNTR_CTRM 處理數(shù)據(jù)正確傳輸后控制,比如說響應(yīng)主機(jī) CNTR_DOVRM /* DMA OVeR/underrun Mask */ CNTR_ERRM /* ERRor Mask */ CNTR_WKUPM 0 /* WaKe UP Mask */ CNTR_SUSPM /* SUSPend Mask */ CNTR_RESETM 主要處理USB復(fù)位后進(jìn)行一些初始化任務(wù) CNTR_SOFM /* Start Of Frame Mask */ CNTR_ESOFM /* Expected Start Of Frame Mask */ 如: usb_conf.h中的#define IMR_MSK (CNTR_CTRM | CNTR_SOFM | CNTR_RESETM )是決定USB_CNTR寄存器中的那個(gè)USB相關(guān)中斷啟動(dòng)還是屏蔽。 2、根據(jù)需要增加端點(diǎn)緩存地址,要根據(jù)緩存區(qū)的地址修改,防止數(shù)據(jù)重疊 如下為根據(jù)每個(gè)緩沖區(qū)的大小為64字節(jié)修改: #define ENDP1_TXADDR (0xC0) #define ENDP1_RXADDR (0xD0) #define ENDP2_TXADDR (0x100) #define ENDP2_RXADDR (0x140) #define ENDP3_TXADDR (0x180) #define ENDP3_RXADDR (0x1C0) 3、修改/* CTR service routines */下的EPX_IN_Callback和EPX_OUT_Callback。注釋掉需要處理的函數(shù)。NOP_Process表示不處理。 三usb_prop.c文件 1、修改void XX_Reset(void)(如:void Joystick_Reset(void)) 一般/* Initialize Endpoint 0 */的不用修改,如下為舉例說明端點(diǎn)1的初始化,其他端口原理一樣。 SetEPType(ENDP1, EP_INTERRUPT);//設(shè)置端點(diǎn)1類型 /*EP_BULK 批量端點(diǎn) EP_CONTROL 控制端點(diǎn) EP_ISOCHRNOUS 同步端點(diǎn) EP_INTERRUPT 中斷端點(diǎn)*/ SetEPTxAddr(ENDP1, ENDP1_TXADDR); //設(shè)置端點(diǎn)1緩沖區(qū)基地址 SetEPTxCount(ENDP1, 64);// 配置Tx 緩沖計(jì)數(shù)器 SetEPRxStatus(ENDP1, EP_RX_DIS);// //設(shè)置端點(diǎn)接收關(guān)閉 SetEPTxStatus(ENDP1, EP_TX_NAK);// //設(shè)置端點(diǎn)1發(fā)送不應(yīng)答 /* #define EP_RX_DIS (0x0000) // EndPoint RX DISabled 端點(diǎn)接收關(guān)閉 #define EP_RX_STALL (0x1000) // EndPoint RX STALLed 端點(diǎn)接收延遲 #define EP_RX_NAK (0x2000) // EndPoint RX NAKed 端點(diǎn)接收不應(yīng)答 #define EP_RX_VALID (0x3000) // EndPoint RX VALID端點(diǎn)接收有效 #define EP_TX_DIS (0x0000) //EndPoint TX DISabled #define EP_TX_STALL (0x0010) // EndPoint TX STALLed #define EP_TX_NAK (0x0020) // EndPoint TX NAKed #define EP_TX_VALID (0x0030) // EndPoint TX VALID */ 2、刪除不相干的描述符等。 如自定義的USB設(shè)備就不需要以下結(jié)構(gòu)體初始化: ONE_DESCRIPTOR Joystick_Report_Descriptor ONE_DESCRIPTOR Mouse_Hid_Descriptor 3、修改RESULT XX_Data_Setup(u8 RequestNo)的數(shù)據(jù)類請(qǐng)求處理。 如Custom_HID例程修改為“自定義USB設(shè)備”例程時(shí)可以將以下代碼刪除 if ((RequestNo == GET_DESCRIPTOR) && (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) && (pInformation->USBwIndex0 == 0)) { if (pInformation->USBwValue1 == REPORT_DESCRIPTOR) { CopyRoutine = Joystick_GetReportDescriptor; } else if (pInformation->USBwValue1 == HID_DESCRIPTOR_TYPE) { CopyRoutine = Joystick_GetHIDDescriptor; } } 4、刪除不相干的獲得描述符返回函數(shù) 如自定義的USB設(shè)備就不需要以下函數(shù): Joystick_GetReportDescriptor Joystick_GetHIDDescriptor 四、usb_endp.c文件 1、增加之前定義的中斷數(shù)據(jù)處理函數(shù) 如: void EP1_OUT_Callback(void) { 這些寫接收代碼 } 五、數(shù)據(jù)發(fā)送和接收,舉例說明 1、數(shù)據(jù)接收 u8 DataLen; DataLen = GetEPRxCount(ENDP1); PMAToUserBufferCopy(TX1_buffer, ENDP1_RXADDR, DataLen); SetEPRxValid(ENDP1); USART1_Send(DataLen); count_out = 1; 2、數(shù)據(jù)發(fā)送 UserToPMABufferCopy(InBuffer, GetEPTxAddr(ENDP1), 64); SetEPTxCount(ENDP1, 64); SetEPTxValid(ENDP1); 如果你發(fā)送數(shù)據(jù)較為頻繁,每次發(fā)送前應(yīng)使用GetEPTxStatus(ENDP1)檢測(cè)上次發(fā)送是否完成。如果端點(diǎn)狀態(tài)處于EP_TX_VALID,說明發(fā)送未結(jié)束,如果端點(diǎn)狀態(tài)處于EP_TX_NAK,說明發(fā)送結(jié)束。 |
|