新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于STM32 HID例程生成不小于64字节传输的移植过程

基于STM32 HID例程生成不小于64字节传输的移植过程

作者: 时间:2016-09-07 来源:网络 收藏

  前言

本文引用地址:https://www.eepw.com.cn/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

评论


相关推荐

技术专区

关闭