在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > STM8芯片應用注意事項

            STM8芯片應用注意事項

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



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


            二、Usb_conf.h文件:
            1、修改需要處理那些中斷
            CNTR_CTRM處理數(shù)據(jù)正確傳輸后控制,比如說響應主機
            CNTR_DOVRM/* DMA OVeR/underrun Mask */
            CNTR_ERRM/* ERRor Mask */
            CNTR_WKUPM 0/* WaKe UP Mask */
            CNTR_SUSPM/* SUSPend Mask */
            CNTR_RESETM主要處理USB復位后進行一些初始化任務
            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寄存器中的那個USB相關中斷啟動還是屏蔽。

            2、根據(jù)需要增加端點緩存地址,要根據(jù)緩存區(qū)的地址修改,防止數(shù)據(jù)重疊
            如下為根據(jù)每個緩沖區(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 */的不用修改,如下為舉例說明端點1的初始化,其他端口原理一樣。
            SetEPType(ENDP1, EP_INTERRUPT);//設置端點1類型
            /*EP_BULK批量端點
            EP_CONTROL控制端點
            EP_ISOCHRNOUS同步端點
            EP_INTERRUPT中斷端點*/
            SetEPTxAddr(ENDP1, ENDP1_TXADDR); //設置端點1緩沖區(qū)基地址
            SetEPTxCount(ENDP1, 64);//配置Tx緩沖計數(shù)器
            SetEPRxStatus(ENDP1, EP_RX_DIS);// //設置端點接收關閉
            SetEPTxStatus(ENDP1, EP_TX_NAK);// //設置端點1發(fā)送不應答
            /*
            #define EP_RX_DIS(0x0000) // EndPoint RX DISabled端點接收關閉
            #define EP_RX_STALL(0x1000) // EndPoint RX STALLed端點接收延遲
            #define EP_RX_NAK(0x2000) // EndPoint RX NAKed端點接收不應答
            #define EP_RX_VALID(0x3000) // EndPoint RX VALID端點接收有效
            #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設備就不需要以下結構體初始化:
            ONE_DESCRIPTOR Joystick_Report_Descriptor
            ONE_DESCRIPTOR Mouse_Hid_Descriptor

            3、修改RESULT XX_Data_Setup(u8 RequestNo)的數(shù)據(jù)類請求處理。
            如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、刪除不相干的獲得描述符返回函數(shù)
            如自定義的USB設備就不需要以下函數(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ā)送前應使用GetEPTxStatus(ENDP1)檢測上次發(fā)送是否完成。如果端點狀態(tài)處于EP_TX_VALID,說明發(fā)送未結束,如果端點狀態(tài)處于EP_TX_NAK,說明發(fā)送結束。


            關鍵詞: STM8芯片注意事

            評論


            技術專區(qū)

            關閉