基于STM32F103的USB学习笔记27 - CustomHID
基于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相关推荐
- 基于STM32F103的USB学习笔记4 - 初始化
1. IO初始化 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); GPIO_InitSt ...
- 基于STM32F103的USB学习笔记35 - Mass Storage之SCSI命令
参考文档:UFI Command Specification.SCSI Reference Guide CBW包中CB部分(0FH-1EH)的第一个字节是操作码,对于Mass Storage来说,使用 ...
- 基于STM32F103的USB学习笔记38 - Mass Storage之SPI Flash做U盘
1. 将整个Flash作为U盘的空间 Flash大小为4MB,SPI NorFlash的Sector大小为4KB,所以MSC_MEMORY_BLOCK_SIZE设置为4096.. 3个函数的实现如下, ...
- USB学习笔记(2)USB协议
USB学习笔记(2)USB协议 本文对前面提到的USB枚举过程中的标准请求以及各种描述符做出大致解释,方便后面的实操. 1. USB标准请求 USB协议定义了一个8字节的标准设备请求,主要用在设备的枚 ...
- 统计学习导论 - 基于R的应用 学习笔记1
统计学习导论 - 基于R的应用 学习笔记 Chapter 1 导论 统计学习是什么: 关于估计ƒ的一系列方法 Y=f(x)+ξ f:X 提供给 Y 的系统信息,是 x 的函数 ξ:随机误差项:均值为0 ...
- USB学习笔记(3)HID应用分析
USB学习笔记(3)HID应用分析 本文根据前面对USB系统的了解,和USB协议的学习,列出鼠标,键盘,多媒体控制器,自定义HID设备等HID设备的各种描述符. 前景提要:每个设备有且仅有一个设备描述 ...
- 计算机基础与程序设计(基于C语言)学习笔记
计算机基础与程序设计(基于C语言)学习笔记 前言 这是一个学习笔记 课程导入 在线学习工具:https://c.runoob.com/compile/11 为什么要学习程序设计 (1)存储程序和程序控 ...
- USB学习笔记(4)STM32关于USB库的解读
USB学习笔记(4)STM32关于USB库的解读 为了方便在STM32上实现USB功能,本文对USB库的文件进行解读. USB-FS_Device peripheral interface(外围接口) ...
- USB学习笔记(5)STM32 USB库移植步骤
USB学习笔记(5)STM32 USB库移植步骤 本文是将官网的USB驱动库文件移植到自己的工程里面,实现USB功能的具体移植步骤说明,实现Custom_HID功能. 1.先准备一个工程模板 获取工程 ...
最新文章
- Android WebView与ViewPager的滑动冲突分析
- 50k大牛告诉你Python怎么学,10个特性带你快速了解python
- JavaME程序 Run Anywhere-- 利用反射机制来动态加载声
- 支付宝 .NET SDK 报错:RSA签名遭遇异常,请检查私钥格式是否正确。
- ASP.NET MVC 的多国语系支持
- 数据可视化最容易被人忽略的四大误区,怪不得我的报告总被老板骂
- Sql Server临时表获取链接数据库查询结果
- 为什么jvm要分为堆、方法区等?原理是什么?_「JVM」知识点详解一:JVM运行原理详解...
- Widget Factory
- 使用vcpkg安装指定版本的开源软件
- 003:枚举算法(习题)
- 在线hash密码破解网站列表
- html的blockquote标签,html blockquote标签怎么用
- 一个选手和小丫姐的搞笑对话
- 道家王凤仪《五行语录》
- 胜利大逃亡 --- bfs记录
- 使用软碟通(UltraISO)刻录Linux系统
- 软件需求工程(第二章)
- Gee引擎配置微端后登录游戏黑屏怎么办?
- 已创建了一个包含学生学号、身高、性别的学生身高信息表并输出到屏幕,学生信息从records.txt文件读取。 编写一个函数 void reverse(Seqlist *lp); 功能是对已建立的学生身
热门文章
- 软件发明专利实例_计算机软件发明专利技术经验交底资料范例
- Windows XP系统下架设FTP服务器实例详解
- [Flash][AS3]常用功能封装
- 2010.02.23——google map api----五岳剑派 拖拽的标注
- 操盘技巧学习笔记——证券交易中篇完结
- python实现2048小游戏_python—手把手教你实现2048小游戏
- ruby 程序员修炼之道_面向系统管理员的Ruby
- 【MAVEN依赖冲突如何解决】
- 投射投影过程数学推导
- REST风格及RESTful入门