记录一下 开发STM32 USB HID踩过的坑
记录一下 开发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踩过的坑相关推荐
- USB开发—STM32 USB Audio 开发板介绍(Feedback)
USB开发-STM32 USB Audio 开发板介绍(Feedback) 一.背景 我个人从事音频行业有好几年的时间.后面慢慢的做起了声卡,也就是USB Audio.自己也走了不少的弯路.之前一起是 ...
- 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 ...
- 【STM32+cubemx】0017 HAL库开发:usb HID鼠标设备实现
Cubemx可以生成多种usb设备的初始化代码,本节我们就使用它来生成一个usb HID鼠标的工程,在开发板上运行以后,可以模拟usb鼠标的功能. 1)生成USB HID工程 仍然使用串口工程,如下图 ...
- STM32 USB HID IAP升级
找了网上大量的资料,最后发现这个东西人家还出售源码.又不是什么算法级的东西,实在理解不了. 至于为什么要用HID,不用官方的DFU,因为驱动呀,DFU识别USB的时候还是要装驱动,客户你永远理解不了他 ...
- stm32 USB HID+CDC 鼠标键盘串口 组合设备配置解析
前言 查阅网上的博客与代码,很多都是关于USB的鼠标配置.USB的键盘配置.USB的虚拟串口配置,稍微深入一点的会将鼠标键盘合在一起,但移植起来就会报很多错误,要么是检测不到,要么是警告,这很正常,因 ...
- STM32 USB HID设置(STM32CubeMX)
STM32F070F6P USB HID设置 1.打开STM32CubeMX软件,选择"NEW"新建一个工程 2.选择芯片型号STM32F070F6P 3.在Swap PA9/10 ...
- hid设备驱动linux,Linux HID 驱动开发(2) USB HID Report 描述及usage 概念
在USB的枚举后,即交互完 设备描述符(device descriptor),配置描述符(configure descriptor),接口描述符(interface descriptor)和 在inp ...
- [转载][AutoCAD二次开发][2017]Autocad2017 ObjectARX 开发 环境配置和踩到的坑
转自 https://www.cnblogs.com/aweffr/p/7510544.html 其中 链接器(Linker)中添加附加依赖目录和附加依赖项 版本号记得改成自己的版本就好 碎碎念 不得 ...
- [AutoCAD二次开发][2017]Autocad2017 ObjectARX 开发 环境配置和踩到的坑
碎碎念 不得不说autocad二次开发的相关资料真的少,大多数还很旧.图书馆里VBA的一本最近出版时间是2006,AutoLisp的2013(还是个十二五规划教材),ObjectARX的书是2014年 ...
最新文章
- Python 3.8即将发布,这几个变化你必须知道
- Android Linux下的常用命令行
- Missing artifact com.github.pagehelper:pagehelper:jar:3.4.2-fix的解决方法
- 11. 列表标签及其应实例
- 马上开课 | 临床基因组学数据分析实战助力解析Case,快速发表文章
- 使用java 遍历文件夹
- 一种拜占庭共识协议-Byzantine Agreement,Made Trivial
- 常见的MySQL命令大全
- STM32——库函数版——超声波测距模块(HC-SR04)
- Adobe(Pr Ae)动态图形模板
- 热式气体质量流量计检定规程_新品发布:西尼尔ST51/54热式质量流量计
- 如何更优雅地使用微博
- 计算机提示运行错误,每次电脑一开机就会提示脚本运行错误
- 机动车尾气排放模型综述
- heka 输出到mysql_Heka配置的详细介绍
- 2022西式面点师(高级)操作证考试题模拟考试平台操作
- 进程的切换——switch_to函数
- MATLAB 迷宫游戏
- C# OPC UA 客户端开发
- PO等等6种对象包命名含义:PO、VO、BO、DTO、POJO、DAO