基于JoyStickMouse例程修改即可。

1. 调整描述符

设备描述符可以不用改。

配置描述符长度改为41,主要是增加一个端点。

#define USB_CONFIG_DESC_LEN                     41

配置描述符集合中的Interfae描述符修改如下,

0x09,         /*bLength: Interface Descriptor size*/
    USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/
    0x00,         /*bInterfaceNumber: Number of Interface*/
    0x00,         /*bAlternateSetting: Alternate setting*/
    0x02,         /*bNumEndpoints*/
    0x03,         /*bInterfaceClass: HID*/
    0x00,         /*bInterfaceSubClass : 1=BOOT, 0=no boot*/
    0x00,         /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/
    0,            /*iInterface: Index of string descriptor*/

配置描述符集合中的端点描述符修改:

/******************** Descriptor of CustomHID endpoint ********************/
    /* 27 */
    0x07,          /*bLength: Endpoint Descriptor size*/
    USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/

0x81,          /*bEndpointAddress: Endpoint Address (IN)*/
    0x03,          /*bmAttributes: Interrupt endpoint*/
    0x40,          /*wMaxPacketSize: 64 Byte max */
    0x00,
    0x0a,//0x20,          /*bInterval: Polling Interval (32 ms)*/
    /* 34 */
    0x07,          /*bLength: Endpoint Descriptor size*/
    USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/

0x01,          /*bEndpointAddress: Endpoint Address (OUT)*/
    0x03,          /*bmAttributes: Interrupt endpoint*/
    0x40,          /*wMaxPacketSize: 64 Byte max */
    0x00,
    0x0a,//0x20,          /*bInterval: Polling Interval (32 ms)*/

配置描述符集合中的HID描述符需要和Report描述符一起配合改。

const uint8_t hidReportDescriptor[HID_REPORT_DESC_LEN] =
{
    /* USER CODE BEGIN 0 */
    0x05, 0x8c, /* USAGE_PAGE (ST Page) */
    0x09, 0x01, /* USAGE (Demo Kit) */
    0xa1, 0x01, /* COLLECTION (Application) */
 
    // The Input report
    0x09,0x03, // USAGE ID - Vendor defined
    0x15,0x00, // LOGICAL_MINIMUM (0)
    0x26,0x00, 0xFF, // LOGICAL_MAXIMUM (255)
    0x75,0x08, // REPORT_SIZE (8bit)
    0x95,0x40, // REPORT_COUNT (64Byte)
    0x81,0x02, // INPUT (Data,Var,Abs)
 
    // The Output report
    0x09,0x04, // USAGE ID - Vendor defined
    0x15,0x00, // LOGICAL_MINIMUM (0)
    0x26,0x00,0xFF, // LOGICAL_MAXIMUM (255)
    0x75,0x08, // REPORT_SIZE (8bit)
    0x95,0x40, // REPORT_COUNT (64Byte)
    0x91,0x02, // OUTPUT (Data,Var,Abs)
 
    /* USER CODE END 0 */
    0xC0    /*     END_COLLECTION                 */
};

修改HID描述符中描述Report描述符的长度

/* 18 */
    0x09,         /*bLength: HID Descriptor size*/
    HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/
    0x10,         /*bcdHID: HID Class Spec release number*/
    0x01,
    0x00,         /*bCountryCode: Hardware target country*/
    0x01,         /*bNumDescriptors: Number of HID class descriptors to follow*/
    HID_REPORT_DESCRIPTOR_TYPE,         /*bDescriptorType*/
    HID_REPORT_DESC_LEN,/*wItemLength: Total length of Report descriptor*/
    0x00,

即#define HID_REPORT_DESC_LEN                     33

字符串描述符可以根据需要修改。

2. 调整PMA地址分配,RX和TX都分配64字节。

#define ENDP1_TXADDR        (0x100)
#define ENDP1_RXADDR        (0x140)

然后在Reset里面修改端点的初始化参数

SetEPType(ENDP1, EP_INTERRUPT);
    SetEPTxAddr(ENDP1, ENDP1_TXADDR);
    SetEPRxAddr(ENDP1, ENDP1_RXADDR);
    SetEPTxCount(ENDP1, 64);
    SetEPRxCount(ENDP1, 64);
    SetEPRxStatus(ENDP1, EP_RX_VALID);
    SetEPTxStatus(ENDP1, EP_TX_NAK);

3. 根据项目需求修改EP1的读写函数,这里只是读取64字节数据,然后打印第1个字节和第64个字节

void EP1_OUT_Callback(void)
{
    uint8_t buf[64];
    buf[0] = 0;
    buf[63] = 0;
    USB_SIL_Read(EP1_OUT, buf);
    SetEPRxStatus(ENDP1, EP_RX_VALID);
    Printf("buf[0] = 0x%x, buf[63] = 0x%x\r\n", buf[0], buf[63]);
}

发送数据改为发送64字节

/* Copy mouse position info in ENDP1 Tx Packet Memory Area*/
USB_SIL_Write(EP1_IN, txBuffer, 64);

/* Enable endpoint for transmission */
SetEPTxValid(ENDP1);

4. 使用单片机多功能调试助手调试

发送实验:

接收实验:

基于STM32F103的USB学习笔记27 - CustomHID相关推荐

  1. 基于STM32F103的USB学习笔记4 - 初始化

    1. IO初始化 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);     GPIO_InitSt ...

  2. 基于STM32F103的USB学习笔记35 - Mass Storage之SCSI命令

    参考文档:UFI Command Specification.SCSI Reference Guide CBW包中CB部分(0FH-1EH)的第一个字节是操作码,对于Mass Storage来说,使用 ...

  3. 基于STM32F103的USB学习笔记38 - Mass Storage之SPI Flash做U盘

    1. 将整个Flash作为U盘的空间 Flash大小为4MB,SPI NorFlash的Sector大小为4KB,所以MSC_MEMORY_BLOCK_SIZE设置为4096.. 3个函数的实现如下, ...

  4. USB学习笔记(2)USB协议

    USB学习笔记(2)USB协议 本文对前面提到的USB枚举过程中的标准请求以及各种描述符做出大致解释,方便后面的实操. 1. USB标准请求 USB协议定义了一个8字节的标准设备请求,主要用在设备的枚 ...

  5. 统计学习导论 - 基于R的应用 学习笔记1

    统计学习导论 - 基于R的应用 学习笔记 Chapter 1 导论 统计学习是什么: 关于估计ƒ的一系列方法 Y=f(x)+ξ f:X 提供给 Y 的系统信息,是 x 的函数 ξ:随机误差项:均值为0 ...

  6. USB学习笔记(3)HID应用分析

    USB学习笔记(3)HID应用分析 本文根据前面对USB系统的了解,和USB协议的学习,列出鼠标,键盘,多媒体控制器,自定义HID设备等HID设备的各种描述符. 前景提要:每个设备有且仅有一个设备描述 ...

  7. 计算机基础与程序设计(基于C语言)学习笔记

    计算机基础与程序设计(基于C语言)学习笔记 前言 这是一个学习笔记 课程导入 在线学习工具:https://c.runoob.com/compile/11 为什么要学习程序设计 (1)存储程序和程序控 ...

  8. USB学习笔记(4)STM32关于USB库的解读

    USB学习笔记(4)STM32关于USB库的解读 为了方便在STM32上实现USB功能,本文对USB库的文件进行解读. USB-FS_Device peripheral interface(外围接口) ...

  9. USB学习笔记(5)STM32 USB库移植步骤

    USB学习笔记(5)STM32 USB库移植步骤 本文是将官网的USB驱动库文件移植到自己的工程里面,实现USB功能的具体移植步骤说明,实现Custom_HID功能. 1.先准备一个工程模板 获取工程 ...

最新文章

  1. Android WebView与ViewPager的滑动冲突分析
  2. 50k大牛告诉你Python怎么学,10个特性带你快速了解python
  3. JavaME程序 Run Anywhere-- 利用反射机制来动态加载声
  4. 支付宝 .NET SDK 报错:RSA签名遭遇异常,请检查私钥格式是否正确。
  5. ASP.NET MVC 的多国语系支持
  6. 数据可视化最容易被人忽略的四大误区,怪不得我的报告总被老板骂
  7. Sql Server临时表获取链接数据库查询结果
  8. 为什么jvm要分为堆、方法区等?原理是什么?_「JVM」知识点详解一:JVM运行原理详解...
  9. Widget Factory
  10. 使用vcpkg安装指定版本的开源软件
  11. 003:枚举算法(习题)
  12. 在线hash密码破解网站列表
  13. html的blockquote标签,html blockquote标签怎么用
  14. 一个选手和小丫姐的搞笑对话
  15. 道家王凤仪《五行语录》
  16. 胜利大逃亡 --- bfs记录
  17. 使用软碟通(UltraISO)刻录Linux系统
  18. 软件需求工程(第二章)
  19. Gee引擎配置微端后登录游戏黑屏怎么办?
  20. 已创建了一个包含学生学号、身高、性别的学生身高信息表并输出到屏幕,学生信息从records.txt文件读取。 编写一个函数 void reverse(Seqlist *lp); 功能是对已建立的学生身

热门文章

  1. 软件发明专利实例_计算机软件发明专利技术经验交底资料范例
  2. Windows XP系统下架设FTP服务器实例详解
  3. [Flash][AS3]常用功能封装
  4. 2010.02.23——google map api----五岳剑派 拖拽的标注
  5. 操盘技巧学习笔记——证券交易中篇完结
  6. python实现2048小游戏_python—手把手教你实现2048小游戏
  7. ruby 程序员修炼之道_面向系统管理员的Ruby
  8. 【MAVEN依赖冲突如何解决】
  9. 投射投影过程数学推导
  10. REST风格及RESTful入门