STM32利用CUBEMX建立自定义HID工程,并且完成64字节的IN,OUT传输功能。

2023-05-16

STM32 Customed HID开发流程

本文介绍的是STM32的cubeMX自定义HID的开发流程

  1. cubeMX配置customed HID模式。更多详细配置壳查看代码CubeMX的配置文件。
    msogLfc.png
  2. 修改usbd_custome_hid_if.c 里面的CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] 数组。根据填入的数组内容修改宏USBD_CUSTOM_HID_REPORT_DESC_SIZE尺寸为34
__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
  /* USER CODE BEGIN 0 */
  
//#ifdef usga 
//0x05, 0x8c, /* USAGE_PAGE (ST Page) */ 
0x06, 0xFF, 0x00,      /* USAGE_PAGE (Vendor Page: 0xFF00) */                       
0x09, 0x01,            /* USAGE (Demo Kit)               */    
0xa1, 0x01, /* COLLECTION (Application) */ 
/* 6 */ 

// The Input report 
0x09,0x03, // USAGE ID - Vendor defined 
0x15,0x00, // LOGICAL_MINIMUM (0) 
0x26,0x00, 0xFF, // LOGICAL_MAXIMUM (255) 
0x75,0x08, // REPORT_SIZE (8) 
0x95,64, // REPORT_COUNT :SendLength 
0x81,0x02, // INPUT (Data,Var,Abs) 
//19
// The Output report 
0x09,0x04, // USAGE ID - Vendor defined 
0x15,0x00, // LOGICAL_MINIMUM (0) 
0x26,0x00,0xFF, // LOGICAL_MAXIMUM (255) 
0x75,0x08, // REPORT_SIZE (8) 
0x95,64, // REPORT_COUNT:ReceiveLength 
0x91,0x02, // OUTPUT (Data,Var,Abs) 
//32
// The Feature report

/* 45 */ 
0xc0 /* END_COLLECTION */ 
//#endif 
  
  /* USER CODE END 0 */  /*     END_COLLECTION               */
};

3.修改usbd_customhid.c 中的如下数组.

__ALIGN_BEGIN static uint8_t USBD_CUSTOM_HID_CfgDesc[USB_CUSTOM_HID_CONFIG_DESC_SIZ] __ALIGN_END =
{
  0x09, /* bLength: Configuration Descriptor size */
  USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */
  USB_CUSTOM_HID_CONFIG_DESC_SIZ,
  /* wTotalLength: Bytes returned */
  0x00,
  0x01,         /*bNumInterfaces: 1 interface*/
  0x01,         /*bConfigurationValue: Configuration value*/
  0x00,         /*iConfiguration: Index of string descriptor describing
  the configuration*/
  0xC0,         /*bmAttributes: bus powered */
  0x32,         /*MaxPower 100 mA: this current is used for detecting Vbus*/
  
  /************** Descriptor of CUSTOM HID interface ****************/
  /* 09 */
  0x09,         /*bLength: Interface Descriptor size*/
  USB_DESC_TYPE_INTERFACE,/*bDescriptorType: Interface descriptor type*/
  0x00,         /*bInterfaceNumber: Number of Interface*/
  0x00,         /*bAlternateSetting: Alternate setting*/
  0x02,         /*bNumEndpoints*/
  0x03,         /*bInterfaceClass: CUSTOM_HID*/
  0x00,         /*bInterfaceSubClass : 1=BOOT, 0=no boot*/
  0x00,         /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/
  0,            /*iInterface: Index of string descriptor*/
  /******************** Descriptor of CUSTOM_HID *************************/
  /* 18 */
  0x09,         /*bLength: CUSTOM_HID Descriptor size*/
  CUSTOM_HID_DESCRIPTOR_TYPE, /*bDescriptorType: CUSTOM_HID*/
  0x11,         /*bCUSTOM_HIDUSTOM_HID: CUSTOM_HID Class Spec release number*/
  0x01,
  0x00,         /*bCountryCode: Hardware target country*/
  0x01,         /*bNumDescriptors: Number of CUSTOM_HID class descriptors to follow*/
  0x22,         /*bDescriptorType*/
  USBD_CUSTOM_HID_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/
  0x00,
  /******************** Descriptor of Custom HID endpoints ********************/
  /* 27 */
  0x07,          /*bLength: Endpoint Descriptor size*/
  USB_DESC_TYPE_ENDPOINT, /*bDescriptorType:*/
  
  CUSTOM_HID_EPIN_ADDR,     /*bEndpointAddress: Endpoint Address (IN)*/
  0x03,          /*bmAttributes: Interrupt endpoint*/
  CUSTOM_HID_EPIN_SIZE, /*wMaxPacketSize: 2 Byte max */
  0x00,
  0x05,          /*bInterval: Polling Interval (5ms)*/ //这边修改的是IN通信的速率,数值越小,速率越快。最快1000hz。
  /* 34 */
  
  0x07,          /* bLength: Endpoint Descriptor size */
  USB_DESC_TYPE_ENDPOINT,   /* bDescriptorType: */
  CUSTOM_HID_EPOUT_ADDR,  /*bEndpointAddress: Endpoint Address (OUT)*/
  0x03, /* bmAttributes: Interrupt endpoint */
  CUSTOM_HID_EPOUT_SIZE,    /* wMaxPacketSize: 2 Bytes max  *///这边修改的是OUT通信的速率,数值越小,速率越快。最快1000hz。
  0x00,
  0x05, /* bInterval: Polling Interval (5 ms) */
  /* 41 */
} ;

/* USB CUSTOM_HID device Configuration Descriptor */
__ALIGN_BEGIN static uint8_t USBD_CUSTOM_HID_Desc[USB_CUSTOM_HID_DESC_SIZ] __ALIGN_END =
{
  /* 18 */
  0x09,         /*bLength: CUSTOM_HID Descriptor size*/
  CUSTOM_HID_DESCRIPTOR_TYPE, /*bDescriptorType: CUSTOM_HID*/
  0x11,         /*bCUSTOM_HIDUSTOM_HID: CUSTOM_HID Class Spec release number*/
  0x01,
  0x00,         /*bCountryCode: Hardware target country*/
  0x01,         /*bNumDescriptors: Number of CUSTOM_HID class descriptors to follow*/
  0x22,         /*bDescriptorType*/
  USBD_CUSTOM_HID_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/
  0x00,
};

5.修改

   #define CUSTOM_HID_EPIN_SIZE                 0x40
   #define CUSTOM_HID_EPOUT_SIZE                0x40
   #define USBD_CUSTOMHID_OUTREPORT_BUF_SIZE     64
   #define USBD_CUSTOM_HID_REPORT_DESC_SIZE      34

6.这个时候全局编译,下载程序到控制板。接着将控制板USB查到PC电脑端,顺利的话会看到“设备管理器”里面的“人体输入学设备”识别到了“hid-compliant device”。

好!到此为止说明我们的USB HID枚举部分修改成功。下面进行发送和接收的操作。

7.发送数据

发送数据包是最简单的,只要调用USBD_CUSTOM_HID_SendReport函数即可。

8.接收数据

接收数据相对发送要复杂一点。HAL库已经封装了底层的接收数据处理,所以用户主要知道:当芯片完成一组数据接收的时候,中断会调用CUSTOM_HID_OutEvent_FS这样一个回调函数。那本文就在这个回调函数里面设置了一个falg。如下:

static int8_t CUSTOM_HID_OutEvent_FS(uint8_t event_idx, uint8_t state)
{
  /* USER CODE BEGIN 6 */
    //flag设置成SET,代表有数据到来
    USB_Out_Flag=SET;
  return (USBD_OK);
  /* USER CODE END 6 */
}

而在main主循环函数中,我实时判断这个flag是否set了。如果set了就表示中断接收到一组数据,然后我们就可以读数据了。本文读数据函数如下:

/**
  * @brief  接收从USB获取的数据
  * @param  data 数据存储首地址
  * @param  dataNum 准备读取的数据字节数
  * @retval 读取的字节数
  */
uint32_t USB_GetData(uint8_t *data,uint32_t dataNum)
{
    uint32_t len=0;
    USBD_CUSTOM_HID_HandleTypeDef   *hhid;
  hhid = (USBD_CUSTOM_HID_HandleTypeDef*)hUsbDeviceFS.pClassData;//得到接收的地址
    
    for(len=0;len<dataNum;len++){
        *data=hhid->Report_buf[len];
        data++;
    }
    return dataNum;
}

9.到此,自定义HID基本讲解完毕,本文在main函数中实现一个USB_Mission应用。大体思路如下:判断有没有上位机发送过来的数据,如果有则解码数据,根据解析的数据回送上位机需要的数据。详情请查看代码。完整的代码GitHub地址。

-----------------本文作者“智御电子”,期待与电子爱好者交流学习。----------------

转载于:https://www.cnblogs.com/SC-Electronic/p/9246755.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32利用CUBEMX建立自定义HID工程,并且完成64字节的IN,OUT传输功能。 的相关文章

  • kafka消息队列

    1 Kafka 概念 Kafka 是一个分布式的基于发布 订阅模式的消息队列 xff08 Message Queue xff09 xff0c 主要应用于大数据实时处理领域 1 1 消息队列 应用场景 好处 1 xff09 解耦 允许你独立的
  • Windows10电脑音频出现故障【开机小喇叭突然变红叉,我成功解决的方法】

    Windows10电脑音频出现故障 xff1a 必须运行 Windows 音频服务和 Windows 音频终结点生成器服务 xff0c 音频才能正常工作 至少其中一个服务未运行 我是第五次将localservice提升为管理员权限才解决问题
  • influxdb时序型数据库基础

    文章目录 什么是InfluxDB时序数据特点常见应该场景时序数据库解决什么问题InfluxDB的优势InfluxDB常用命令 什么是InfluxDB InfluxDB是一个开源的 高性能的时序型数据库 xff0c 在时序型数据库DB Eng
  • 盘点Visual Studio 2022 17.4 给C++开发者带来的新东西

    今天 xff0c 我们很高兴地宣布 xff0c Visual Studio 2022 17 4版本正式可用 这篇文章 xff0c 我将盘点一下那些对C 43 43 开发者相关的一些新功能 Arm64 在17 3版本中 xff0c Visua
  • 光学动作捕捉系统在自动化控制领域中的应用

    近年来 xff0c 各行各业逐步开展了自动化设备的研究 xff0c 其中以无人机技术和机器人技术的发展尤为迅速 xff0c 许多高校和科研单位正围绕着这两个方向进行多种应用场景的研究 无人机领域 在无人机领域 xff0c 常见的研究方向是多
  • Qt类继承关系图

    分享两个资源 xff0c 对于系统了解Qt框架的整体脉络很有帮助 Qt4类关系图 43 Qt5类关系图 xff0c PDF 43 JPG格式 下载 Qt5类关系图 xff08 基于Qt5 1版 xff09 xff0c JPG格式 下载 转载
  • 哪些因素会影响光学动作捕捉系统数据精度?

    光学动作捕捉系统以红外光学镜头作为核心产品 xff0c 通过镜头获取定位物体表面反光标记点三维空间坐标数据 xff0c 数据精度可达亚毫米级 xff0c 是精度最高的室内定位解决方案之一 在各种实际应用中 xff0c 需要获取包括速度 加速
  • 柔性上肢康复机器人研究中的VR技术

    上肢康复机器人用于对脑卒中患者进行上肢康复治疗 xff0c 能够维持和扩大患者关节活动度 增强肌肉力和协调性 xff0c 以防止肌肉萎缩 关节痉挛等各类症状的出现 xff0c 最终重建肢体功能 xff0c 以便回归正常生活 现有的上肢康复机
  • 动作捕捉在动物神经与运动研究领域的应用

    对于由神经系统疾病引起的运动障碍的康复治疗方案 xff0c 需要预先进行动物实验 xff0c 利用结果分析病症机理 xff0c 并为制定治疗 康复方案提供实验依据 脊髓损伤是中枢神经损伤的一种 xff0c 它会引发运动功能部分或完全丧失 研
  • 工业机器人协作控制研究

    当前工业焊接大多由工业机器人完成 在弧焊焊接领域 xff0c 传统的由焊接机器人 43 变位机 43 工装夹具组成的焊接工作站已不能满足当前小批量 定制化的柔性自动化生产需求 而由多个机器人构成的协作焊接系统具有更强的作业能力 更大范围的工
  • 几种智能机器人室内定位方法对比

    近年来随着控制算法的研究进展 xff0c 无人机 无人车等智能机器人在各领域中发展迅速 研发人员在对智能机器人进行相关研究时 xff0c 通常需要完成室内环境下的模拟调试实验 xff0c 在这些实验中 xff0c 确定各智能体自身定位以及与
  • NOKOV度量动作捕捉用于多智能体协同系统等效验证实验

    现代战争中 xff0c 无人机 无人车及无人艇等无人系统已逐渐在战场部署 xff0c 但是无人系统单体存在负载和任务能力有限 作战能力单一等不足 为了弥补单体能力不足 xff0c 同时提高其对作战任务的适应能力 xff0c 无人系统可以以集
  • NOKOV度量动捕软件教程(2):系统标定

    1 确认场地中央已放置好 L 型标定杆 xff0c 并将场地内的其他反光标识点遮挡或移出场地 xff1b 2 可通过点击 XINGYING 软件界面右下方的 全开 按钮 xff0c 同时观察全部镜头 xff08 如图 1 xff09 xff
  • NOKOV度量动捕软件教程(3):数据采集

    1 采集数据前 xff0c 需确保软件已加载配置文件 xff0c 可通过 文件 加载标定文件 选项进行加载 xff0c 或者通过通过标定生成一个新的配置文件 xff1b 2 将被捕捉物贴好反光标识点 xff0c 放入场地内 图 1 3 在软
  • NOKOV度量动捕软件教程(4):创建刚体与markerset

    一 创建 Markerset xff08 刚体 xff09 1 XINGYING软件支持在实时下创建 Markerset 刚体 xff0c 需在场地内放置有已贴好反光标识点的刚体 xff0c 并且能在软件中的 3D 视图下看到每一个反光标识
  • NOKOV度量动捕软件教程(5):数据处理

    目录 一 导入数据 二 建立MarkerSet 三 调用已有的MarkerSet 四 数据修复 五 建立刚体 六 实时应用MarkerSet 一 导入数据 1 点击 XINGYING 软件界面右下角的 后处理模式 按钮 xff0c 进入后处
  • 大小端模式

    数据在内存中以字节形式存放 xff0c X86结构是小端模式 xff0c 而KEIL C51则为大端模式 很多的ARM xff0c DSP都为小端模式 有些ARM处理器还可以随时在程序中 在ARM Cortex 系列使用REV REV16
  • c语言中的__FILE__和__LINE__的作用

    这是编译器内置宏 xff0c 这些宏定义不仅可以帮助我们完成跨平台的源码编写 xff0c 灵活使用也可以巧妙地帮我们输出非常有用的调试信息 例如 xff1a printf 34 FILE d LINE d s n 34 34 FILE LI
  • NOKOV度量动捕软件教程(6):数据分析

    1 点击界面上方 窗口分割 2 个窗口 xff1a 上 下 选项 xff0c 让主界面分割为上下两个窗格 xff08 如图 xff09 xff0c 选中窗格时会有橙色边框 xff0c 此时点击 视图类型 xff0c 让其中一个窗口显示 3D
  • crazyswarm+crazyflie+NOKOV动捕飞控方案操作说明(3):通过VRPN协议对接

    一 crazyflie配置 1 查看 crazyflie 固件更新完毕后 xff0c 取下crazyflie xff0c 并连接电池 xff0c 把crazyradio接上电脑usb口 xff0c 运行以下命令 xff1a rosrun c

随机推荐

  • crazyswarm+crazyflie+NOKOV动捕飞控方案操作说明(4):SDK对接

    一 crazyswarm nokov 支持 1 更换libmotioncapture crazyswarm 支持nokov首先需要更换nokov专有libmotioncapture xff0c 进入路径 xff1a cd crazyswar
  • UE5与NOKOV度量动捕系统连接教程

    目录 一 动捕软件安装与数据准备 二 插件安装与 UE5 设置 一 xff09 插件安装 二 xff09 UE5 设置 xff08 实时播放模式 使用设备 xff1a 从仔动作捕捉套装 xff08 NOKOV度量 xff09 软件 xff1
  • Unity与NOKOV度量动捕系统连接教程

    目录 一 动捕软件安装与数据准备 二 插件安装与 Unity 设置 xff08 实时播放模式 xff09 三 插件安装与 Unity 设置 xff08 后处理下实时模式 xff09 使用设备 xff1a 从仔动作捕捉套装 xff08 NOK
  • MotionBuilder与NOKOV度量动捕系统连接教程

    目录 一 动捕软件安装 二 数据录制 导入与导出 xff08 一 xff09 创建 Markerset xff08 二 xff09 数据采集 xff08 三 xff09 数据导入 xff08 四 xff09 数据导出 三 插件安装与 Mot
  • NOKOV动作捕捉系统使多场协同无人机自主建造成为可能

    近年来 xff0c 工业机器人的兴起使得建造的效率和安全性得以提升 xff0c 但由于机器人由于大小与活动范围的限制 xff0c 在大型建筑上难以施展拳脚 上海同济大学建筑系的无人机自主建造小组 xff0c 正在进行以无人机取代工业机器人进
  • 多智能体系统集群协同控制实验平台详解与典型案例

    目录 一 机器人实验是智能体集群研究必要手段 二 动作捕捉系统解决智能体集群实验系统多个痛点 三 多智能体集群协同控制实验平台 1 Crazyswarm多无人机集群编队实验平台 2 Robotarium机器人平台 3 中科院自动化所智能集群
  • NOKOV度量动作捕捉协助完成无人机室内定位研究

    随着工业发展 技术进步 xff0c 无人机的使用在各行各业愈发普遍 xff0c 开始出现无人机飞行送外卖 智能无人机自主巡检等多方面应用 在这一过程中 xff0c 无人机飞行定位就成为了重中之重 西北工业大学无人机特种技术国防科技重点实验室
  • 光学动作捕捉系统构成

    一套光学动作捕捉系统由红外动作捕捉镜头 动作捕捉软件 反光标识点 POE交换机 和若干配件组成 xff08 如标定框和镜头固定装置等 xff09 其本质是定位系统 xff0c 通过计算分析 xff0c 来获取与其相关的速度 加速度等多种运动
  • vscode命令行起本地服务,可发送http请求

    在我们vscode中默认打开的是file协议 xff0c 但是往往我们会有ajax等请求 xff0c 需要发送http等其他协议 xff0c 所以我们需要搭起本地服务器 xff1a 1 xff1a cd 进去到文件位置 xff0c 运行 n
  • 动作捕捉用于仿生机器人的运动规划

    随着机器人 三维动画 虚拟现实等产业的发展 xff0c 关于仿生机器人的动作研究早已成为重要的热点课题 如何让机器人或虚拟人物做出合理 流畅的姿态呢 xff1f 这就要涉及到逆运动学算法研究 人体很复杂 xff0c 传统算法需优化 由于人体
  • 智能化人机协作 遮挡情况下准确识别目标信息

    研究背景 废旧产品 xff08 end of life products xff09 的拆卸是工程全生命周期管理的一个基本步骤 在减少资源消耗和温室气体排放的同时 xff0c 回收可重复使用的部件可能创造相当的经济价值 xff0c 同时也能
  • 线下·香港 | 工业大数据与智能系统前沿会议

    由香港理工大学主办的工业大数据与智能系统前沿会议将于2023年4月28日至5月1日在香港举行 届时来自海外 内地及香港的知名科学家将聚首 xff0c 将围绕大会主题 面向人机共融的工业转型 发表演讲 xff0c 分享他们的独到见解并探讨最新
  • 人机耦合模型研究及其在下肢外骨骼机器人设计中的应用

    在外骨骼研究中 xff0c 一个合适的人机耦合模型非常重要 xff0c 它可以帮助预测外骨骼系统直接作用于人体产生的影响 xff0c 避免不必要的伤害和能量损失 xff0c 同时也有助于优化外骨骼系统的设计和控制 xff0c 提高其佩戴的舒
  • STM32】 DMA原理,步骤超细详解,一文看懂DMA

    如需转载请注明地址 xff1a https blog csdn net as480133937 article details 104927922 DMA的基本介绍 什么是DMA DMA的基本定义 DMA xff0c 全称Direct Me
  • float类型数据在报文中的传输方法

    方法1 xff1a 转化成整型传输 假如保留float类型数据为两位小数 xff0c 我们可以将float数据 100 转换成整型数据传输 xff0c 对端收到后 xff0c 再 100 xff0c 转换成float类型 方法2 xff1a
  • 101、104规约解析

    转载 xff1a 电网101 104规约解析 xff08 Java xff09 张二狗和苗翠花的博客 CSDN博客 iec101 java 1 前言 最近在研究广东电网的101与104规约 xff0c 也就是DL T634 5101 200
  • Ubuntu:Python多版本切换。

    使用 update alternatives更改系统Python版本 1 查看可选版本 sudo update alternatives list python 如果提示 xff1a update alternatives error no
  • ROS(melodic)安装问题汇总及解决方法

    终于装上了ROS xff0c 费了很大的波折 xff0c 基本上能遇到的问题都遇到了 xff0c 记在这里希望能给遇到同样问题的朋友一点参考 首先是在虚拟机上装ubuntu 18 04 xff0c 这个没什么问题 xff0c 所用的镜像文件
  • Http请求出现invalid http response问题的原因分析

    发生场景 xff1a A系统发送Http请求调用B系统提供的接口 xff1b 发生问题 xff1a A系统报错 xff0c 提示 invalid http response 错误信息 xff1b 问题分析 xff1a 根据翻译 xff0c
  • STM32利用CUBEMX建立自定义HID工程,并且完成64字节的IN,OUT传输功能。

    STM32 Customed HID开发流程 本文介绍的是STM32的cubeMX自定义HID的开发流程 cubeMX配置customed HID模式 更多详细配置壳查看代码CubeMX的配置文件 修改usbd custome hid if