STM32自定义HID(模拟厂家设备)

这篇具有很好参考价值的文章主要介绍了STM32自定义HID(模拟厂家设备)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

(如果对您有帮助记得点赞哦)

与上位机调试软件配合,
QT编写的调试助手:QT HID调试助手
源码:源码链接
QT上位机教程:教程地址
笔者这边硬件是TM32F103RCT6
软件使用CubeMX生成HID设备
首先配置单片机的基本时钟,调试方式等
本文主要讲解USBHID配置
stm32 自定义hid,STM32,stm32,单片机,嵌入式硬件
勾选如上图所示
stm32 自定义hid,STM32,stm32,单片机,嵌入式硬件
勾选
stm32 自定义hid,STM32,stm32,单片机,嵌入式硬件
下面是对这几种模式的简要介绍:

  1. IP Audio Device Class(IP音频设备类):
    这个类别定义了一种用于在IP网络上传输音频数据的设备。它允许音频设备通过IP协议与计算机或其他设备进行通信,从而实现音频数据的传输和控制。

  2. IP Communication Device Class(IP通信设备类):
    这个类别定义了一种用于在IP网络上进行通信的设备。它提供了一套标准接口和协议,使设备能够与计算机或其他设备进行数据交换、实时通信和控制。

  3. IP Download Firmware Update Class(IP固件下载更新类):
    这个类别定义了一种用于通过IP网络下载和更新设备固件的设备。它提供了一套标准协议和接口,使设备能够通过IP协议接收、存储和安装固件更新。

  4. IP Human Interface Device Class(IP人机界面设备类):
    这个类别定义了一种用于通过IP网络连接人机界面设备的设备。它允许用户通过IP协议与设备进行交互和控制,例如通过远程访问控制计算机的鼠标、键盘或触摸屏等输入设备。

  5. IP Custom Human Interface Device Class(IP自定义人机界面设备类):
    这个类别定义了一种用于通过IP网络连接自定义人机界面设备的设备。它提供了灵活的接口和协议,使设备能够与计算机或其他设备进行自定义的人机界面交互和控制。

  6. IP Mass Storage Device Class(IP大容量存储设备类):
    这个类别定义了一种用于通过IP网络连接大容量存储设备的设备。它允许用户通过IP协议访问、传输和管理存储设备上的文件和数据,类似于传统的USB大容量存储设备(如U盘或移动硬盘)的功能。

这些类别定义了一系列标准化的接口和协议,使设备能够在IP网络环境中进行数据传输、通信和控制。每个类别都有特定的功能和行为,适用于不同类型的设备和应用场景。

stm32 自定义hid,STM32,stm32,单片机,嵌入式硬件
以下是一些与STM32 Custom Human Interface Device Class相关的参数说明:

  1. CUSTOM_HID_FS_BINTERVAL:这是一个用于Full Speed USB传输的间隔时间参数。它定义了数据包之间的时间间隔,以控制数据传输的频率和稳定性。

  2. USBD_CUSTOM_HID_REPORT_DESC_SIZE:这是报告描述符的总长度。报告描述符是用于定义设备支持的报告格式和功能的数据结构。该参数定义了报告描述符在输入(IN)端点中的长度。

  3. USBD_CUSTOMHID_OUTREPORT_BUF_SIZE:这是输出(OUT)端点的最大报告缓冲区大小。它定义了设备接收来自主机的报告数据的最大容量。

基本参数:

  • USBD_MAX_NUM_INTERFACES:支持的最大接口数量。这定义了设备支持的最大接口数,决定了设备可以提供的功能和服务。

  • USBD_MAX_NUM_CONFIGURATION:支持的最大配置数量。这定义了设备支持的最大配置数,每个配置可以包含一个或多个接口。

  • USBD_MAX_STR_DESC_SIZ:字符串描述符的最大大小。字符串描述符用于提供与设备相关的文本信息,如设备名称、制造商信息等。该参数定义了字符串描述符可以使用的最大字节数,范围在1字节到64K字节之间。

  • USBD_SELF_POWERED:自供电使能标志。设置为1表示设备是自供电的,设置为0表示设备依赖于外部电源。

  • USBD_DEBUG_LEVEL:USBD调试级别。该参数定义了USBD库输出调试信息的详细程度。可以根据需要设置为不同的级别,例如0表示禁用调试输出,1表示基本级别,2表示详细级别。

请注意,这些参数是用于配置和定义STM32 Custom Human Interface Device Class的一些基本特性和行为。在使用和配置设备时,需要根据实际需求和设备规格进行适当的调整和设置。
stm32 自定义hid,STM32,stm32,单片机,嵌入式硬件
设备描述符相关的参数说明:

  1. VID(供应商标识符):VID是供应商标识符,用于唯一标识设备的制造商。它的取值范围是0到65,535(十六进制为0x0000到0xFFFF)。该参数用于设备描述符中的供应商标识符字段,以标识设备的制造商。

  2. LANGID_STRING(语言标识符):LANGID_STRING是语言标识符,用于指定字符串描述符所使用的语言。它表示字符串描述符中使用的语言代码,例如英语、中文等。该参数用于语言标识符字符串描述符。

  3. MANUFACTURER_STRING(制造商标识符):MANUFACTURER_STRING是制造商标识符,用于标识设备的制造商名称。它表示制造商的字符串描述符标识符,用于提供设备制造商的名称或标识。该参数用于制造商字符串描述符。

这些参数在设备描述符中用于提供关于设备制造商、供应商标识和语言标识的信息。在配置设备时,需要根据实际需求和制造商的标识来设置这些参数,以确保设备能够正确地被识别和识别。请注意,VID必须是唯一的,并且LANGID_STRING表示字符串描述符所使用的语言代码。

产品描述符相关的参数说明:

  1. PID(产品标识符):PID是产品标识符,用于唯一标识设备的产品。它的取值范围是0到65,535(十六进制为0x0000到0xFFFF)。该参数用于设备描述符中的产品标识符字段,以标识设备的产品。

  2. PRODUCT_STRING(产品标识符):PRODUCT_STRING是产品标识符,用于标识设备的产品名称或标识。它表示产品字符串描述符标识符,用于提供设备产品的名称或标识。该参数用于产品字符串描述符。

  3. CONFIGURATION_STRING(配置标识符):CONFIGURATION_STRING是配置标识符,用于标识设备的配置。它表示配置字符串描述符标识符,用于提供设备配置的名称或标识。该参数用于配置字符串描述符。

  4. INTERFACE_STRING(接口标识符):INTERFACE_STRING是接口标识符,用于标识设备的接口。它表示接口字符串描述符标识符,用于提供设备接口的名称或标识。该参数用于接口字符串描述符。

这些参数在产品描述符和相关的字符串描述符中用于提供关于设备产品、配置和接口的信息。在配置设备时,需要根据实际产品和配置的标识来设置这些参数,以确保设备能够正确地被识别和识别。请注意,PID必须是唯一的,并且这些字符串描述符用于提供相应标识的名称或标识。

在usbd_custom_hid_if.c文件中,CUSTOM_HID_ReportDesc_FS定义数组内部添加如下数据

__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
  /* USER CODE BEGIN 0 */
    0x06, 0x00, 0xFF,      /* 使用页面 (厂商页面: 0xFF00) */                       
    0x09, 0x01,            /* 使用 (演示套件) */    
    0xa1, 0x01,            /* 集合 (应用程序) */ 
    /* 6 */ 

    // 输入报告 
    0x09, 0x01,            /* 使用ID - 厂商自定义 */ 
    0x15, 0x00,            /* 逻辑最小值 (0) */ 
    0x26, 0XFF, 0X00,      /* 逻辑最大值 (255) */ 
    0x75, 0x08,            /* 报告大小 (8位) */ 
    0x95, 0X40,              /* 报告计数:发送长度 (64字节) */ 
    0x81, 0x02,            /* 输入 (数据,可变,绝对) */ 
    // 19

    // 输出报告 
    0x09, 0x01,            /* 使用ID - 厂商自定义 */ 
    0x15, 0x00,            /* 逻辑最小值 (0) */ 
    0x26, 0XFF, 0X00,      /* 逻辑最大值 (255) */ 
    0x75, 0x08,            /* 报告大小 (8位) */ 
    0x95, 0X40,              /* 报告计数:接收长度 (64字节) */ 
    0x91, 0x02,            /* 输出 (数据,可变,绝对) */ 
    // 32

    // 特征报告
    /* 45 */ 
    //#endif
  /* USER CODE END 0 */
  0xC0                     /* 结束集合 */ 
};

打开usbd_desc.c文件找到一下宏定义

#define USBD_VID                           1155                            // VID (Vendor IDentifier),供应商标识符
#define USBD_LANGID_STRING                 1033                            // LANGID_STRING (Language Identifier),语言标识符 英文
#define USBD_MANUFACTURER_STRING           "STMicroelectronics"            // MANUFACTURER_STRING (Manufacturer Identifier),制造商标识符
#define USBD_PID_FS                        22352                           // PID (Product IDentifier),产品标识符
#define USBD_PRODUCT_STRING_FS             "STM32 Custom Human interface"   // PRODUCT_STRING (Product Identifier),产品标识符
#define USBD_CONFIGURATION_STRING_FS       "Custom HID Config"              // CONFIGURATION_STRING (Configuration Identifier),配置标识符
#define USBD_INTERFACE_STRING_FS           "Custom HID Interface"           // INTERFACE_STRING (Interface Identifier),接口标识符

这里将通过USBD_PRODUCT_STRING_FS 名字改一下便于我们识别设备这里改为test hid
这时编译下载后,插上电脑在其他设备中能看到我们的设备(如果出现叹号或未知设备,检查CUSTOM_HID_ReportDesc_FS数组)
stm32 自定义hid,STM32,stm32,单片机,嵌入式硬件
将设备更改为回环模式
代码中封装了发送函数,但是没有接收函数,这里我们在回调函数中添加接收标志位,然后在主函数中强制转换数据类型,然后拿到数据。

打开 **usbd_custom_hid_if.c*,找到  static int8_t CUSTOM_HID_OutEvent_FS(uint8_t event_idx, uint8_t state) 该函数;

注意我这里定义了一个全局变量 uint8_t usb_rx_flag ; 用来标接受标记位。
uint8_t usb_rx_flag ;

/**
  * @brief  Manage the CUSTOM HID class events
  * @param  event_idx: Event index
  * @param  state: Event state
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
static int8_t CUSTOM_HID_OutEvent_FS(uint8_t event_idx, uint8_t state)
{
  /* USER CODE BEGIN 6 */

	//strncpy(recv,hhid->Report_buf,64);
	usb_rx_flag = 1;
	
  return (USBD_OK);
  /* USER CODE END 6 */
}

主函数

if(usb_rx_flag)
{
	 // 数据类型强制转换 ,具体数据结构可以查看USB初始化过程
	USBD_CUSTOM_HID_HandleTypeDef *hhid;
	hhid = (USBD_CUSTOM_HID_HandleTypeDef *)hUsbDeviceFS.pClassData;
	//消息回传,并点灯,提示消息
	if(USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, hhid->Report_buf, 64) == USBD_OK)
	{
			//转发至串口 方便查看数据
			for(int i =0 ;i< 64 ; i++)
			{
				printf("%x", hhid->Report_buf[i]);
			}
	}
}
	

这里具体转化详情请自行go to define ,发送函数使用的是 USBD_CUSTOM_HID_SendReport 函数 ,接受通过回调函数接受文章来源地址https://www.toymoban.com/news/detail-736834.html

到了这里,关于STM32自定义HID(模拟厂家设备)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第10课【STM32 USB通讯协议实战】HID键盘+CDC虚拟串口组合设备

    文章中的部分概念可参考第9课【USB协议】USB总线 接口 端点 管道 数据包 枚举 STM32_USB-FS-Device_Lib V4.1.0 USB协议中为了提供对多样设备的支持,定义了许多外部设备子类,常见的包括: 人机交互类设备HID(Human Interface Device) 通信类设备CDC(Communicate Device Class) 大容量存储设备

    2024年02月04日
    浏览(50)
  • STM32CubeMX教程31 USB_DEVICE - HID外设_模拟键盘或鼠标

    正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 野火DAP仿真器 XCOM V2.6串口助手 使用STM32CubeMX软件配置STM32F407开发板 USB_OTG_FS为工作在Human Interface Device Class (HID)(人机接口设备类)模式下的USB_DEVICE(USB从机),利用上下左右四

    2024年02月19日
    浏览(31)
  • stm32 USB复合设备 cubeMX库一键生成 多路CDC串口 HID鼠标键盘 Composite Device

    最近有个需求,需要同时用usb键盘鼠标和虚拟串口等,因为平时没怎么研究过usb协议,所以自己写复合设备一直没有成功,然后正巧在github上看到了一个stm32的一个usb复合设备库,可以快速配置usb组合设备,并且支持超级多路串口 Gihub地址 https://github.com/alambe94/I-CUBE-USBD-Compo

    2024年02月09日
    浏览(51)
  • stm32实现hid鼠标

    启动CubelMX 选择芯片(直接输入stm32f103zet6) 设置时钟 如下图 usb设置 配置usb设备 调试端口设置   配置时钟 项目输出设置 打开工程(后记:此工程含有中文不能编译通过) 配置项目  配置调试器 编译无法通过 删除路径中的中文,以及工程名中的中文。再次生成工程(其他设置

    2024年04月17日
    浏览(25)
  • stm32实现hid键盘

     前面的cubelmx项目配置参考 stm32实现hid鼠标-CSDN博客 https://blog.csdn.net/anlog/article/details/137814494?spm=1001.2014.3001.5502 两个项目的配置完全相同。 代码 引用 键盘代码: 替换hid设备描述符 先屏蔽鼠标设备描述符 替换为键盘设备描述符 修改宏定义  修改大小为63U  运行后如下图 参

    2024年04月17日
    浏览(28)
  • STM32设置USB HID模式

    使用USBHID模式与电脑、手机终端通讯,速率和准确率比虚拟串口和CH340转接速度要快。 在USB_OTG_FS中,选择Device_Only,其它默认。 在Middleware中的Class For FS IP中,如下选择 在Device Descriptor中可以按需要填写 设置USB频率为48Mhz 在Project Manager里,修改Heap和Stack的大小 在程序里main.c中

    2024年02月11日
    浏览(86)
  • STM32:Custom HID实现USB双向通信

    本文章主要讲了使用STM32的USB Device,实现控制板和电脑通信功能。从而实现,上位机对控制板进行调试。 USB Device可以有多种类型,实现双向通信的话,推荐使用Custom HID类型。 首先使用STM32CubeMx实现功能引脚配置并且生成对应的工程文件。   Middleware设置USB_DEVICE    配置时钟

    2024年02月13日
    浏览(33)
  • STM32 CubeMX USB_(HID 鼠标和键盘)

    STM32 CubeMX 自动生成的USB_HID是鼠标类型的:键盘类型要做一点小修改; 参考: STM32CubeMX学习笔记 USB鼠标HID描述符以及数据格式

    2024年02月14日
    浏览(25)
  • STM32 CubeMX配置USB HID功能,及安装路径

    STM32CubeMX学习笔记(46)——USB接口使用(HID自定义设备) STM32CubeMX实现STM32 USBHID双向64字节通信(下位机部分) STM32 USB HID设置(STM32CubeMX) 关于keil 5安装出现Fail to set path to Software Packs.问题解决方法

    2024年02月08日
    浏览(29)
  • STM32。USB HID,如何发送标准键盘的按键报告?

    我们要求STM32芯片的usb和windows电脑的USB接口进行连接,然后STM32芯片发送usb数据给windows电脑,实现电脑上按下一个f按键的效果。 下面开始操作: 使用STM32CubeMX生成代码,先选择对应的usb口 然后选择第三方软件,选择HID 然后点击生成代码,这时候就会生成usbd_hid.c相关的代码

    2024年02月12日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包