<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          STM32的USB例程修改步驟

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

          本文引用地址:http://www.ex-cimer.com/article/201611/320586.htm

          一、usb_desc.c文件

          根據(jù)你程序使用的通信方式修改。usb_desc.h文件中定義要根據(jù)usb_desc.c文件中的數(shù)組的大?。籆onfigDescriptor[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

          CNTR_ERRM

          CNTR_WKUPM 0

          CNTR_SUSPM

          CNTR_RESETM 主要處理USB復(fù)位后進(jìn)行一些初始化任務(wù)

          CNTR_SOFM

          CNTR_ESOFM

          如:

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

          三usb_prop.c文件

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

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

          SetEPType(ENDP1, EP_INTERRUPT);//設(shè)置端點(diǎn)1類型

          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)答

          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ù)類請求處理。

          如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)檢測上次發(fā)送是否完成。如果端點(diǎn)狀態(tài)處于EP_TX_VALID,說明發(fā)送未結(jié)束,如果端點(diǎn)狀態(tài)處于EP_TX_NAK,說明發(fā)送結(jié)束。



          關(guān)鍵詞: STM32USB例程修改步

          評論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();