单片机
返回首页

基于STM32 HID例程生成不多于64字节传输的示范

2021-06-29 来源:eefocus

简介:本文简单介绍如何应用ST USB HID(MOUSE)例程生成一个可以输入和输出任何长度小于等于64字节的移植过程。


问题描述:


HID的在USB的运用中是非常广泛的,但是很多应用并不是简单的鼠标或者键盘操作,而是客户自定义的一些应用,所以REPORT的定义往往跟鼠标或者键盘并不相同,因而客户常常基于ST的HID的例程进行修改。那么如何基于我们的例程生成一个可以输入输出任何长度小于等于64字节的例程?这里示范一下,抛砖引玉。


代码修改:


第一步:


我们在usbd_hid_core.c中,找到配置描述进行修改。首先增加一个OUT 端点。同时将HID_IN_PACKET 和HID_OUT_PACKET长度修改为0x40。


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


USB_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个字节的数据到主机。


结论:


这个例程只是基于STM32F0系列的MCU进行的修改,你只要按照这四步很容易地移植到其它系列MCU上。


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • 短波AM发射器电路设计图

  • 带有短路保护系统的5V直流稳压电源电路图

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章