• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > 基于STM32 HID例程生成不小于64字節傳輸的移植過程

    基于STM32 HID例程生成不小于64字節傳輸的移植過程

    作者: 時間:2016-09-07 來源:網絡 收藏

      前言

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

      本文簡單介紹如何應用ST HID(MOUSE)例程生成一個可以輸入和輸出任何長度小于等于64字節的移植過程。

      問題描述:

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

      代碼修改:

      第一步:

      我們在usbd_hid_core.c中,找到配置描述進行修改。首先增加一個OUT 端點。同時將HID_IN_PACKET 和HID_OUT_PACKET長度修改為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 */

      第二步:

      修改報告描述符:請注意這兩個report count 和report SIZE 的設定。

      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 初始化代碼:

      注意這里兩個地方:

      1, USB FIFO的分配定義。

      2, Usb ENDPOINT的使能,以及準備接收數據。

      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;

      }

      第四步:

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

      USBD_HID_SendReport(&USB_Device_dev, Send_Buffer,HID_IN_PACKET);

      最后我們一起來看看效果,可以清楚的看到MCU每毫秒都會發送64個字節的數據到主機。

      

     

      結論:

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



    關鍵詞: STM32 USB

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 日土县| 英山县| 长汀县| 枣庄市| 沙坪坝区| 天祝| 凤冈县| 游戏| 酒泉市| 和顺县| 巴林左旗| 金昌市| 兖州市| 四平市| 竹北市| 项城市| 库伦旗| 东至县| 开封市| 雷州市| 玉溪市| 府谷县| 乐安县| 洪泽县| 平陆县| 博乐市| 梅州市| 朝阳县| 竹北市| 平罗县| 峡江县| 盖州市| 龙江县| 郴州市| 确山县| 鄂州市| 辽源市| 闻喜县| 黎城县| 土默特左旗| 深圳市|