STM32 USB HID复合设备 两个接口 键盘+数据传输 功能 您所在的位置:网站首页 usb键盘接口 STM32 USB HID复合设备 两个接口 键盘+数据传输 功能

STM32 USB HID复合设备 两个接口 键盘+数据传输 功能

2023-08-13 02:56| 来源: 网络整理| 查看: 265

#STM32 USB HID复合设备 两个接口 键盘+数据传输 功能

本人想要做一个USB设备,它能够模拟键盘给PC发数据,并且也能够和PC进行数据通信,这里键盘只做了发送功能,并不能接受PC端的大小写切换从而改变键盘灯的颜色。 具体逻辑如下: 在这里插入图片描述

这里的做法是,USB为复合设备,有两个接口,一个接口为:传输数据的自定义接口(两个端点,双向传输),另一个接口为:键盘(一个端点,只能键盘给PC发) 先使用STM32CUBEMX生成一个模板工程,并且将其修改为HID传输数据。 以下内容转载自:https://blog.csdn.net/weixin_30737433/article/details/99339824 https://www.cnblogs.com/xingboy/p/9913963.html 转载地址 转载地址 1、首先打开USB      在这里插入图片描述   2、接着把USB设置为下图HID模式   在这里插入图片描述   3、选择外部时钟   在这里插入图片描述   4、配置时钟树   在这里插入图片描述   5、配置USB设置   在这里插入图片描述   在这里插入图片描述   下面的USB设置就有点讲究了,   在这里插入图片描述 6、确认后,生成代码   在这里插入图片描述 打开刚才建立的工程,在 usbd_custom_hid_if.c 文件里,找到 CUSTOM_HID_ReportDesc_FS 这个函数,把刚才生成的报文文件覆盖掉函数里面的文件,代码如下:

/** Usb HID report descriptor. */ __ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END = { 0x06, 0x00, 0xff, // USAGE_PAGE (Vendor Defined Page 1) 0x09, 0x01, // USAGE (Vendor Usage 1) 0xa1, 0x01, // COLLECTION (Application) 0x09, 0x01, // USAGE (Vendor Usage 1) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255) 0x95, 0x40, // REPORT_COUNT (64) 0x75, 0x08, // REPORT_SIZE (8) 0x81, 0x02, // INPUT (Data,Var,Abs) 0x09, 0x01, // USAGE (Vendor Usage 1) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255) 0x95, 0x40, // REPORT_COUNT (64) 0x75, 0x08, // REPORT_SIZE (8) 0x91, 0x02, // OUTPUT (Data,Var,Abs) 0xc0 // END_COLLECTION };

然后再修改将usbd_conf.h做对应修改:

 #define USBD_CUSTOMHID_OUTREPORT_BUF_SIZE 64  #define USBD_CUSTOM_HID_REPORT_DESC_SIZE 34

同时修改usbd_customhid.h文件中的发送与接收长度为64

#define CUSTOM_HID_EPIN_SIZE 0x40 #define CUSTOM_HID_EPOUT_SIZE 0x40

到这里基本就算做出一个USB设备了,我们编译下载程序看看。   如果电脑显示了这个USB设备,但是有黄色感叹号,说明USB枚举成功,可是驱动安装失败,这时我们可以libusb自带的inf-wizard工具生成USB驱动程序,要怎么安装驱动解决这个问题可以参考驱动安装:https://blog.csdn.net/niepangu/article/details/44984325,驱动安装成功的话,到这里我们就可以看到USB正常列举出来啦,下面我们就可以写USB数据收发代码了。

USB数据传输:参考http://www.stm32cube.com/article/138

关于数据传输,HID设备是采用轮询方式传输的,ST默认20ms速度实在不敢恭维,还得要改一下枚举时的声明,同样是usbd_customhid.c文件,

__ALIGN_BEGIN static uint8_t USBD_CUSTOM_HID_CfgDesc[USB_CUSTOM_HID_CONFIG_DESC_SIZ] __ALIGN_END = { .... .... 0x20, /*bInterval: Polling Interval (20 ms)*/ /* 34 */ .... .... 0x20,/* bInterval: Polling Interval (20 ms) */ /* 41 */ }

这两个地方随心来改,最小可以改到0x01。这就快很多啦。(这里可以不做修改,我的电脑上生成的是5ms)到这里数据传输准备工作就做好了,下面我们先来说一下USB发送:   先定义个发送BUFF:

uint8_t send_buf[64] = { //定义一个USB的发送BUFF 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, 17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有