新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于STM32 HID例程生成不小于64字節(jié)傳輸?shù)囊浦策^(guò)程

        基于STM32 HID例程生成不小于64字節(jié)傳輸?shù)囊浦策^(guò)程

        作者: 時(shí)間:2016-09-07 來(lái)源:網(wǎng)絡(luò) 收藏

          前言

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

          本文簡(jiǎn)單介紹如何應(yīng)用ST HID(MOUSE)例程生成一個(gè)可以輸入和輸出任何長(zhǎng)度小于等于64字節(jié)的移植過(guò)程。

          問(wèn)題描述:

          HID的在的運(yùn)用中是非常廣泛的,但是很多應(yīng)用并不是簡(jiǎn)單的鼠標(biāo)或者鍵盤(pán)操作,而是客戶(hù)自定義的一些應(yīng)用,所以REPORT的定義往往跟鼠標(biāo)或者鍵盤(pán)并不相同,因而客戶(hù)常常基于ST的HID的例程進(jìn)行修改。那么如何基于我們的例程生成一個(gè)可以輸入輸出任何長(zhǎng)度小于等于64字節(jié)的例程?這里示范一下,拋磚引玉。

          代碼修改:

          第一步:

          我們?cè)趗sbd_hid_core.c中,找到配置描述進(jìn)行修改。首先增加一個(gè)OUT 端點(diǎn)。同時(shí)將HID_IN_PACKET 和HID_OUT_PACKET長(zhǎng)度修改為0x40。

          0x07, /* bLength: Endpoint Descriptorsize *///dum

          _ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType: */ /* Endpoint descriptor type */

          HID_OUT_EP, /* bEndpointAddress: */ /*Endpoint Address (OUT) */

          0x03, /* bmAttributes: Interruptendpoint */

          HID_OUT_PACKET, /* wMaxPacketSize: 64Bytes max */

          0x00,

          0x01, /* bInterval: Polling Interval(20 ms) */

          /* 41 */

          第二步:

          修改報(bào)告描述符:請(qǐng)注意這兩個(gè)report count 和report SIZE 的設(shè)定。

          const uint8_tHID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] =

          {

          0x05, 0x8C, /* USAGE_PAGE (VendorPage: 0xFF00) */

          0x09, 0x06, /* USAGE (Demo Kit) */

          0xa1, 0x01, /* COLLECTION(Application) */

          /* 6 */

          0x09, 0x06, /* USAGE (LED 1) */

          0x15, 0x00, /* LOGICAL_MINIMUM (0) */

          0x26, 0x00,0xff, /* LOGICAL_MAXIMUM(1) */

          0x75, 0x08, /* REPORT_SIZE (8) */

          0x95, 0x40, /* REPORT_COUNT (64) */

          0x91, 0x82, /* OUTPUT(Data,Var,Abs,Vol) */

          /* 18 */

          0x09, 0x06, /* USAGE (ADC IN) */

          0x15, 0x00, /* LOGICAL_MINIMUM (0) */

          0x26, 0x00,0xff, /* LOGICAL_MAXIMUM(255) */

          0x75, 0x08, /* REPORT_SIZE (8) */

          0x95, 0X40, /* REPORT_COUNT (64) */

          0x81, 0x82, /* INPUT(Data,Var,Abs,Vol) */

          /* 31 */

          0xc0 /* END_COLLECTION */

          }; /* CustomHID_ReportDescriptor */

          第三步:

          修改HID CLASS 初始化代碼:

          注意這里兩個(gè)地方:

          1, USB FIFO的分配定義。

          2, Usb ENDPOINT的使能,以及準(zhǔn)備接收數(shù)據(jù)。

          static uint8_t USBD_HID_Init (void*pdev,

          uint8_t cfgidx)

          {

          DCD_PMA_Config(pdev ,HID_IN_EP,USB_SNG_BUF,HID_IN_TX_ADDRESS);

          DCD_PMA_Config(pdev ,HID_OUT_EP,USB_SNG_BUF,HID_OUT_RX_ADDRESS);

          /* Open EP IN */

          DCD_EP_Open(pdev,

          HID_IN_EP,

          HID_IN_PACKET,

          USB_EP_INT);

          /* Open EP OUT */

          DCD_EP_Open(pdev,

          HID_OUT_EP,

          HID_OUT_PACKET,

          USB_EP_INT);

          DCD_EP_PrepareRx(pdev,HID_OUT_EP,Report_buf,HID_OUT_PACKET);

          PrevXferDone=1;

          return USBD_OK;

          }

          第四步:

          修改發(fā)送函數(shù),注意不能一直往USB FIFO里面填充數(shù)據(jù),一定要等上一次傳輸完成再填充。

          USBD_HID_SendReport(&USB_Device_dev, Send_Buffer,HID_IN_PACKET);

          最后我們一起來(lái)看看效果,可以清楚的看到MCU每毫秒都會(huì)發(fā)送64個(gè)字節(jié)的數(shù)據(jù)到主機(jī)。

          

         

          結(jié)論:

          這個(gè)例程只是基于F0系列的MCU進(jìn)行的修改,你只要按照這四步很容易地移植到其它系列MCU上。



        關(guān)鍵詞: STM32 USB

        評(píng)論


        相關(guān)推薦

        技術(shù)專(zhuān)區(qū)

        關(guān)閉
        主站蜘蛛池模板: 西乡县| 阿克苏市| 阳东县| 阿图什市| 腾冲县| 清新县| 尚志市| 新龙县| 板桥市| 长兴县| 禄丰县| 泸西县| 乌拉特后旗| 保靖县| 惠东县| 名山县| 施秉县| 广东省| 汉寿县| 上杭县| 绥宁县| 闵行区| 杨浦区| 于田县| 巴青县| 夏津县| 敖汉旗| 尼木县| 横峰县| 锡林浩特市| 静宁县| 宜城市| 星座| 光山县| 紫阳县| 海林市| 新化县| 中卫市| 巍山| 迁安市| 新安县|