基于stm32的自定义HID设备开发与上位机通讯实现

发布者:hfy13567003617最新更新时间:2019-06-13 来源: eefocus关键字:stm32  HID设备  上位机通讯 手机看文章 扫描二维码
随时随地手机看文章

1.HID通信的实现

2.使用USB外设

3.使用HID设备

4.配置时钟


5.USB中断放低点



6.生成代码,替换配置描述符


/* USB HID device Configuration Descriptor */

__ALIGN_BEGIN static uint8_t USBD_HID_CfgDesc[USB_HID_CONFIG_DESC_SIZ]  __ALIGN_END =

{

  0x09, /* bLength: Configuration Descriptor size */

  USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */

  USB_HID_CONFIG_DESC_SIZ,

  /* wTotalLength: Bytes returned */

  0x00,

  0x01,         /*bNumInterfaces: 1 interface*/

  0x01,         /*bConfigurationValue: Configuration value*/

  0x00,         /*iConfiguration: Index of string descriptor describing

  the configuration*/

  0xE0,         /*bmAttributes: bus powered and Support Remote Wake-up */

  0x32,         /*MaxPower 100 mA: this current is used for detecting Vbus*/

  

  /************** Descriptor of Joystick Mouse interface ****************/

  /* 09 */

  0x09,         /*bLength: Interface Descriptor size*/

  USB_DESC_TYPE_INTERFACE,/*bDescriptorType: Interface descriptor type*/

  0x00,         /*bInterfaceNumber: Number of Interface*/

  0x00,         /*bAlternateSetting: Alternate setting*/

  0x01,         /*bNumEndpoints*/

  0x03,         /*bInterfaceClass: HID*/

  0x01,         /*bInterfaceSubClass : 1=BOOT, 0=no boot*/

  0x01,         /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/

  0,            /*iInterface: Index of string descriptor*/

  /******************** Descriptor of Joystick Mouse HID ********************/

  /* 18 */

  0x09,         /*bLength: HID Descriptor size*/

  HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/

  0x11,         /*bcdHID: HID Class Spec release number*/

  0x01,

  0x00,         /*bCountryCode: Hardware target country*/

  0x01,         /*bNumDescriptors: Number of HID class descriptors to follow*/

  0x22,         /*bDescriptorType*/

  HID_MOUSE_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/

  0x00,

  /******************** Descriptor of Mouse endpoint ********************/

  /* 27 */

  0x07,          /*bLength: Endpoint Descriptor size*/

  USB_DESC_TYPE_ENDPOINT, /*bDescriptorType:*/

  

  HID_EPIN_ADDR,     /*bEndpointAddress: Endpoint Address (IN)*/

  0x03,          /*bmAttributes: Interrupt endpoint*/

  HID_EPIN_SIZE, /*wMaxPacketSize: 4 Byte max */

  0x00,

  HID_FS_BINTERVAL,          /*bInterval: Polling Interval (10 ms)*/

  /* 34 */

} ;

7.替换报告描述符


__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE]  __ALIGN_END =

{

0x05, 0x01,// USAGE_PAGE (Generic Desktop)

0x09, 0x06,// USAGE (Keyboard)

0xa1, 0x01,// COLLECTION (Application)

0x05, 0x07,// USAGE_PAGE (Keyboard)

0x19, 0xe0,// USAGE_MINIMUM (Keyboard LeftControl)

0x29, 0xe7,// USAGE_MAXIMUM (Keyboard Right GUI)

0x15, 0x00,// LOGICAL_MINIMUM (0)

0x25, 0x01,// LOGICAL_MAXIMUM (1)

0x75, 0x01,// REPORT_SIZE (1)

0x95, 0x08,// REPORT_COUNT (8)

0x81, 0x02,// INPUT (Data,Var,Abs)

0x95, 0x01,// REPORT_COUNT (1)

0x75, 0x08,// REPORT_SIZE (8)

0x81, 0x03,// INPUT (Cnst,Var,Abs)

0x95, 0x05,// REPORT_COUNT (5)

0x75, 0x01,// REPORT_SIZE (1)

0x05, 0x08,// USAGE_PAGE (LEDs)

0x19, 0x01,// USAGE_MINIMUM (Num Lock)

0x29, 0x05,// USAGE_MAXIMUM (Kana)

0x91, 0x02,// OUTPUT (Data,Var,Abs)

0x95, 0x01,// REPORT_COUNT (1)

0x75, 0x03,// REPORT_SIZE (3)

0x91, 0x03,// OUTPUT (Cnst,Var,Abs)

0x95, 0x06,// REPORT_COUNT (6)

0x75, 0x08,// REPORT_SIZE (8)

0x15, 0x00,// LOGICAL_MINIMUM (0)

0x25, 0xFF,// LOGICAL_MAXIMUM (255)

0x05, 0x07,// USAGE_PAGE (Keyboard)

0x19, 0x00,// USAGE_MINIMUM (Reserved (no event indicated))

0x29, 0x65,// USAGE_MAXIMUM (Keyboard Application)

0x81, 0x00,// INPUT (Data,Ary,Abs)

0xc0

}; 

8.修改宏定义


#define HID_EPIN_ADDR                 0x81

#define HID_EPIN_SIZE                 0x08

 

#define USB_HID_CONFIG_DESC_SIZ       34

#define USB_HID_DESC_SIZ              9

#define HID_MOUSE_REPORT_DESC_SIZE    63

 

#define HID_DESCRIPTOR_TYPE           0x21

#define HID_REPORT_DESC               0x22

 

#define HID_HS_BINTERVAL               0x07

#define HID_FS_BINTERVAL               0x0A

#define HID_POLLING_INTERVAL           0x0A

 

#define HID_REQ_SET_PROTOCOL          0x0B

#define HID_REQ_GET_PROTOCOL          0x03

 

#define HID_REQ_SET_IDLE              0x0A

#define HID_REQ_GET_IDLE              0x02

 

#define HID_REQ_SET_REPORT            0x09

#define HID_REQ_GET_REPORT            0x01

9.通过函数发送键值,自己写(USBD_HID_SendReport)



10.通过bushound监测上传数据



键盘发送给PC的数据每次8个字节:BYTE1 BYTE2 BYTE3 BYTE4 BYTE5 BYTE6 BYTE7 BYTE8。定义分别是:

BYTE1 --

       |--bit0:   Left Control    是否按下,按下为1 

       |--bit1:   Left Shift        是否按下,按下为1 

       |--bit2:   Left Alt           是否按下,按下为1 

       |--bit3:   Left GUI         是否按下,按下为1 

       |--bit4:   Right Control  是否按下,按下为1  

       |--bit5:   Right Shift      是否按下,按下为1 

       |--bit6:   Right Alt         是否按下,按下为1 

       |--bit7:   Right GUI        是否按下,按下为1 

BYTE2 -- 暂不清楚,有的地方说是保留位

BYTE3--BYTE8 -- 这六个为普通按键


第一列10进制键值,第二列16进制键值,第四列是按键

 

0 00 Reserved (no event indicated)9 N/A √ √ √ 4/101/104

1 01 Keyboard ErrorRollOver9 N/A √ √ √ 4/101/104

2 02 Keyboard POSTFail9 N/A √ √ √ 4/101/104

3 03 Keyboard ErrorUndefined9 N/A √ √ √ 4/101/104

4 04 Keyboard a and A4 31 √ √ √ 4/101/104

5 05 Keyboard b and B 50 √ √ √ 4/101/104

6 06 Keyboard c and C4 48 √ √ √ 4/101/104

7 07 Keyboard d and D 33 √ √ √ 4/101/104

8 08 Keyboard e and E 19 √ √ √ 4/101/104

9 09 Keyboard f and F 34 √ √ √ 4/101/104

10 0A Keyboard g and G 35 √ √ √ 4/101/104

11 0B Keyboard h and H 36 √ √ √ 4/101/104

12 0C Keyboard i and I 24 √ √ √ 4/101/104

13 0D Keyboard j and J 37 √ √ √ 4/101/104

14 0E Keyboard k and K 38 √ √ √ 4/101/104

15 0F Keyboard l and L 39 √ √ √ 4/101/104

16 10 Keyboard m and M4 52 √ √ √ 4/101/104

17 11 Keyboard n and N 51 √ √ √ 4/101/104

18 12 Keyboard o and O4 25 √ √ √ 4/101/104

19 13 Keyboard p and P4 26 √ √ √ 4/101/104

20 14 Keyboard q and Q4 17 √ √ √ 4/101/104

21 15 Keyboard r and R 20 √ √ √ 4/101/104

22 16 Keyboard s and S4 32 √ √ √ 4/101/104

23 17 Keyboard t and T 21 √ √ √ 4/101/104

24 18 Keyboard u and U 23 √ √ √ 4/101/104

25 19 Keyboard v and V 49 √ √ √ 4/101/104

26 1A Keyboard w and W4 18 √ √ √ 4/101/104

27 1B Keyboard x and X4 47 √ √ √ 4/101/104

28 1C Keyboard y and Y4 22 √ √ √ 4/101/104

29 1D Keyboard z and Z4 46 √ √ √ 4/101/104

30 1E Keyboard 1 and !4 2 √ √ √ 4/101/104

31 1F Keyboard 2 and @4 3 √ √ √ 4/101/104

32 20 Keyboard 3 and #4 4 √ √ √ 4/101/104

33 21 Keyboard 4 and $4 5 √ √ √ 4/101/104

34 22 Keyboard 5 and %4 6 √ √ √ 4/101/104

35 23 Keyboard 6 and ^4 7 √ √ √ 4/101/104

36 24 Keyboard 7 and &4 8 √ √ √ 4/101/104

37 25 Keyboard 8 and *4 9 √ √ √ 4/101/104

38 26 Keyboard 9 and (4 10 √ √ √ 4/101/104

39 27 Keyboard 0 and )4 11 √ √ √ 4/101/104

40 28 Keyboard Return (ENTER)5 43 √ √ √ 4/101/104

41 29 Keyboard ESCAPE 110 √ √ √ 4/101/104

42 2A Keyboard DELETE (Backspace)13 15 √ √ √ 4/101/104

43 2B Keyboard Tab 16 √ √ √ 4/101/104

44 2C Keyboard Spacebar 61 √ √ √ 4/101/104

45 2D Keyboard - and (underscore)4 12 √ √ √ 4/101/104

46 2E Keyboard = and +4 13 √ √ √ 4/101/104

47 2F Keyboard [ and {4 27 √ √ √ 4/101/104

48 30 Keyboard ] and }4 28 √ √ √ 4/101/104

49 31 Keyboard and | 29 √ √ √ 4/101/104

50 32 Keyboard Non-US # and ~2 42 √ √ √ 4/101/104

51 33 Keyboard ; and :4 40 √ √ √ 4/101/104

52 34 Keyboard ‘ and “4 41 √ √ √ 4/101/104

53 35 Keyboard Grave Accent and Tilde4 1 √ √ √ 4/101/104

54 36 Keyboard, and <4 53 √ √ √ 4/101/104

55 37 Keyboard . and >4 54 √ √ √ 4/101/104

56 38 Keyboard / and ?4 55 √ √ √ 4/101/104

57 39 Keyboard Caps Lock11 30 √ √ √ 4/101/104

58 3A Keyboard F1 112 √ √ √ 4/101/104

59 3B Keyboard F2 113 √ √ √ 4/101/104

60 3C Keyboard F3 114 √ √ √ 4/101/104

61 3D Keyboard F4 115 √ √ √ 4/101/104

62 3E Keyboard F5 116 √ √ √ 4/101/104

63 3F Keyboard F6 117 √ √ √ 4/101/104

64 40 Keyboard F7 118 √ √ √ 4/101/104

65 41 Keyboard F8 119 √ √ √ 4/101/104

66 42 Keyboard F9 120 √ √ √ 4/101/104

67 43 Keyboard F10 121 √ √ √ 4/101/104

68 44 Keyboard F11 122 √ √ √ 101/104

69 45 Keyboard F12 123 √ √ √ 101/104

70 46 Keyboard PrintScreen1 124 √ √ √ 101/104

71 47 Keyboard Scroll Lock11 125 √ √ √ 4/101/104

72 48 Keyboard Pause1 126 √ √ √ 101/104

73 49 Keyboard Insert1 75 √ √ √ 101/104

74 4A Keyboard Home1 80 √ √ √ 101/104

75 4B Keyboard PageUp1 85 √ √ √ 101/104

76 4C Keyboard Delete Forward1;14 76 √ √ √ 101/104

77 4D Keyboard End1 81 √ √ √ 101/104

78 4E Keyboard PageDown1 86 √ √ √ 101/104

79 4F Keyboard RightArrow1 89 √ √ √ 101/104

80 50 Keyboard LeftArrow1 79 √ √ √ 101/104

81 51 Keyboard DownArrow1 84 √ √ √ 101/104

82 52 Keyboard UpArrow1 83 √ √ √ 101/104

83 53 Keypad Num Lock and Clear11 90 √ √ √ 101/104

[1] [2]
关键字:stm32  HID设备  上位机通讯 引用地址:基于stm32的自定义HID设备开发与上位机通讯实现

上一篇:stm32f103C8T6移植enc28j60+UIP1.0
下一篇:STM32 CDC HOST初步调试

推荐阅读最新更新时间:2024-11-01 07:48

stm32 基于3.5 库 MDK 自建工程过程
从0开始 创建一个基于库的工程 第一步: 第二步:其它的就是产生hex 文件,list文件的路径,仿真器选择 下面这个单独列出来是因为没有设置, 生成文件就无法烧录。 第三步 尝试编译一下一下工程,报错是肯定的,来看看是什么错误。 第四步:添加启动文件 第五步:添加库文件 宏定义 头文件路径包含 穿插 MDK自带了一些头文件和库中的文件名是相同的,如果库文件没有添加,编译器就会用自带的文件替代 但是这些文件的内容和库文件中的内容有可能不太一样 第六部 自己写的头文件 stm32f10x_conf.h 头文件 之所以要自己写这个文件,是引文MDK自带文件和库
[单片机]
<font color='red'>stm32</font> 基于3.5 库 MDK 自建工程过程
利用Proteus仿真STM32实现DHT11温湿度检测
1. 前言 Proteus是英国著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一 键切换到PCB设计,真正实现了从概念到产品的完整设计。是世界上唯一将电路仿真软件、PCB设计软 件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、 PIC10/12/16/18/24/30/DSPIC33、AVR、ARM、8086和MSP430等,2010年又增加了Cortex和DSP系 列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MATLAB等多种编译 器。 前面文章介绍了Proteus的下载,安装,建立工程,完成LED灯仿真运行。这篇文章在这基础上增加串口
[单片机]
利用Proteus仿真<font color='red'>STM32</font>实现DHT11温湿度检测
stm32 ADC模数转换 ADC多通道 ADC DMA
通过调节电位器,改变AD转换值和电压值 STM32F1 ADC 配置步骤 1.使能GPIO时钟和ADC时钟 2.配置引脚模式为模拟输入 3.配置ADC的分频因子 4.初始化ADC参数,ADC_InitTypeDef 5.使能ADC 6.执行ADC校准 7.设置ADC软件启动 8.读取ADC转换值 9.设置ADC规则,采样时间等 10.使能ADC的软件转换 11.读取ADC转换结果 举例 u16 ADC_value(u8 time) { u8 i = 0; u16 value; for(i = 0; i time; i++) { ADC_SoftwareStartConvCmd
[单片机]
<font color='red'>stm32</font> ADC模数转换 ADC多通道 ADC DMA
第六种串口协议实现
编写语言:C++ 编写平台:VS 运用平台:STM32和PC 非常实用的一个解析程序,自己编写的也简单。 *.h #define BUF_LEN 1024 //buf长度 #define CONF_BUF_LEN 128 //保存代解析数据 #define DATA_BUF_LEN 100 //保存解析数据 //此处为最大传输数据 #define CONF_BUF_BEST_LEN 4 //基本数据长度 /*/////////////////协议定义////////////////////// // 0x6B 0x66 长度 数据 校验(长度+数据的和) //最基本的数据 0x6B 0x66 0x
[单片机]
第六种串口协议实现
STM32例程之USB HID双向数据传输
程序功能 将STM32的USB枚举为HID设备。 STM32使用3个端点,端点0用于枚举用,端点1和2用于数据的发送和接收。 端点长度为64,也就是单次最多可以传输64个字节数据。 STM32获取上位机下发的数据并将该数据通过USB原样返回,同时将数据打印输出。 上位机程序通过调用windows的API实现对HID设备的读写控制。 USB接口原理图: HID枚举成功: 程序效果图 图一 上位机程序运行图 图二 STM32串口打印输出 图三 Bus Hound抓取的数据 程序部分代码 STM32的报告描述符: const uint8_t CustomHID_ReportDescriptor = { 0
[单片机]
<font color='red'>STM32</font>例程之USB <font color='red'>HID</font>双向数据传输
STM32驱动ADC0809详解
开发环境与工具 Keil 5主芯片为 STM32F103RET6下载工具为 JLINKXCOM V2.0 串口助手PC 为 Win10 准备工作 购买 ADC0809 芯片 习惯购买元器件多买一个,方便替换验证。 因为做过一次验证之后,这个板子就没有用了,所以购买 DIP-28 宽体底座,让底座焊板子上,芯片插底座上,方便芯片的二次使用,节约成本。 PCB 打板 下图这种模块: STM32 要想驱动 ADC0809 这个芯片需要很多个引脚(不考虑复用的话,需要 16 个引脚),如果这些引脚都用杜邦线连接的话会很乱,如果哪个杜邦线再接触不好,那么对于程序的调试很不方便,所以我就采用核心板+底板的形式来实现,避
[单片机]
STM32三线检测八个按键(74HC165)
STM32三线检测八个按键是典型的IO扩展应用(并转串),思路和学习51单片机时一致,下面直接上图和代码! 简述: 1.74HC165使用1、2、9脚,15脚可直接接地 2.按键低电平为按下 PA1- SL 并行数据加载 PA2- CLK 时钟 PA3- DAT 串行数据输出 代码: #include 74HC165.h #include delay.h void Init_74HC165(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GP
[单片机]
<font color='red'>STM32</font>三线检测八个按键(74HC165)
stm32串口中断接收发送实验
int main() { u32 i = 0; /*芯片配置初始化----------------------------------------------------------*/ RCC_Configuration(); //复位和时钟控制配置 NVIC_Configuration(); //嵌套中断向量控制器配置 GPIO_Configuration(); //I/O配置 USART_Configuration(); //串口配置 /*指示灯初始化------------
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved