吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1800|回复: 7
收起左侧

[学习记录] stm32快速开发hid鼠标(mouse)与键盘(keyboard)

[复制链接]
vtor 发表于 2023-6-28 18:49
本帖最后由 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下载程序
image.png

image.png

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

0103-在第三方库中打开usb工程,并选择为hid(human interface device人机接口设备)设备,参
数保持不变
image.png 看一下所有配置(只有红框是必须,其他可以不需要)
9cf2ca3253f8802bf29d543a3cba4c6.jpg
image.png
  

保存,并生成代码即可。

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[0]));
image.png

image.png

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

030102-设备报告描述符在usb_hid,c内,修改如下,可去 HID键盘报告描述符2 - USB中文网 (usbzh.com)进行复制我使用的是描述符2,,,长度为63

image.png 。。。.。
。。。。
。。。。。具体代码,建议去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,根据我这进行修改即可
image.png

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

0303-键盘发送数据
image.png

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


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

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
lyz012399 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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
额。。这里都有单片机开发了。。
单片机从业者留。。
Vincent168 发表于 2023-6-29 10:31
感谢楼主分享
Ikuuss 发表于 2023-7-6 00:25
感谢分享!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-1 02:04

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表