STM32·

STM32篇——USB HID

ronger

ronger

8889 1

STM32 HAL库USB HID键盘设备

1. 前期准备

安装好STM32CubeMX

安装好clion

HAL库自动生成的USB HID项目默认为鼠标设备,在这基础上改造成键盘,并实现模拟键盘输出一串字符。

2. 创建项目

在《串口通信》项目基础创建工程。

  1. 配置USB HID设备

点击1处,选中后Device(FS)3处选择HID,其他参数默认。

  1. 配置USB 时钟

USB时钟需设置为48MHz

  1. 增加堆栈大小,防止溢出

3. 编辑代码

更改为键盘。

  1. 设备描述符改为键盘

usbd_hid.c文件中USBD_HID_CfgFSDesc[USB_HID_CONFIG_DESC_SIZ]对应值由0x02改为0x01

  1. 报告描述符改为键盘

usbd_hid.c文件中HID_MOUSE_ReportDesc数组修改如下:

__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE]  __ALIGN_END =
{
        0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
        0x09, 0x06,                    // USAGE (Keyboard)
        0xa1, 0x01,                    // COLLECTION (Application)
        0x05, 0x07,                    //   USAGE_PAGE (Keyboard)
        0x19, 0xe0,                    //   USAGE_MINIMUM (Keyboard LeftControl)
        0x29, 0xe7,                    //   USAGE_MAXIMUM (Keyboard Right GUI)
        0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
        0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
        0x75, 0x01,                    //   REPORT_SIZE (1)
        0x95, 0x08,                    //   REPORT_COUNT (8)
        0x81, 0x02,                    //   INPUT (Data,Var,Abs)
        0x95, 0x01,                    //   REPORT_COUNT (1)
        0x75, 0x08,                    //   REPORT_SIZE (8)
        0x81, 0x03,                    //   INPUT (Cnst,Var,Abs)
        0x95, 0x05,                    //   REPORT_COUNT (5)
        0x75, 0x01,                    //   REPORT_SIZE (1)
        0x05, 0x08,                    //   USAGE_PAGE (LEDs)
        0x19, 0x01,                    //   USAGE_MINIMUM (Num Lock)
        0x29, 0x05,                    //   USAGE_MAXIMUM (Kana)
        0x91, 0x02,                    //   OUTPUT (Data,Var,Abs)
        0x95, 0x01,                    //   REPORT_COUNT (1)
        0x75, 0x03,                    //   REPORT_SIZE (3)
        0x91, 0x03,                    //   OUTPUT (Cnst,Var,Abs)
        0x95, 0x06,                    //   REPORT_COUNT (6)
        0x75, 0x08,                    //   REPORT_SIZE (8)
        0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
        0x25, 0xFF,                    //   LOGICAL_MAXIMUM (255)
        0x05, 0x07,                    //   USAGE_PAGE (Keyboard)
        0x19, 0x00,                    //   USAGE_MINIMUM (Reserved (no event indicated))
        0x29, 0x65,                    //   USAGE_MAXIMUM (Keyboard Application)
        0x81, 0x00,                    //   INPUT (Data,Ary,Abs)
        0xc0
};
  1. 报告描述符由74改为63
//usbd_hid.h
#define HID_MOUSE_REPORT_DESC_SIZE    63U //74U
  1. 增加变量声明

usb_device.h中添加外部变量声明,后面main函数中要用到。

extern USBD_HandleTypeDef hUsbDeviceFS;

4. 模拟键盘发送字符串示例

main.c中添加代码如下:

//添加头文件只支持
#include "usbd_hid.h"
//发送字符串rymcu
  u_char Str[] = {"rymcu"};
  u_char *Pstr = Str;//字符串指针

  uint8_t txbuffer[8]= {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//空
  uint8_t sendbuffer[8]={0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00};//发送字母
  //延迟10s,下载程序后,重新插拔USB,将光标挪至文档中,等待输出
  HAL_Delay(10000);

  while(*Pstr)//判断是否到字符串末尾
  {
        sendbuffer[2] = (*Pstr++)-'a'+ 4;//字母a对应4,其他依次增加
        //发送一个字符
        USBD_HID_SendReport(&hUsbDeviceFS,sendbuffer,8);//发送报文
        HAL_Delay(15);
        USBD_HID_SendReport(&hUsbDeviceFS,txbuffer,8);//发送报文
        HAL_Delay(15);

  }

如上代码所示,发送报告实现键盘字符的模拟,查询USB官方文档可知,字母a键值对应4,其他类推。代码中延迟10s再发送数据,下载程序后,重新插拔USB,将光标挪至文档中,等待输出。

5. 输出测试

程序下载后,重新插拔USB,将光标挪至下面文档,输出结果如下:

6. 小结

本章实现了HALUSB HID键盘发送字符串功能。

所属系列

从当前文章继续阅读它所在合集中的前后内容。

关于我和 Hugh 学嵌入式开发这件事 —— STM32 篇 第 15 / 17 篇
查看合集

> 本作品集内教程基于 [Hugh](https://rymcu.com/user/hugh) 的创作基础上进行修订发布 关于我和 Hugh 学嵌入式开发这件事

相关文章

优先推荐同专题、同标签和同作者内容,补足热门文章。

评论 1

登录 后参与评论

评论 1

xiaohelong2005
xiaohelong200512月6日 17:24

我做个简单的回复测试