vtor 发表于 2023-6-28 18:49

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

本帖最后由 vtor 于 2023-7-4 16:03 编辑


stm32快速开发hid鼠标(mouse)与键盘(keyboard)
时间:20230628,编写者:52论坛vtor

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)传输数据,肯定存在一个上传(发送、报告)函数
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));


https://img2023.cnblogs.com/blog/2472635/202306/2472635-20230628172927661-1571912766.png

03-hid键盘0301-hid设备描述符 前面鼠标之所以简单,是因为stm32cubeide是就是参考鼠标进行开发的,所以基本不需要改动就能直接使用往电脑插入usb设备,主机需要知道是什么设备进行插入,会发送询问命令,从机则会返回,所以我们需要修改设备配置描述符与设备报告描述符,从而让主机知道待会儿将使用键盘设备030101-配置描述符

030102-设备报告描述符在usb_hid,c内,修改如下,可去 HID键盘报告描述符2 - USB中文网 (usbzh.com)进行复制我使用的是描述符2,,,长度为63
。。。.。
。。。。
。。。。。具体代码,建议去usb中文网进行复制,点击链接即可。
0x29, 0x65,      //   Usage Maximum (0x65
)0x81, 0x00,      //   Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position
)0xC0,            // End Collection// 63 bytes
既然结构体内容变了,长度变了,那么数组长度也应该改变,我这里使用63
另外,键盘对应的设备的端口大小也得变,鼠标为4,键盘为8,根据我这进行修改即可
https://img2023.cnblogs.com/blog/2472635/202306/2472635-20230628174346201-1375594319.png

0302-键盘设备数据结构
usb中文网 关于键盘的描述https://usbzh.com /article/detail-1086.html
但描述不是很清楚,这里直接使用视频截图
https://img2023.cnblogs.com/blog/2472635/202306/2472635-20230628175428724-39102485.png
一般来说,直接使用byte与byte即可,
具体使用方法,看下图

0303-键盘发送数据https://img2023.cnblogs.com/blog/2472635/202306/2472635-20230628175818746-1803392237.png


和鼠标不同,键盘并不会清空端口内的数据,所以需要一直刷新,
当有按键按下时,将变成对应的键值,就可以实现usb键盘设备此处
使用单击时,输出'a',
双击时触发复制操作,
3击时触发粘贴操作,具体的参数,查看数据对应表即可。
04-尾声


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

xHack 发表于 2023-6-28 20:12

这个。。。密密麻麻的看着很深奥。。。支持楼主原创。。。感谢

vtor 发表于 2023-6-28 23:51

xHack 发表于 2023-6-28 20:12
这个。。。密密麻麻的看着很深奥。。。支持楼主原创。。。感谢

术业有专精罢了,
其实这个stm32usb鼠标键盘的配置
绝大部分都是鼠标点一点
只有两三个地方需要写写代码,难度不是很大

yiting8 发表于 2023-6-29 09:33

xHack 发表于 2023-6-28 20:12
这个。。。密密麻麻的看着很深奥。。。支持楼主原创。。。感谢

我感觉也是啊。太难了

sdozh8585 发表于 2023-6-29 09:41

真的厉害,在这里啥都能学到

zhang0352505 发表于 2023-6-29 09:50

额。。这里都有单片机开发了。。{:1_907:}
单片机从业者留。。

Vincent168 发表于 2023-6-29 10:31

感谢楼主分享

Ikuuss 发表于 2023-7-6 00:25

感谢分享!
页: [1]
查看完整版本: stm32快速开发hid鼠标(mouse)与键盘(keyboard)