新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM8芯片應(yīng)用注意事項(xiàng)

        STM8芯片應(yīng)用注意事項(xiàng)

        作者: 時(shí)間:2016-11-10 來源:網(wǎng)絡(luò) 收藏
        以下是筆者將ST的Custom_HID例程修改為“自定義USB設(shè)備”例程時(shí)總結(jié)出來的,因?yàn)楣P者也是剛剛學(xué)USB開發(fā)不久,某些方面理解錯(cuò)誤在所難免,請(qǐng)各位大蝦指正。



        一、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é)束。


        關(guān)鍵詞: STM8芯片注意事

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 大渡口区| 潼关县| 同德县| 景东| 五大连池市| 苗栗市| 封丘县| 绥中县| 南开区| 永泰县| 许昌县| 福海县| 东丰县| 尚志市| 天水市| 太和县| 宣城市| 南昌县| 铁岭县| 衢州市| 太仓市| 景东| 乐至县| 东源县| 定南县| 边坝县| 南溪县| 高碑店市| 车致| 休宁县| 乡城县| 铜山县| 连州市| 台东县| 崇仁县| 孟州市| 石台县| 湖南省| 五峰| 新和县| 和政县|