【STM32】使用STM32CubeMX创建CustomHID设备


准备工作

STM32CubeMX、keil、一块支持USB外设的ST芯片

一、CubeMX配置

1.1 第一步打开USB外设,参数保持默认即可,内容如下图所示:

在这里插入图片描述

1.2 接下来是配置USB_Device相关参数

在这里插入图片描述

在这里插入图片描述
确认无误后生成代码即可。到这里我们只是有了这个设备,但是直接连到电脑上是不会被识别到的,接下来就要修

改报文描述符等内容。

二、代码修改

1.修改报文描述符内容

描述符内容如下(想了解设备描述符怎么来的可以去看《圈圈教你玩usb》这本书里面说的很详细):


    0x06, 0x00, 0xff,              // USAGE_PAGE (Vendor Defined Page 1) 表示一个报文标签之类的用途类页
    0x09, 0x01,                    // USAGE (Vendor Usage 1) 表示一个报告ID标志
    0xa1, 0x01,                    // COLLECTION (Application) 表示应用集合,要以下面最后的0xc0结束它


    0x09, 0x01,                    //   USAGE (Vendor Usage 1)功能的一个卷标志
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)  表示每个传输数据限定为0
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255) 表示每个传输数据的最大值限定为255
    0x95, 0x40,                    //   REPORT_COUNT (64)  每次发送的数据长度,这里是64位
    0x75, 0x08,                    //   REPORT_SIZE (8)   同下REPORT_SIZE
    0x81, 0x02,                    //   INPUT (Data,Var,Abs) 表示USB要输入数据到PC的功能


    0x09, 0x01,                    //   USAGE (Vendor Usage 1) 每个功能的一个卷标志
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)    表示每个传输数据限定为0
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)    表示每个传输数据的最大值限定为255
    0x95, 0x40,                    //   REPORT_COUNT (64) 每次接收的数据长度,这里是64位
    0x75, 0x08,                    //   REPORT_SIZE (8)        传输字段的宽度为8bit,表示每个传输的数据范围为0~ffff ffff
    0x91, 0x02,                    //   OUTPUT (Data,Var,Abs) 表示USB设备要接收PC的数据的功能
    0xc0                           // END_COLLECTION  结束标志
    

将其复制到usbd_custom_hid_if.c文件中的

CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE]数组内即可,

随后对usbd_conf.h和usbd_customhid.h的以下内容进行修改:

#define USBD_CUSTOMHID_OUTREPORT_BUF_SIZE      64

#define USBD_CUSTOM_HID_REPORT_DESC_SIZE       34

#define CUSTOM_HID_EPIN_SIZE                  0x40

#define CUSTOM_HID_EPOUT_SIZE              0x40

修改完之后就已经可以正常使用了,但是有些朋友可能会发现,这通信速率实在是不敢恭维。接下来就说一下如何

修改通信速率打开usbd_customhid.c文件

找到以下内容
在这里插入图片描述
其默认位20ms我们只需要将其变小即可,最小可以为0x01。

到这里所有的工作都已经完成了,接下里便是接收和发送部分的内容

2.USB打印功能

在讲解打印功能之前,要先学习一下USB的接收以及发送函数,当USB接收完一包数据之后会自动调用文件

usbd_custom_hid_if.c中的static int8_t CUSTOM_HID_OutEvent_FS(uint8_t event_idx, uint8_t state)函数

这里面的内容需要我们根据实际情况进行调整,其中接收到的数据存放在hhid->Report_buf中;

在这里插入图片描述
发送函数uint8_t USBD_CUSTOM_HID_SendReport (USBD_HandleTypeDef *pdev, uint8_t *report, uint16_t len)

存在于usbd_customhid.c文件中。

打印代码的话可以参考以下内容:

#include <stdarg.h>

void usb_printf(const char *format, ...)
{
    va_list args;
	uint8_t USB_HID_TxBuff[100] = {0};
	
    va_start(args, format);
	/* 将参数格式化输出到数组 */
    vsnprintf((char *)USB_HID_TxBuff, 64, (char *)format, args); 
    va_end(args);
    USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, USB_HID_TxBuff, 64);
}

到此,USB-HID设备我们已经调试修改完毕,接下来编译下载代码即可。

*觉得有帮助的朋友可以关注一下博主,后续会给大家分享更多有趣的内容。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值