打印

一个STM32F10XX些列USB hid 和PC双向通信的例子

[复制链接]
8627|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
peterwei2010|  楼主 | 2010-6-27 14:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 peterwei2010 于 2010-6-27 14:28 编辑

STM32 USB HID开发实例,实现USB双向通信。
    在STM32 ARM平台上实现USB与PC端得通信(IC为STM32F10XX系列)。本文提供一个例程(已测试通过),不用了解任何USB协议(当然了解USB相关协议或描述表的意义是很必要的),在此例程上,稍作修改,即可开展你的项目或学习或进行产品开发。 在ST中我们可以获得了USB相关的一个HID例程,但是官方例子中只是用到2个端点。数据只收不发。
     本例程中,用到了3个USB端点,实现PC上位机与下位机见双向通信。EP0为控制端点(必须的,这是因为系统默认端点0作为控制传输端点),EP1为INTERRUPT OUT端点(数据输出端,即PC向MCU发送数据段),EP2为INTERRUPT OUT端点(数据输入端,即MCU向PC发送数据)。
     实现过程,我们需要修改一下HID的描述表,修改如下(有详细注释) /* USB
/* USB Configuration Descriptor */

/*
All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */

const u8 CustomHID_ConfigDescriptor[CUSTOMHID_SIZ_CONFIG_DESC] =


{


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



USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */


CUSTOMHID_SIZ_CONFIG_DESC,


/* wTotalLength: Bytes returned */


0x00,


0x01,
/* bNumInterfaces: 1 interface */


0x01,
/* bConfigurationValue: Configuration value */


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


the configuration*/


0xC0,
/* bmAttributes: Bus powered */


/*Bus powered: 7th bit, Self Powered: 6th bit, Remote wakeup: 5th bit, reserved: 4..0 bits */


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

//
0x96,
/* MaxPower 300 mA: this current is used for detecting Vbus */


/************** Descriptor of Custom HID interface ****************/


/* 09 */


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 Custom HID HID ********************/


/* 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 */


0x22,

/* bDescriptorType */


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


0x00,


/******************** Descriptor of Custom HID endpoints ******************/


/* 27 */


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


USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */



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


// bit 3...0 : the endpoint number


// bit 6...4 : reserved



// bit 7
: 0(OUT), 1(IN)


0x03,
/* bmAttributes: Interrupt endpoint */


0x40,//0x02,
/* wMaxPacketSize: 20 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 */


0x40,//0x02,
/* wMaxPacketSize: 20 Bytes max
*/


0x00,


0x10,
/* bInterval: Polling Interval (16 ms) */


/* 41 */


}; /* CustomHID_ConfigDescriptor */

    关于如何理解HID 描述表,请参考USB HID协议1.1版本,相关资料可以在网络上搜索得到。 在此,现提供KEIL MDK 和 IAR EWARM 5.4版本的例子,欢迎下载。萝卜青菜,喜欢用MDK,就MDK,喜欢EWARM,就EWARM。同样这里有见有意思的事,在全编译的情况下,EWARM要比MDK编译速度要快一些。 相关测试结果如下: 通过呀呀USB_hid 或Bus Hound相关工具,先发一包数据给下位机,这样下位机每隔1s会发送一包数据。结果如图:
附件有相关的KEIL和IAR的源码工程包,直接编译即可
地址: http://blog.**/itspy

沙发
hotpower| | 2010-6-27 14:53 | 只看该作者
学习学习~~~

使用特权

评论回复
板凳
tttg| | 2013-3-31 11:41 | 只看该作者
jljljkl ioujiouioujioujioj

使用特权

评论回复
地板
cjhk| | 2013-3-31 20:22 | 只看该作者
学习学习  呵呵   技术帖子  需要好好顶一个   呵呵   顶起来  不错哦

使用特权

评论回复
5
小番茄| | 2013-5-8 17:36 | 只看该作者
我也贴一个吧
const u8 CustomHID_ConfigDescriptor[CUSTOMHID_SIZ_CONFIG_DESC] =
{
/************************  配置描述符 *************************/
          /* 00 */
    0x09,         /* 配置描述符的字节数大小 */
    USB_CONFIGURATION_DESCRIPTOR_TYPE, /* 配置描述符类型编号,0x02 */
    CUSTOMHID_SIZ_CONFIG_DESC,         /* 此配置返回的所有数据大小 ,41*/
    0x00,
    0x01,         /* 此配置所支持的接口数量 */
    0x01,         /* Set_Configuration命令所需要的参数值 */
    0x00,         /* 描述该配置的字符串的索引值*/
    0xC0,         /* C0对应的二进制位11000000 Bit7为1是必须的,Bit6为1表示为设备自供电,为0表示总线供电 ,Bit5为1表示支持远程唤醒 为0表示不支持 其余位为0*/
    0x32,         /* 设备从总线提取的最大电流 2mA*0x32=100mA */

/************************ 接口描述符 **************************/
    /* 09 */
    0x09,         /* 接口描述符的字节数大小 */
    USB_INTERFACE_DESCRIPTOR_TYPE,/* 接口描述符的类型编号,0x04 */
    0x00,         /* 该接口的编号*/
    0x00,         /* 备用的接口描述符编号*/
    0x02,         /* 该接口使用的端点数,不包括端点0 */
    0x03,         /* 接口类型: HID */
    0x00,         /* 接口子类型 : 1=BOOT, 0=no boot */
    0x00,         /* 接口遵循的协议 : 0=none, 1=keyboard, 2=mouse */
    0x00,         /* 描述该接口的字符串索引值 */
               
/********************** 类描述符(HID类)*********************/
    /* 18 */
    0x09,         /* HID描述符的字节数大小 */
    HID_DESCRIPTOR_TYPE, /* 描述符类型: HID */
    0x10,         /* 使用的HID协议1.10 */
    0x01,
    0x00,         /* 设备适用的国家 */
    0x01,         /* 下级描述符的数量 至少为1,报告描述符或者物理描述符 */
    0x22,         /* 下级描述符的类型 0x22报告描述符 0x23物理描述符 */
    CUSTOMHID_SIZ_REPORT_DESC,/* 下级描述符的长度 0x0033*/
    0x00,
               
/************************ 端点描述符 **************************/
    /* 27 */
    0x07,          /* 端点描述符的长度 */
    USB_ENDPOINT_DESCRIPTOR_TYPE, /* 端点描述符类型 */
    0x82,          /* 10000010  Bit7表示传输方向 1为输入;
                          Bit6~Bit4 保留;                       
                                          Bit3~Bit0为端点号 端点号为02 */
    0x03,          /* 端点的属性 D1~D0表示端点的传输类型 11表示为中断传输;
              10批量传输;01等时传输;00控制传输;非等时传输D7~D2为0 */
    0x40,          /* 支持最大的包长度 0x0040*/
    0x00,
    0x20,          /*轮询间隔 (32 ms) */

/************************ 端点描述符 **************************/
                /* 34 */
    0x07,                 /* 端点描述符的长度 */
    USB_ENDPOINT_DESCRIPTOR_TYPE,        /* 描述符类型:端点描述符 */
    0x01,                  /* 00000001  Bit7表示传输方向 0为输出;
                               Bit6~Bit4 保留;
                                               Bit3~Bit0为端点号 端点号为01 */
    0x03,                 /* 端点属性: 中断端点 */
    0x40,                 /* 最大包大小,这里是0x40  */
    0x00,
    0x10,                 /*轮询间隔 (20 ms) */
    /* 41 */
}; /* CustomHID_ConfigDescriptor 配置描述符*/

使用特权

评论回复
6
can123dao| | 2013-6-29 17:43 | 只看该作者
楼主,能不能改一个PC通过USB亮LED(GPIOF.6),按KEY(GPIOA.0)返回一个数据。上位机和下位的的码都要

使用特权

评论回复
7
can123dao| | 2013-6-29 19:37 | 只看该作者
小番茄 发表于 2013-5-8 17:36
我也贴一个吧
const u8 CustomHID_ConfigDescriptor[CUSTOMHID_SIZ_CONFIG_DESC] =
{

能不能改一个PC通过USB亮LED(GPIOF.6),按KEY(GPIOA.0)返回一个数据。上位机和下位的的码都要。
就当我是什么都不懂的家伙,能给个说明最好了

使用特权

评论回复
8
Zacking| | 2015-3-4 10:36 | 只看该作者
来学习学习

使用特权

评论回复
9
qinhuan7| | 2015-7-14 23:03 | 只看该作者
附件在哪里?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

50

帖子

1

粉丝