简介:本文简单介绍如何应用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上。
上一篇:STM32输出PWM状态总结
下一篇:基于STM32F103的贴片机控制系统的设计与实现
推荐阅读最新更新时间:2024-11-09 12:39
设计资源 培训 开发板 精华推荐
- 温控器
- 使用 LTC3637IDHC 5.5V 至 76V 输入至 5V 输出、1A 降压型稳压器的典型应用
- DER-754 - 29W高功率因数隔离反激式LED驱动器,基于LYTSwitch-6,具有3合1、DALI调光和CCT切换功能
- DC143A-C,使用 LTC1474CMS8-5、5V @ 300mA 高效降压 DC/DC 转换器的演示板
- 抗扰电容式接近传感器系统参考设计
- LTC3110EFE 铅酸电池备份/充电应用的典型应用电路
- MAXREFDES1172:采用MAX17690的90%效率的小尺寸12V / 1A无光反激式DC-DC转换器
- RDR-201 - 6 W 恒压 (CV) 适配器
- ADA4062-2ACPZ-R7运算放大器用作陷波滤波器电路的典型应用电路
- traffic lights
- 有奖活动|站在NI的肩膀上,一起轻松探索数据奥秘
- 观视频,奖礼品 Fluke多功能多产品系列校准器
- 有奖直播报名|瑞萨RA MCU家族成员快速增长,助力打造安全稳定的工业控制系统
- 走近PI InnoSwitch-CP 答题赢好礼~
- 阅读TI DLP ® 博文,带你走进不一样的视野!
- ADI有奖直播:储能系统助力电动汽车快充站的建设 8月31日上午10:00-11:30 为您揭晓!
- 【社区大讲堂】顶嵌与你一起:动手做嵌入式产品
- 【免费租用】Xilinx Spartan-6 FPGA 嵌入式套件!
- nanoPower技术:延长电池寿命,提升传感器性能 2021年1月20日 上午10:00在线研讨会
- 1月22日下午14:00Mouser携手Maxim邀您观看有奖直播:深入浅出可穿戴健康监测