你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 USB HID开发实例,实现USB双向通信!

[复制链接]
中国-大鱼儿 发布时间:2011-4-16 14:45
STM32 USB HID开发实例,实现USB双向通信。 5 e) a0 B2 [$ u) {2 L

1 `8 I4 |( K+ S: L* [: t6 _在STM32 ARM平台上实现USB与PC端得通信(IC为STM32F10XX系列)。本文提供一个例程(已测试通过),不用了解任何USB协议(当然了解USB相关协议或描述表的意义是很必要的),在此例程上,稍作修改,即可开展你的项目或学习或进行产品开发。
) J. h1 P% v) o6 E' F" v8 j- {; K" f0 j3 B
在ST中我们可以获得了USB相关的一个HID例程,但是官方例子中只是用到2个端点。数据只收不发。   c) Q' v8 ]3 ?2 T- {6 r

4 L: C7 t8 p3 e4 ?本例程中,用到了3个USB端点,实现PC上位机与下位机见双向通信。EP0为控制端点(必须的,这是因为系统默认端点0作为控制传输端点),EP1为INTERRUPT OUT端点(数据输出端,即PC向MCU发送数据段),EP2为INTERRUPT OUT端点(数据输入端,即MCU向PC发送数据)。
2 {1 i. K; ^2 F  z# q8 n( m! j9 O% i+ x! F0 o4 \
实现过程,我们需要修改一下HID的描述表,修改如下(有详细注释)
0 v7 d, l% x8 J, _3 q3 a3 \: A  v/ l5 D. y
/* USB Configuration Descriptor */ * i, y* n5 Z' b6 H: ^& t

4 [/ I( u) @( Z( R& K/*   All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */
+ o' U# b  h' ^! y! b; Q# T2 @$ U! _. A  @' C
const u8 CustomHID_ConfigDescriptor[CUSTOMHID_SIZ_CONFIG_DESC] = 2 \5 H& q6 X  t. k- ^$ E5 ?

! A0 `# w/ o' e+ }6 O4 Q  {
4 I: F9 U9 p) u" B5 ]8 ?2 ~
- l5 S8 }% l; x9 U  _# @; \0 U3 L    0x09, /* bLength: Configuation Descriptor size */
1 i% E4 I5 x# r% v" c; l6 i+ C1 z3 ^7 f* ^  T* p
    USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */ 7 E! R& [* D+ w# V0 w) j

) `9 B4 k- s; ?9 T5 |$ b) D6 r) b    CUSTOMHID_SIZ_CONFIG_DESC, & q' U- `; t5 G# {+ d) x, v

8 X: c" P$ i; ?2 V* t, i# r! E- O9 R% G    /* wTotalLength: Bytes returned */
9 F6 D8 a! j/ d" T/ B1 n2 D
( Z! M) |& w+ e. h( }    0x00,
1 t6 \; \* l3 n" ~7 p2 G( e, [. u: `( @: Z
    0x01,         /* bNumInterfaces: 1 interface */
: j5 X8 V+ F- M$ }# p. [9 T
# z& j; U+ Z* h) v2 V    0x01,         /* bConfigurationValue: Configuration value */ ) h: [; Q, x; ?/ B8 P

; E. f" B/ D3 m8 \* R' X8 ~4 f    0x00,         /* iConfiguration: Index of string descriptor describing ) A/ ]! P# u; q% ]4 d* G/ L5 C

% ]' J- J1 \# [8 O/ _( R                                 the configuration*/ 8 P  `5 K* s+ c* U- A6 ]. O

. T: i0 m( ~& I" }( T    0xC0,         /* bmAttributes: Bus powered */ ( P/ d7 G4 S* m7 X" M+ j* D% ~) I: a
! q! p0 M0 a& z- l0 d: }& q3 u
                  /*Bus powered: 7th bit, Self Powered: 6th bit, Remote wakeup: 5th bit, reserved: 4..0 bits */ + G5 o& G1 l, j  r: Z7 _3 G

, }, g0 B" R" y( c9 J    0x32,         /* MaxPower 100 mA: this current is used for detecting Vbus */
( r4 p6 k* g! z  ?* b4 I# Q1 h; t4 g  r3 P
//    0x96,         /* MaxPower 300 mA: this current is used for detecting Vbus */
+ y! e* Y& c# q8 _9 ]1 `
/ ?( I; y) T5 Y) `3 m; ~7 S( P  t    /************** Descriptor of Custom HID interface ****************/ + D8 Z3 ?6 ^" G( a& r$ q: F# q

; g% k+ V5 N/ ^2 A    /* 09 */ 1 ~) j* O2 o  I5 e: K: Q8 C

/ }5 i4 m4 {; d$ {    0x09,         /* bLength: Interface Descriptor size */ " t" o& V) U' a0 t; k. Z" z$ e2 Q
/ Y3 Q4 k* V. S! u, I8 X: R0 D8 {
    USB_INTERFACE_DESCRIPTOR_TYPE,/* bDescriptorType: Interface descriptor type */   M2 @9 u/ x! [( o' `  Q. a" |4 Y
: W3 u3 `* K' s5 }% M1 ~2 ~
    0x00,         /* bInterfaceNumber: Number of Interface */   B! ^: j8 V( m) y" G' ?/ G

2 y$ h$ M; J" Q    0x00,         /* bAlternateSetting: Alternate setting */
% f: ~/ m0 P% W! z8 [
4 b& e0 W+ }) N6 k+ c6 s. a$ N    0x02,         /* bNumEndpoints */ 7 k" w2 I# a* @, E& f5 M$ I+ M

3 R9 R, {" T9 [' C    0x03,         /* bInterfaceClass: HID */ " Q/ P, t/ n- o  Q& k* G2 f
  T2 Z) V2 D  ?& l/ V7 W
    0x00,         /* bInterfaceSubClass : 1=BOOT, 0=no boot */
- U4 O" D7 N4 x6 Q. P2 x
. X  Y2 g* K: s9 C! u' B' {    0x00,         /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */
7 X+ B* N( S- ^" V
. c" f& Q$ c. n) Q+ K  [# b/ K    0,            /* iInterface: Index of string descriptor */
4 B% w/ ~+ ^% H5 Z4 @/ a$ [' _' F3 `9 E- Z) [2 M3 m! F3 V/ X0 q: Y
    /******************** Descriptor of Custom HID HID ********************/ 0 h2 Y" D6 D5 X9 _
- E$ v) {; c# J9 ^( L5 {& y: v
    /* 18 */ ( v8 z5 O# P5 L) {1 \5 x$ e

! b; [- [, ^$ K- \    0x09,         /* bLength: HID Descriptor size */ " d$ d  ]: V+ p; k
: R2 Z- h$ x* w& w1 N, P
    HID_DESCRIPTOR_TYPE, /* bDescriptorType: HID */
5 `) t4 ?+ N3 d% I  l
0 p4 `& O) n$ g% w( f    0x10,         /* bcdHID: HID Class Spec release number */
! N$ N8 ~3 w) J/ Y9 W) X# y' W# v6 b9 E" z- ?+ o7 W
    0x01, - R* A* @) z! Q

% Z) _( C9 A" H9 t; R$ F4 l) `    0x00,         /* bCountryCode: Hardware target country */
! N& z, X' ~& \  M1 L7 i/ G9 _% k: M: Q
    0x01,         /* bNumDescriptors: Number of HID class descriptors to follow */
3 W# E" n% S# B+ S+ r& D# X1 l9 J! I5 i( W! O/ V! f
    0x22,         /* bDescriptorType */
+ N' n# q; s" |- l0 O. }; d
1 O' s% P8 l+ w- W- t1 L+ i3 Z    CUSTOMHID_SIZ_REPORT_DESC,/* wItemLength: Total length of Report descriptor */
# R4 ]3 V  {' _7 c* w+ [$ V  M+ |" w# P3 F% a
    0x00, 6 G; y. v+ o9 j
% V2 A6 f0 H+ B) I
    /******************** Descriptor of Custom HID endpoints ******************/
5 h) l. s. S- L# |2 ]& B! e5 }* \& c
    /* 27 */ 3 X1 q/ s) y% i" y+ q/ U; H7 r
4 w% r8 D3 d3 @
    0x07,          /* bLength: Endpoint Descriptor size */ ; T; x8 Q9 H5 ?8 F+ I$ y& O

, [7 b  ]5 m) b3 S    USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */ : d0 l) a- V2 t/ o: e/ U0 r
* b$ |8 G6 c- L4 d$ d& i
  
  S; x; M5 U4 N7 s8 A  Y4 T/ i' W+ w4 K3 y. g- ~7 F% C& h; |
    0x82,          /* bEndpointAddress: Endpoint Address (IN) */               
. E! P! J7 B/ d0 s' P  [# g( ^9 c, k# V. p: A; n8 U' w# S
                   // bit 3...0 : the endpoint number . A# G, }7 K: }! e
# S+ s" m& d: {, _
                   // bit 6...4 : reserved 1 @: p# |# X0 X0 s; o

" M8 }3 a! _6 J) j) e" [                    // bit 7     : 0(OUT), 1(IN)
7 R! i* Z1 Q, a- u( q6 n, m4 I  s* L  _; ?
    0x03,          /* bmAttributes: Interrupt endpoint */
1 `5 y, V2 a; X- [  G
4 V! _$ m  u4 }  @; }    0x40,//0x02,          /* wMaxPacketSize: 20 Bytes max */ ' o; Q4 @! n/ ^# t5 m$ ]

3 d% @0 j: C; j5 T9 n* Q- y    0x00,
8 I0 l/ O# I1 A9 H$ L4 [6 f; `+ ~5 \
; w' V+ Z2 O. Z7 z( O9 p, v" w    0x20,          /* bInterval: Polling Interval (32 ms) */
- p, D( t  B! |! O
/ h" E4 f. Q7 v+ |) {9 n; ]1 ]4 `    /* 34 */   g, s, ]( c" @6 S

8 }: N+ I+ @. r$ j            # j4 F5 P7 Z+ y2 K/ I% x3 U
1 u! I3 C1 ^3 P
    0x07,      /* bLength: Endpoint Descriptor size */ $ a  L/ B  g+ J+ R: H, C6 |; z
- l1 Q5 X( G( ?1 h6 W2 `% _
    USB_ENDPOINT_DESCRIPTOR_TYPE,   /* bDescriptorType: */
* {% C6 @; @) e" j! O9 \9 l3 I( q1 j8 L6 b7 E( J# F
                     /*    Endpoint descriptor type */ : M" V; ^7 \2 ~; {' m5 Z6 Z% o4 r/ a

% B& c. ^- c. ^* n, k7 ]    0x01,      /* bEndpointAddress: */
( ~1 H3 G0 J6 P& I/ e& S6 U( C3 U$ d" u& J
                     /*    Endpoint Address (OUT) */
0 U& F, _5 N8 N" O$ m0 [  f: v5 K) P0 F8 w  P4 z; V( {0 ]- z4 X& s
    0x03,      /* bmAttributes: Interrupt endpoint */
( o& {' J; p2 }* ]2 g4 p: t
2 w3 @" V4 m- e, {5 y4 _4 ]    0x40,//0x02,   /* wMaxPacketSize: 20 Bytes max  */
, B; O% W; i1 D6 p* ~
% @( O# T  q. N% B( W    0x00,
9 w( w7 Y( x) y3 Z# N, D6 E0 n- p3 `' c6 G/ S3 }
    0x10,      /* bInterval: Polling Interval (16 ms) */ + N0 i4 E- T2 u8 e3 E* w0 u+ S
2 |! }: T# {7 M# O" b6 X
    /* 41 */ 7 @( s; W) M: ?5 S1 u6 T7 r
1 H2 g. {3 ~: ~* c8 k9 i
  }; /* CustomHID_ConfigDescriptor */
/ b% j, b/ w0 @; c/ F( n, P
) Y' f2 Y3 X# E0 M' v' E7 b关于如何理解HID 描述表,请参考USB HID协议1.1版本,相关资料可以在网络上搜索得到。 " t) [! P* n& A, U! o2 U
+ C: ]4 ?& f4 p8 y, s3 e# B* q+ I
在此,现提供KEIL MDK 和 IAR EWARM 5.4版本的例子,欢迎下载。萝卜青菜,喜欢用MDK,就MDK,喜欢EWARM,就EWARM。同样这里有见有意思的事,在全编译的情况下,EWARM要比MDK编译速度要快一些。 + e# l5 o+ \- N% b/ c
8 e5 R0 d6 l6 _8 ^( d* d
相关测试结果如下:
: ^+ l7 b( b$ G- ~7 M" B( k7 L
' x7 l8 g: A( D. P/ p0 n通过呀呀USB_hid 或Bus Hound相关工具,先发一包数据给下位机,这样下位机每隔1s会发送一包数据。结果如图: 9 s  F! W0 I6 r. N1 I5 C- W

) U4 }( U! {7 c" n2 U8 I* a! ?呀USB_hid可以在本博客上下载^_^: http://blog.ednchina.com/itspy
/ q- t% T$ E2 `! ~0 ]8 K
4 x- x% F# Y& W% P/ l) q
1 D+ ]6 g; m* w) c7 G$ Q7 \8 t- D测试结果
赞 收藏 3 评论11 发布时间:2011-4-16 14:45

举报

11个回答
轻舟 回答时间:2013-12-7 13:52:13

RE:STM32 USB HID开发实例,实现USB双向通信!

正用得着,下来看看
风云1999~ 回答时间:2014-4-2 16:46:12

回复:STM32 USB HID开发实例,实现USB双向通信!

楼主辛苦,正需要呢。。。。。。。。。
zydwh 回答时间:2014-4-9 19:52:31

RE:STM32 USB HID开发实例,实现USB双向通信!

学习学习学习学习学习
GaoFong 回答时间:2014-10-4 19:41:56

回复:STM32 USB HID开发实例,实现USB双向通信!

确实挺好的,觉得USB是个很好的接口,但STM32的教程中很少提及。
xiaoluo 回答时间:2015-4-30 17:27:38
真在学习USB,LZ,在哪下载?
qiu-368230 回答时间:2015-9-14 13:13:03
哪里下载呢
xujiantj 回答时间:2019-1-23 13:48:39
感谢楼主分享,下载看看
yang000333245 回答时间:2019-10-9 14:45:00
楼主,已经失效了
zhaoyunme0 回答时间:2020-1-4 14:51:33
没地方下载啊3 ?4 u+ s2 i5 k, t  _9 u
jdzczz 回答时间:2020-3-2 11:15:06
需要这个,应该会有用!
斯坦隆平 回答时间:2020-3-23 16:54:02
研究看看

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版