好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 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[0]));
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,根据我这进行修改即可
0302-键盘设备数据结构
usb中文网 关于键盘的描述https://usbzh.com /article/detail-1086.html
但描述不是很清楚,这里直接使用视频截图
一般来说,直接使用byte[0]与byte[2]即可,
具体使用方法,看下图
0303-键盘发送数据
和鼠标不同,键盘并不会清空端口内的数据,所以需要一直刷新,
当有按键按下时,将[2]变成对应的键值,就可以实现usb键盘设备此处
使用单击时,输出'a',
双击时触发复制操作,
3击时触发粘贴操作,具体的参数,查看数据对应表即可。
04-尾声
至此,
你已经学会使用stm32cubeide给stm32开发键鼠设备了,
有兴趣的话,可以自己做键盘了。 |
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|