IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> DIY一个usb数字键盘(一) 基于stm32cubemx HAL库 usb hid协议 -> 正文阅读

[嵌入式]DIY一个usb数字键盘(一) 基于stm32cubemx HAL库 usb hid协议

前言:在代码实现部分,我在下一篇文章讲解,本文会较为详细的讲一下基本设置和协议设置

逻辑代码部分:基于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

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-10 11:01:09  更:2021-09-10 11:01:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/30 0:46:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码