stm32快速开发hid鼠标(mouse)与键盘(keyboard)

20230628-vtor3478@qq.com

00-前言

usb中文网:USB中文网 - USB技术开发交流 (usbzh.com)

USB鼠标HID报告描述符数据格式分析:https://usbzh.com/article/detail-327.html

 

USB键盘的数据结构:https://usbzh.com/article/detail-1086.html

参考的b站usb鼠标开发视频:https://www.bilibili.com/video/BV1XY4y1e7XQ

参考的b站usb键盘开发视频:https://www.bilibili.com/video/BV1CL4y157Wg

开发环境:stm32cubeide

主控芯片硬件:stm32f103rct6

外设:引出了usb接口,gpio

实物:按键,usb连接线,stlink

需要有基本stm32基础知识,比如使用stm32cubeide配置工程,编译,下载,复位等操作

 

01-基本配置

0101-debug接口与按键接口

注意:勾选sys中的debug,以便于stlink或jlink下载程序

0102-启用usb功能,能明显看到是fs(full speed)

0103-在第三方库中打开usb工程,并选择为hid(human interface device人机接口设备)设备,参数保持不变

看一下所有配置(只有红框是必须,其他可以不需要)

 

 保存,并生成代码即可。

 

02-usb鼠标

0201-hid鼠标报文

在鼠标程序中,暂不设计设备描述符,只讲数据格式,以便迅速上手

usb hid需要向主机(host)传输数据,肯定存在一个上传(发送、报告)函数

/**
  * @brief  USBD_HID_SendReport
  *         Send HID Report
  * @param  pdev: device instance
  * @param  buff: pointer to report
  * @retval status
  */
uint8_t USBD_HID_SendReport(USBD_HandleTypeDef  *pdev,
                            uint8_t *report,
                            uint16_t len)

第一个参数为usbd的类型,参考hal库,可以知道其性质与htim,huart等一致,,最终得知其变量为hUsbDeviceFS

后面两个参数为内存起始地址与数据长度,暂命名为mouseBuf

再查看鼠标报文:USB鼠标HID报告描述符数据格式分析 - USB中文网 (usbzh.com)

    usb中文网中有介绍
    https://usbzh.com/article/detail-327.html
    鼠标发送给PC的数据每次4个字节。
    BYTE1字节:
            bit7~3:补充的常数,无意义,这里为0即可
            bit2: 1表示中键按下
            bit1: 1表示右键按下 0表示右键抬起
            bit0: 1表示左键按下 0表示左键抬起
    BYTE2 — X坐标变化量,与byte的bit4组成9位符号数,负数表示向左移,正数表右移。用补码表示变化量
    BYTE3 — Y坐标变化量,与byte的bit5组成9位符号数,负数表示向下移,正数表上移。用补码表示变化量
    BYTE4 — 滚轮变化。0x01表示滚轮向前滚动一格;0xFF表示滚轮向后滚动一格;0x80是个中间值,不滚动。

0202-发送鼠标报文

此处尝试每次点击,让鼠标向右下移动100像素,屏幕坐标为,,从左往右为x,,,从上往下为y,左上角为(0,0)

简单两行代码,即可让鼠标动起来,为防止无限移动,建议使用按键进行触发,根据自身情况而定

unsigned char mouseBuf[] = {0,100,100,0}; // 代表鼠标向右 移动100像素点,,,,向下移动100像素点
USBD_HID_SendReport(&hUsbDeviceFS, mouseBuf, sizeof(mouseBuf) / sizeof(mouseBuf[0]));

 

03-hid键盘

0301-hid设备描述符

前面鼠标之所以简单,是因为stm32cubeide是就是参考鼠标进行开发的,所以基本不需要改动就能直接使用

往电脑插入usb设备,主机需要知道是什么设备进行插入,会发送询问命令,从机则会返回,

所以我们需要修改设备配置描述符与设备报告描述符,从而让主机知道待会儿将使用键盘设备

030101-配置描述符

 

030102-设备报告描述符

在usb_hid,c内,修改如下,可去 HID键盘报告描述符2 - USB中文网 (usbzh.com)进行复制

我使用的是描述符2,,,长度为63

 

 

另外,键盘对应的设备的端口大小也得变,鼠标为4,键盘为8,根据我这进行修改即可

 0302-键盘设备数据结构

usb中文网 关于键盘的描述

https://usbzh.com /article/detail-1086.html

但描述不是很清楚,这里直接使用视频截图

一般来说,直接使用byte[0]与byte[2]即可, 具体使用方法,看下图

 

0303-键盘发送数据

 

 

和鼠标不同,键盘并不会清空端口内的数据,所以需要一直刷新,当有按键按下时,将[2]变成对应的键值,就可以实现usb键盘设备

此处我使用单击时,输出'a',双击时触发复制操作,3击时触发粘贴操作,

具体的参数,查看数据对应表即可。

 

04-尾声

至此,你已经学会使用stm32cubeide给stm32开发键鼠设备了,有兴趣的话,可以自己做键盘了。

 

Posted on 2023-06-28 18:02  污钞vtor  阅读(1482)  评论(0编辑  收藏  举报