基于HAL库的自制usb数字键盘 (一)
- 前言:在代码实现部分,我在下一篇文章讲解,本文会较为详细的讲一下基本设置和协议设置
- 开发环境
- STM32cubemx初始化
- 经典时钟
- 经典 swd
- 5ms的 tim2 (这个时间很重要,记住)(可自行修改)
- GPIO
- 勾上usb
- custom hid
- 参数
- hid 描述符
- keil代码编写
- 参数修改
- 复制报文
- 数据发送
- 非常重要的一点就是要及时弹出
- 下一篇
前言:在代码实现部分,我在下一篇文章讲解,本文会较为详细的讲一下基本设置和协议设置
逻辑代码部分:基于HAL库的自制usb数字键盘 (二)逻辑部分
类似文章:usb 手柄
开发环境
单片机:stm32f103c8t6
软件 :keil (编写代码),stm32cubemx(初始化),HID Descriptor tool(生成报文),usb bound(抓包)
STM32cubemx初始化
经典时钟
经典 swd
5ms的 tim2 (这个时间很重要,记住)(可自行修改)
勾上中断
GPIO
我没写矩阵扫描,最简单的每个按键对应一个gpio ,当然可改成矩阵,(相信看到这的大佬都会)
勾上usb
custom hid
参数
ps:提前说明,一下参数可以在keil 工程里面修改
第一个参数 很重要
- 可以解释为,stm32 将数据发送到一个缓存区,而不是直接发送到 上位机(pc端),而上位机,每隔一端时间会来访问缓冲区,读取数据。而这个读取时间间隔就是第一个参数。这也是为什么定时器要设置为5ms,过快会导致,多次数据发送,过慢,会导致数据丢失
- custom_hid_fs_BINTFRVAL
第二个参数
报文个数
- 报文就是 下位机向上位机,解释自己是啥东西,有啥功能,数据格式,等等的非常重要的参数
第三个参数
输出缓存,选最大
第四个参数
最大支持的hid 设备的接口数,应为现在只有键盘,所以1就行,
如果是需要,同时键盘,鼠标,手柄啥的,根据数量选择即可
后面参数保持默认即可
这些都是,接入电脑后的名称参数等,不该也行
最后主要 usb的时钟 48M
然后生成初始化代码
hid 描述符
可以看这篇文章做了解
具体,我其实也只是一知半解,这里说明只是我个人的理解。(大佬轻喷)
- 第一个参数:描述这是 一般桌面控制设备 用途页
- 第二个参数:描述 这是键盘
- 第三个参数:数据包的收集开始,键盘属于Application,(协议规定)
- 第四个参数:描述这是 键盘的用途页
- 第五个参数:声明接下来的参数最小值为 0
- 第五个参数:声明接下来的参数最小值为 0
- 第六个参数:声明 数据代表的按键从 keypad 1 and End 开始
- 第七个参数:声明 数据代表的按键到 keypad 0 and Insert 结束
(这里意思是我要 用 这10个按键) - 第八个参数:声明 数据代表的按键到 keypad 0 and Insert 结束
- 第九个参数:这 里每个数据 为 1 位 (1字节 8位)
- 第十个参数:共有 10 个这样 1 位的数据 代表十个按键
- 第11个参数: 这十个数据的类型 (上面那篇文章有细讲)
- 第12,13 ,14个参数:为了凑成两字节 16位,补上 6位 常量
- 第15个参数 :数据包收集结束
总共 29个字节,可以往上看,之前stm32cubemx里 的报文字节 参数设置
选择 Save As ,记得保存成 .h文件
keil代码编写
参数修改
在usbd_conf.h中可以修改
复制报文
在usbd_custom_hid_if.c
数据发送
在使用到 USBD_CUSTOM_HID_SendReport()的函数前加上 头文件和 句柄声明
例:
#include "usbd_customhid.h"
extern USBD_HandleTypeDef hUsbDeviceFS;
/*
其他代码
*/
SBD_CUSTOM_HID_SendReport(&USB_OTG_dev, buff, 2);
非常重要的一点就是要及时弹出
因为缓存区不会自己刷新,所以假如我们发送数据到缓存区后,没有清 0,那么 ,以5ms为例, 按下数字 1 后,会以每秒20个“1”打印在电脑屏幕上。
所以要及时弹出即清零
举例:
buff[0]=0x01;
buff[1]=0x00;
USBD_CUSTOM_HID_SendReport(&USB_OTG_dev, buff, 2);
HAL_Delay(5);
buff[0]=0x00;
buff[1]=0x00;
USBD_CUSTOM_HID_SendReport(&USB_OTG_dev, buff, 2);
HAL_Delay(5);
当然实际中不会这样 傻傻的用 delay延时
定时器会更为好用
下一篇
因为代码部分,用了较为系统的封装,代码太多了,,,所以另起一篇来讲,当然dalao可以忽略。。
有啥问题可留言说明。
dae::2021.9.9
autho:_zs_dawn