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开发键鼠设备了,有兴趣的话,可以自己做键盘了。