新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32的USB例程修改步驟

        STM32的USB例程修改步驟

        作者: 時間:2016-11-24 來源:網絡 收藏
        以下是筆者將ST的Custom_HID例程修改為“自定義USB設備”例程時總結出來的,因為筆者也是剛剛學USB開發不久,某些方面理解錯誤在所難免,請各位大蝦指正。

        本文引用地址:http://www.104case.com/article/201611/320586.htm

        一、usb_desc.c文件

        根據你程序使用的通信方式修改。usb_desc.h文件中定義要根據usb_desc.c文件中的數組的大小;ConfigDescriptor[SIZ_CONFIG_DESC]下添加需要處理的端點;根據需要添加或刪除報告描述符(主要用于HID)和CDC接口描述符(主要用于實現USB轉串口)等。具體方法可以下載個“電腦圈圈”使用D12編寫的例子。

        二、Usb_conf.h文件:

        1、修改需要處理那些中斷

        CNTR_CTRM 處理數據正確傳輸后控制,比如說響應主機

        CNTR_DOVRM

        CNTR_ERRM

        CNTR_WKUPM 0

        CNTR_SUSPM

        CNTR_RESETM 主要處理USB復位后進行一些初始化任務

        CNTR_SOFM

        CNTR_ESOFM

        如:

        usb_conf.h中的#define IMR_MSK (CNTR_CTRM | CNTR_SOFM | CNTR_RESETM )是決定USB_CNTR寄存器中的那個USB相關中斷啟動還是屏蔽。

        2、根據需要增加端點緩存地址,要根據緩存區的地址修改,防止數據重疊

        如下為根據每個緩沖區的大小為64字節修改:

        #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、修改下的EPX_IN_Callback和EPX_OUT_Callback。注釋掉需要處理的函數。NOP_Process表示不處理。

        三usb_prop.c文件

        1、修改void XX_Reset(void)(如:void Joystick_Reset(void))

        一般的不用修改,如下為舉例說明端點1的初始化,其他端口原理一樣。

        SetEPType(ENDP1, EP_INTERRUPT);//設置端點1類型

        SetEPTxAddr(ENDP1, ENDP1_TXADDR); //設置端點1緩沖區基地址

        SetEPTxCount(ENDP1, 64);// 配置Tx 緩沖計數器

        SetEPRxStatus(ENDP1, EP_RX_DIS);// //設置端點接收關閉

        SetEPTxStatus(ENDP1, EP_TX_NAK);// //設置端點1發送不應答

        2、刪除不相干的描述符等。

        如自定義的USB設備就不需要以下結構體初始化:

        ONE_DESCRIPTOR Joystick_Report_Descriptor

        ONE_DESCRIPTOR Mouse_Hid_Descriptor

        3、修改RESULT XX_Data_Setup(u8 RequestNo)的數據類請求處理。

        如Custom_HID例程修改為“自定義USB設備”例程時可以將以下代碼刪除

        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、刪除不相干的獲得描述符返回函數

        如自定義的USB設備就不需要以下函數:

        Joystick_GetReportDescriptor

        Joystick_GetHIDDescriptor

        四、usb_endp.c文件

        1、增加之前定義的中斷數據處理函數

        如:

        void EP1_OUT_Callback(void)

        {

        這些寫接收代碼

        }

        五、數據發送和接收,舉例說明

        1、數據接收

        u8 DataLen;

        DataLen = GetEPRxCount(ENDP1);

        PMAToUserBufferCopy(TX1_buffer, ENDP1_RXADDR, DataLen);

        SetEPRxValid(ENDP1);

        USART1_Send(DataLen);

        count_out = 1;

        2、數據發送

        UserToPMABufferCopy(InBuffer, GetEPTxAddr(ENDP1), 64);

        SetEPTxCount(ENDP1, 64);

        SetEPTxValid(ENDP1);


        如果你發送數據較為頻繁,每次發送前應使用GetEPTxStatus(ENDP1)檢測上次發送是否完成。如果端點狀態處于EP_TX_VALID,說明發送未結束,如果端點狀態處于EP_TX_NAK,說明發送結束。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 红原县| 壤塘县| 连州市| 盐津县| 司法| 罗山县| 龙里县| 务川| 屯留县| 威海市| 噶尔县| 榆林市| 石渠县| 江安县| 汉寿县| 保靖县| 宁乡县| 曲阜市| 阳谷县| 铜山县| 乡宁县| 大兴区| 张家口市| 安泽县| 察雅县| 丽水市| 佳木斯市| 漠河县| 阿坝| 长沙县| 富平县| 九江县| 涪陵区| 新竹县| 冀州市| 繁昌县| 宣城市| 芦山县| 贞丰县| 云南省| 仪陇县|