当前位置:首页 » 《资源分享》 » 正文

DIY一个usb数字键盘(一) 基于stm32cubemx HAL库 usb hid协议_m0_52521883的博客

2 人参与  2021年09月25日 07:43  分类 : 《资源分享》  评论

点击全文阅读


基于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


点击全文阅读


本文链接:http://zhangshiyu.com/post/28546.html

参数  数据  报文  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1