记录一下 开发STM32 USB HID踩过的坑

  • 一、前言
  • 二、代码配置

一、前言

MCU: STM32F103C8T6
CubeMX: STM32CubeMX 5.3.0

二、代码配置

引脚配置
时钟树配置
我是打算做一个游戏控制器的,所以这里选择的是Custom Human Inerface Device Class。

顺便科普一下:
HID类设备是指用于和人类交互的设备,例如鼠标、键盘,游戏手柄、打印机等。

CubeMX代码生成后,是不能直接用的,是因为报文描述符没有进行有效的填充。
可在源码中 user_custom_hid.h中,进行报文描述符的填充。

/** Usb HID report descriptor. */
__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{/* USER CODE BEGIN 0 */0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)0x09, 0x05,                    // USAGE (Game Pad)0xa1, 0x01,                    // COLLECTION (Application)0x05, 0x09,                     // USAGE_PAGE (Button)0x19, 0x01,                     // USAGE_MINIMUM (Button 1)0x29, 0x40,                     // USAGE_MAXIMUM (Button 64)0x15, 0x00,                     // LOGICAL_MINIMUM (0)0x25, 0x01,                     // LOGICAL_MAXIMUM (1)0x95, 0x40,                     // REPORT_COUNT (64)0x75, 0x01,                     // REPORT_SIZE (1)0x81, 0x02,                     // INPUT (Data,Var,Abs)/* USER CODE END 0 */0xc0    /*     END_COLLECTION                */
};

关于报文描述符,网上有很多资料,官方资料也很全,可自行查看。

坑一:
CubeMX 生成的代码,不作修改默认仅支持2 Byte的数据传输, 害得我测试了半天,后面的数据一直接收不到。
原来需要修改一下配置定义,以64 Bytes 为例:

@file    usbd_customhid.h
/** @defgroup USBD_CUSTOM_HID_Exported_Defines* @{*/
#define CUSTOM_HID_EPIN_ADDR                 0x81U
#define CUSTOM_HID_EPIN_SIZE                 0x40U#define CUSTOM_HID_EPOUT_ADDR                0x01U
#define CUSTOM_HID_EPOUT_SIZE                0x40U

坑二:
HID报告描述符的大小设置,设置多了少了都不行,一定要与你的描述符长度相符,不然电脑无法正常的识别USB设备。我这里设置了23,与上述的描述符长度相符。

/*---------- -----------*/
#define USBD_MAX_NUM_INTERFACES     1
/*---------- -----------*/
#define USBD_MAX_NUM_CONFIGURATION     1
/*---------- -----------*/
#define USBD_MAX_STR_DESC_SIZ     512
/*---------- -----------*/
#define USBD_DEBUG_LEVEL     0
/*---------- -----------*/
#define USBD_SELF_POWERED     1
/*---------- -----------*/
#define USBD_CUSTOMHID_OUTREPORT_BUF_SIZE    64
/*---------- -----------*/
#define USBD_CUSTOM_HID_REPORT_DESC_SIZE     23

坑三:
USB设备发送数据给电脑的函数:

USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, buff, 8);

这个函数里的这个参数&hUsbDeviceFS,编辑器会有报错的显示。
原因:cubeMX生成代码后,hUsbDeviceFS并没有全局定义,所以如果在main里使用该参数就会找不到该参数。
解决方法:在usbd_custom_hid_if.h里添加这句代码,并在主函数加入该头文件。

usbd_custom_hid_if.h
/* USER CODE BEGIN EXPORTED_VARIABLES */
extern USBD_HandleTypeDef hUsbDeviceFS;
/* USER CODE END EXPORTED_VARIABLES */

以上内容记录下来,希望能帮助到有需要的伙伴。
该文章如有不对地地方,欢迎指出。

记录一下 开发STM32 USB HID踩过的坑相关推荐

  1. USB开发—STM32 USB Audio 开发板介绍(Feedback)

    USB开发-STM32 USB Audio 开发板介绍(Feedback) 一.背景 我个人从事音频行业有好几年的时间.后面慢慢的做起了声卡,也就是USB Audio.自己也走了不少的弯路.之前一起是 ...

  2. STM32 USB HID Mouse And Keyboard (guide)

    There is a post (STM32 And Custom USB HID Device? Yes Please!) that gets a lot of attention, althoug ...

  3. 【STM32+cubemx】0017 HAL库开发:usb HID鼠标设备实现

    Cubemx可以生成多种usb设备的初始化代码,本节我们就使用它来生成一个usb HID鼠标的工程,在开发板上运行以后,可以模拟usb鼠标的功能. 1)生成USB HID工程 仍然使用串口工程,如下图 ...

  4. STM32 USB HID IAP升级

    找了网上大量的资料,最后发现这个东西人家还出售源码.又不是什么算法级的东西,实在理解不了. 至于为什么要用HID,不用官方的DFU,因为驱动呀,DFU识别USB的时候还是要装驱动,客户你永远理解不了他 ...

  5. stm32 USB HID+CDC 鼠标键盘串口 组合设备配置解析

    前言 查阅网上的博客与代码,很多都是关于USB的鼠标配置.USB的键盘配置.USB的虚拟串口配置,稍微深入一点的会将鼠标键盘合在一起,但移植起来就会报很多错误,要么是检测不到,要么是警告,这很正常,因 ...

  6. STM32 USB HID设置(STM32CubeMX)

    STM32F070F6P USB HID设置 1.打开STM32CubeMX软件,选择"NEW"新建一个工程 2.选择芯片型号STM32F070F6P 3.在Swap PA9/10 ...

  7. hid设备驱动linux,Linux HID 驱动开发(2) USB HID Report 描述及usage 概念

    在USB的枚举后,即交互完 设备描述符(device descriptor),配置描述符(configure descriptor),接口描述符(interface descriptor)和 在inp ...

  8. [转载][AutoCAD二次开发][2017]Autocad2017 ObjectARX 开发 环境配置和踩到的坑

    转自 https://www.cnblogs.com/aweffr/p/7510544.html 其中 链接器(Linker)中添加附加依赖目录和附加依赖项 版本号记得改成自己的版本就好 碎碎念 不得 ...

  9. [AutoCAD二次开发][2017]Autocad2017 ObjectARX 开发 环境配置和踩到的坑

    碎碎念 不得不说autocad二次开发的相关资料真的少,大多数还很旧.图书馆里VBA的一本最近出版时间是2006,AutoLisp的2013(还是个十二五规划教材),ObjectARX的书是2014年 ...

最新文章

  1. Python 3.8即将发布,这几个变化你必须知道
  2. Android Linux下的常用命令行
  3. Missing artifact com.github.pagehelper:pagehelper:jar:3.4.2-fix的解决方法
  4. 11. 列表标签及其应实例
  5. 马上开课 | 临床基因组学数据分析实战助力解析Case,快速发表文章
  6. 使用java 遍历文件夹
  7. 一种拜占庭共识协议-Byzantine Agreement,Made Trivial
  8. 常见的MySQL命令大全
  9. STM32——库函数版——超声波测距模块(HC-SR04)
  10. Adobe(Pr Ae)动态图形模板
  11. 热式气体质量流量计检定规程_新品发布:西尼尔ST51/54热式质量流量计
  12. 如何更优雅地使用微博
  13. 计算机提示运行错误,每次电脑一开机就会提示脚本运行错误
  14. 机动车尾气排放模型综述
  15. heka 输出到mysql_Heka配置的详细介绍
  16. 2022西式面点师(高级)操作证考试题模拟考试平台操作
  17. 进程的切换——switch_to函数
  18. MATLAB 迷宫游戏
  19. C# OPC UA 客户端开发
  20. PO等等6种对象包命名含义:PO、VO、BO、DTO、POJO、DAO

热门文章

  1. 百数谐韵咏物千字文全文释义
  2. linux和aws需要什么配置电脑,AWS EC2云服务器环境配置
  3. php k线15分钟 30分钟,15分钟30分钟K线战法
  4. 编程基础(三十七):PTA运行时错误
  5. matlab 面 颜色,matlab曲面颜色
  6. The Google File System 中文版论文(转载)
  7. linux桌面环境调整时钟,小技巧:Linux个性化面版时钟显示
  8. 吴恩达深度学习课程值不值得学?四晚学完的高手给你建议
  9. Python项目:赛车
  10. OpenGL字体绘制