STM32 USB-HID通信移植步骤

在RK平台上利用gadget去模拟一个HID触摸屏驱动 利用gadget去模拟一个触摸屏HID驱动 阅读详情
如有转载请注明来自http://blog.youkuaiyun.com/cy757

大家可以使用压缩包中的UsbApp.exe调试本软件idVendor为:0483 idProduct为5750。

今天太晚了,明天还要上半天班,上位机软件找个时间在写一篇文章。请关注我的博客。压缩包中附带了几个编译软件典型的上位机源代码,大家可以参考下。

本文中源程序的下载网址为:http://download.youkuaiyun.com/source/2918553






很久没写过文章了,趁今晚有空出来露一下。最近发现很多人对STM32的USB通信很感兴趣。要将USB的通信协议搞懂确实是一个比较漫长的过程。但是USB的HID通信无论是上位机的设计还是STM32程序的编程都非常的简单。只是我想很多人都不知道而已。这篇文章的目的是让大家以最短的时间将USB加到你的设备中。如果想学得更深就靠大家。



HID只是适合低速传输,其理论上可以达到64KB/S,但多由于windows系统和硬件的关系一般达不到这个传输数度。但这个速度对于一般系统的控制和数据传输都已经足够了,而且是免驱,省去了很多麻烦。如果您需要高速传输可参考我的另外一篇文章《STM32的USB例程修改步骤》文章在http://blog.youkuaiyun.com/cy757/archive/2010/01/01/5117610.aspx



一、安装完MDK后请打开C:/Keil/ARM/Examples/ST/STM32F10xUSBLib/Demos路径,将Custom_HID在同一个目录下复制一份,如果你要放到其他路径你需要在MDK Options for target的C/C++中添加USB的头文件路径(MDK下的/INC/ST/STM32F10x/USB)。

二、打开usb_desc.c文件,该文件主要包含的端点描述符、设备描述符、配置描述符和字符描述符等。具体请大家参考其他资料了,这里主要说几个常用。







u8 DeviceDescriptor[SIZ_DEVICE_DESC]为USB设备描述符。当中的

0x83, /*idVendor (0x0483)*/

0x04,

0x50, /*idProduct = 0x5750*/

0x57,

//idVender字段。厂商ID号,我们这里取0x0483,仅供实验用。

//实际产品不能随便使用厂商ID号,必须跟USB协会申请厂商ID号。

//注意小端模式,低字节在先。

//idProduct字段。产品ID号,我们这里取0x5750。

//注意小端模式,低字节应该在前。







const u8 ConfigDescriptor[SIZ_CONFIG_DESC]是配置描述符,注意如下

USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */



0x81, /* bEndpointAddress: Endpoint Address (IN) */

0x03, /* bmAttributes: Interrupt endpoint */

0x02, /* wMaxPacketSize: 2 Bytes max */

0x00,

0x20, /* bInterval: Polling Interval (32 ms) */

/* 34 */



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

USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */

/* Endpoint descriptor type */

0x01, /* bEndpointAddress: */

/* Endpoint Address (OUT) */

0x03, /* bmAttributes: Interrupt endpoint */

0x02, /* wMaxPacketSize: 2 Bytes max */

0x00,

0x20, /* bInterval: Polling Interval (20 ms) */



上面包含了“输入端点描述符”和“输出端点描述符”。

//wMaxPacketSize字段。该端点的最大包长。

//bInterval字段。端点查询的时间,



为了实现更高速的通信我们修改如下:

/******************** Descriptor of 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, /*bInterval: Polling Interval (10 ms)*/

/* 34 */

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

/* 27 */

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, /*bInterval: Polling Interval (10 ms)*/







const u8 ReportDescriptor[SIZ_REPORT_DESC]为HID专用的报告描述符,具体的大家就参考资料了,这里可以直接复制了。

const u8 CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] =

{

0x05, 0xFF, // USAGE_PAGE(User define)

0x09, 0xFF, // USAGE(User define)

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

0x05, 0x01, // USAGE_PAGE(1)

0x19, 0x00, // USAGE_MINIMUM(0)

0x29, 0xFF, // USAGE_MAXIMUM(255)

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

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

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

0x95, 0x40, // REPORT_COUNT (64)

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

0x05, 0x02, // USAGE_PAGE(2)

0x19, 0x00, // USAGE_MINIMUM (0)

0x29, 0xFF, // USAGE_MAXIMUM (255)

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

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

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

0x75, 0x40, // REPORT_SIZE (64)

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

0xc0 // END_COLLECTION

}; /* ReportDescriptor */



const u8 CustomHID_StringVendor[CUSTOMHID_SIZ_STRING_VENDOR]

const u8 StringProduct[SIZ_STRING_PRODUCT]

const u8 StringSerial[SIZ_STRING_SERIAL]

分别是“厂商字符”、“产品字符”、“产品序列号”,这些将在USB HID设备加载的时候显示。但是这需要这些字符要求为Unicode编码,你需要将你要显示的字符先转为Unicode编码。你可以到http://computer00.21ic.org/user1/2198/archives/2007/42769.html转换。最好大家还要根据各个数组的长度修改如下定义。



#define CUSTOMHID_SIZ_REPORT_DESC 39

#define CUSTOMHID_SIZ_STRING_VENDOR 64

#define CUSTOMHID_SIZ_STRING_PRODUCT 28

#define CUSTOMHID_SIZ_STRING_SERIAL 26







三、打开hw_config.c文件,将那些没有的函数删除,只保留如下函数

a) Set_System(void)

b) void Set_USBClock(void)

c) void USB_Interrupts_Config(void)

d) void USB_Cable_Config (FunctionalState NewState)

特别要注意最后一个函数,其主要作用是控制USB的上拉电阻,让电脑检测USB设备是否连接的。



四、打开stm32f10x_it.c文件,把EXTI15_10_IRQHandler等中断内的代码删除。

打开usb_prop.c文件,修改如下:

void CustomHID_Reset(void)

{

/* Set Joystick_DEVICE as not configured */

pInformation->Current_Configuration = 0;

pInformation->Current_Interface = 0;/*the default Interface*/

SetBTABLE(BTABLE_ADDRESS);



/* Initialize Endpoint 0 */

SetEPType(ENDP0, EP_CONTROL);

SetEPTxStatus(ENDP0, EP_TX_STALL);

SetEPRxAddr(ENDP0, ENDP0_RXADDR);

SetEPTxAddr(ENDP0, ENDP0_TXADDR);

Clear_Status_Out(ENDP0);

SetEPRxCount(ENDP0, Device_Property.MaxPacketSize);

SetEPRxValid(ENDP0);



/* Initialize Endpoint 1 */

SetEPType(ENDP1, EP_INTERRUPT);

SetEPTxAddr(ENDP1, ENDP1_TXADDR);

SetEPTxCount(ENDP1, 64);

SetEPRxStatus(ENDP1, EP_RX_DIS);

SetEPTxStatus(ENDP1, EP_TX_NAK);



/* Initialize Endpoint 1 */

// SetEPType(ENDP1, EP_INTERRUPT);

SetEPRxAddr(ENDP1, ENDP1_RXADDR);

SetEPRxCount(ENDP1, 64);

// SetEPTxStatus(ENDP1, EP_TX_DIS);

SetEPRxStatus(ENDP1, EP_RX_VALID);

/* Set this device to response on default address */

SetDeviceAddress(0);

}

五、usb_endp.c文件



void EP1_OUT_Callback(void)

{

这些写接收代码

}





六、数据发送和接收,举例说明

1、数据接收

u8 DataLen;

DataLen = GetEPRxCount(ENDP1);

PMAToUserBufferCopy(TX1_buffer, ENDP1_RXADDR, DataLen);

SetEPRxValid(ENDP1);

USART1_Send(DataLen);

count_out = 1;





2、数据发送



UserToPMABufferCopy(InBuffer, GetEPTxAddr(ENDP1), 64);

SetEPTxCount(ENDP1, 64);

SetEPTxValid(ENDP1);



如果你发送数据较为频繁,每次发送前应使用GetEPTxStatus(ENDP1)检测上次发送是否完成。如果端点状态处于EP_TX_VALID,说明发送未结束,如果端点状态处于EP_TX_NAK,说明发送结束。
stm32 标准库移植usb usb虚拟串口 usb cdc usb转串口 保姆级记录贴 移植一遍后后续便全部抛之脑后,所以写这片文章进行记录,以备下次移植时进行参考,同时也供有需要的人参考usb设备分为多种,虚拟串口是属于cdc,(具体其他很多,还没学习到)硬件:原子哥探索者开发板软件:标准库完成了stm32f4系列的usb虚拟串口的移植,但仅仅是会了皮毛,usb还有很多的知识没有设计,欢迎各位指点仅作为移植记录,供后续使用,码字。累。。。 阅读详情

相关推荐

STM32 USB串口通信实例

在使用USB功能前,需要在STM32CubeMX中进行USB功能的配置,包括使能USB功能、选择USB外设类型(例如USB OTG FS或USB OTG HS)等。配置好USB功能后,通过STM32CubeMX生成初始化代码,并在工程中包含USB相关的驱动文件,如`usbd_cdc.h`、`usbd_cdc_if.h`等。通过以上代码,可以实现对USB外设的初始化配置,使其准备好接收和发送串口数据。通过以上代码,可以实现向计算机发送数据,并通过串口调试软件查看接收到的数据。

weixin_66608063的博客 3650

Linux Android USB gadget设备配置

转载请标明出处:https://blog.youkuaiyun.com/u013752202/article/details/96503874 Android在linux usb gadget的基础上,做了一次升级。linux usb gadget的配置是系统启动后立即生效的,所以一个固件只能选择一种类型的gadget,比如hid/webcam/acm等。但Android版本的是在系统起来后,由应用程序决定...

技术改变生活,创新让世界更美 2409

国产单片机替代-CH32替代STM32

(请保留-> 作者: 罗冰 https://blog.youkuaiyun.com/luobing4365) 国产单片机替代-CH32替代STM321 固件下载2 代码编写2.1 STM32的USB-FS Device Library2.2 代码移植和修改2.2.1 usb_desc.c代码修改2.2.2 usb_prop.c代码修改2.2.3 usb_endp.c代码修改3 测试 随着芯片价格疯涨,项目的不可控性越来越大。特别是价格方面,达到了无法想象的地步了。 以之前《UEFI编程实践》所用的YIE0

6621

【STM32 + CubeMX】 USB 虚拟串口通信

通过CubeMX + Keil,配置STM32作为USB设备端,与电脑进行通信(CDC); 通用带USB功能的 STM32 芯片 (如F1、F4等,系统时钟配置不同,代码通用)。

qq_49053936的博客 4万+

stm32 usb hid 移植时出现的问题及解决办法(记录)

由于项目需要,使用了stm32f107的芯片,移植了STM32_USB-Host-Device_Lib_V2.2.0 官方usb固件库,在UCOSII上运行,刚开始使用的是STM32_USB-FS-Device_Lib_V2.3.0的库,这个库网上资源较多,但是在使用的时候发现这个库和UCOSII的延时函数有冲突,导致ucos操作系统不能正常运行,经过调试没有发现原因,调试期间在st官网找到了最新...

fj18782760035的博客 4936

CH32F103替代STM32F103实战:手把手移植USB HID代码(附完整工程)

本文详细记录了将成熟的STM32F103 USB HID设备代码移植到国产单片机CH32F103C8T6的完整实战过程。文章深度剖析了核心差异点,如端点0最大包长度等关键寄存器配置,并提供了从环境搭建、代码移植到调试排错的三步修改法,旨在帮助开发者掌握芯片替代场景下的通用移植方法论,实现从STM32到CH32的无缝迁移。

rice5的博客 983

STM32 USB-HID通信移植步骤STM32 USB HID键盘例程

STM32 USB-HID通信移植步骤STM32 USB HID键盘例程 STM32 USB HID键盘例程 最全USB HID开发资料,悉心整理一个月,亲自测试 通过STM32CUbeMX建立USB HID的双向通讯实验成功 发现很多人对STM32的USB通信很感兴趣。要将USB的通信协议搞懂确实是一个比较漫长的过程。但是USB的HID通信无论是上位机的设计还是STM32程序的编程都非常的简单。只是我想很多人都不知道而已。这篇文章的目的是让大家以最短的时间将USB加到你的设备中。如果想学得更深就靠大家。

weixin_38728453的博客 1682

5步搞定ABB机器人RobotStudio与S7-1500PLC的Profinet通讯(附PLCSIM调试技巧)

本文详细介绍了如何利用RobotStudio与TIA Portal软件,结合PLCSIM Advanced仿真器,在零硬件条件下实现ABB机器人与西门子S7-1500 PLC之间的Profinet通讯虚拟调试。通过五个核心步骤,从环境搭建、网络配置、信号映射到联合仿真与高级调试,帮助工程师在项目前期高效验证逻辑、压缩现场调试周期,并掌握实用的PLCSIM调试技巧。

weixin_29188043的博客 505

移植STM32固件库用于HID双向通信

移植STM32固件库用于HID双向通信 #原文地址: http://blog.youkuaiyun.com/a827415225/article/details/51745013 USB的应用中HID类是比较常见的方式。通过修改STM32 USB固件库V4.0的JOYSTICK应用,我们实现一个双向USB通信。 一、移植 使用STM32源程序为点亮LED灯程序。 首先将USB

madrabbit1987的博客 1377

STM32F407 FSMC并口读取AD7606

先贴一下最终效果图.这个是AD7606并口读取数据一个周期后的数据结果. 原始波形用示波器看是很平滑的. AD7606不知为何就会出现干扰, 我猜测可能是数字信号干扰导致的. 因为干扰的波形很有规律. 这种现象基本上可以排除是程序问题. 应该是干扰或者数字信号干扰,或者是数字和模拟共地导致的.是一个宏,实际上是指向的一个内存地址, 这个内存地址是FSMC指定的地址. 使用FSMC接口, 可免于控制引脚, 直接读取某个地址即可, FSMC会自动产生操作时序. 具体请见FSMC相关知识.

走错路的程序员 5496

【同花顺公式编辑教程】第3章 获取数据

学习同花顺公式编辑器,其提供的数据有量价数据以及财务数据。在本章中,我们讲解了编辑器执行代码的原理,并给出了可调用数据的汇总表。

LiaoYi2016218的博客 1万+

STM32F405 USB HID软硬件参考设计

分享一款自己设计的STM32F405 USB HID小板,按照规定的外形尺寸,制作硬件成品,并调通USB HID通信,上位机能与板子就行USB双向通信,软硬件资料全部开源。

DongFengYongHeng的博客 3862

23.501中英对照(46):5QI到Qos特征的映射

注4:对于UPF终止N6与5G-AN之间的延迟,CN PDB的静态值为1毫秒,应从给定的PDB中减去该值以得出适用于无线接口的分组延迟预算。注5:对于UPF终止N6与5G-AN之间的延迟,CN PDB的静态值为2毫秒,应从给定的PDB中减去该值以得出适用于无线接口的分组延迟预算。注6:对于UPF终止N6与5G-AN之间的延迟,CN PDB的静态值为5毫秒,应从给定的PDB中减去该值以得出适用于无线接口的分组延迟预算。注:建议为任何新的非GBR资源类型的标准化5QI分配小于64的值。

51学通信的博客 1294
上一篇: STM32的USB例程JoyStickMouse代码分析
下一篇: STM32的USB例程修改步骤
獠
獠
博客等级 码龄16年 43粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值