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

【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)

[复制链接]
德华 发布时间:2014-3-31 11:33
设计目的:实现一个可以控制的U盘 USB口选用高速口,MSC选用SD卡(我用的eMMC)( R1 |' M7 ~7 `. W/ E8 S- T
设计思路:选择标准的历程MSC当做基础历程,U盘的功能就实现了,那么怎么做一个HID上去呢,就是修改描述符了,做一个复合设备的描述符,将HID历程的一些必须函数拼接到MSC里面,做好了设备驱动怎么弄呢,我也不会写 ,但是我安装了NI VISA 可以自己生成驱动文件,再用LABVIEW在线编程。
, _. O! c, Z5 l% e2 {- J_ALIGN_BEGIN uint8_t USBD_MSC_CfgDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END =, V6 B7 H6 f2 W. [! F1 C9 Z
{
" C  P2 d* E, M* L: a4 k5 ^6 Y$ q" ^  
! H- J. w, `9 r- h* B4 l  0x09,   /* bLength: Configuation Descriptor size */
; x. b* H$ H# F1 X' r  USB_DESC_TYPE_CONFIGURATION,   /* bDescriptorType: Configuration */
4 S; Y# v  d- C# A3 \0 _7 b  USB_MSC_CONFIG_DESC_SIZ,9 M+ h. S$ f* F6 K+ ^/ A
  - @1 K/ R- l8 ]$ O$ S' F2 J
  0x00,# p8 d: B; Y) \. U- n
  0x02,   /* bNumInterfaces: 1 interface  既然是复合设备就应该有两个端口*/
3 B: b+ c3 x! J7 X5 z) t9 N  0x01,   /* bConfigurationValue: */
" j! p, w- i& k8 X  0x04,   /* iConfiguration: */  G6 h5 L5 G+ N. B5 V/ _# T5 n
  0xC0,   /* bmAttributes: */
0 b* e0 f" f9 {# @8 k, Z  0x64,   /* MaxPower 100 mA */7 r* Z( j3 L% w* a0 L; C6 U
4 n8 Q  j+ U7 D2 x) X1 H1 T
        /************** Descriptor of Joystick Mouse interface ****************/" _$ l: t- m  E$ n
  /* 09 */9 F1 }' Q7 e& ?/ q. {
  0x09,         /*bLength: Interface Descriptor size*/; g$ f5 Q. a# u! G, k# v
  USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/
5 W# D+ y+ G( F0 ]; f  0x00,         /*bInterfaceNumber: Number of Interface*/* q2 ?8 F5 V, \) I
  0x00,         /*bAlternateSetting: Alternate setting*/, |) I4 o5 G  o& f" C5 ?& N
  0x02,         /*bNumEndpoints*/
; B: k, o0 g& s$ g8 J! u) [  0x03,         /*bInterfaceClass: HID*/5 O4 ]; n& _$ ]. ~
  0x00,         /*bInterfaceSubClass : 1=BOOT, 0=no boot*/
0 f- t3 b% \3 a" T) c, i  0x00,         /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/
) n0 T9 \- ~) m! ?( ?, f! I  0,            /*iInterface: Index of string descriptor*/6 u# `# }' X5 O; O" @5 }! W
  /******************** Descriptor of Joystick Mouse HID ********************/+ b$ u* Z. v: x: ~3 @7 K
  /* 18 */) m/ X+ g$ n6 o2 P, C
  0x09,         /*bLength: HID Descriptor size*/
- a0 e; p( p1 {) g, o  HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/- z8 A' u# f: b4 S7 n
  0x11,         /*bcdHID: HID Class Spec release number*/0 |& W9 `) \8 v" O+ u8 d3 i
  0x01,  K: r) C: P1 J
  0x00,         /*bCountryCode: Hardware target country*/
; o( `" s- ~; w6 y! C# g  0x01,         /*bNumDescriptors: Number of HID class descriptors to follow*/
* o' g, a! S* Y& `( |* t  0x22,         /*bDescriptorType*/3 i) D% T3 E! D- n
  33,/*wItemLength: Total length of Report descriptor*/; v: W; I5 ~, w0 m( ]: D# `
  0x00,* n  H/ v+ C5 ?8 F4 l% D7 a
  /******************** Descriptor of Mouse endpoint ********************// w$ x  v4 ?' q: O' f' J
  /* 27 */, f! I* _! W4 ?1 n9 l* h
  0x07,          /*bLength: Endpoint Descriptor size*/* o( Z7 I1 G8 N7 l, [& h9 U8 W1 W) ~- j
  USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/
$ M2 F( D- h8 O- Q9 E+ r4 d  " ?8 E4 Z3 C& C0 I: ^! j
  HID_IN_EP,     /*bEndpointAddress: Endpoint Address (IN)*/( X! g6 w/ g8 ?, e5 {  Z: Y8 k
  0x02,          /*bmAttributes: Interrupt endpoint*/2 C, H# u; I- ~( `# _
  HID_IN_PACKET, /*wMaxPacketSize: 64 Byte max */, q/ O6 C- \3 k# e
  0x00,1 S. }* j6 w% q+ ~  q. h9 ?
  0x0A,          /*bInterval: Polling Interval (10 ms)*/
  a2 a, s% i* e$ t: e& j7 V  /* 34 */
" }2 r1 Y( U  r, D: Y; K  0x07,          /*bLength: Endpoint Descriptor size*/
& u# M2 d$ _) O5 t$ C/ N  USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/% ^# a: n7 X+ R8 y6 G
  
: W: t7 O! N" C, o. l  HID_OUT_EP,     /*bEndpointAddress: Endpoint Address (IN)*/
* n4 y  u6 N& I2 o4 S, x8 C+ a  0x02,          /*bmAttributes: Interrupt endpoint*/: s) J! J/ n0 D  h
  HID_IN_PACKET, /*wMaxPacketSize: 64 Byte max */( v6 m: i& t, T; ?. b8 J5 }: G/ `
  0x00,* X+ g1 }( D3 V9 }( [2 n7 b  o8 e
  0x0A,          /*bInterval: Polling Interval (10 ms)*/0 E& H/ o9 o6 i$ L$ L
  /*41*/
! g. G8 j4 A( K                 /********************  Mass Storage interface ********************/; Q/ @- ~/ c, u6 g+ C! {
  0x09,   /* bLength: Interface Descriptor size */
8 Y9 P9 _8 x0 T" Z  0x04,   /* bDescriptorType: */
% D& ^: Q# Q" s% g2 x1 M6 ?8 L  0x01,   /* bInterfaceNumber: Number of Interface */
. Z$ D& g5 |0 t1 \  0x00,   /* bAlternateSetting: Alternate setting */
2 o' R3 ]0 U+ F$ G+ [  0x02,   /* bNumEndpoints*/
: x3 e. A+ q  W/ j8 {6 F  0x08,   /* bInterfaceClass: MSC Class */
! L6 q* C; |& B) B! T- r1 h1 `: \  0x06,   /* bInterfaceSubClass : SCSI transparent*/
- @' W0 D% @0 i$ P) k" ^  0x50,   /* nInterfaceProtocol */
  J( j8 O7 g$ ?  l8 R- l5 B  0x05,          /* iInterface: */$ {- P2 a6 M9 h3 V* W
  /********************  Mass Storage Endpoints ********************/, S. Z, U7 s7 J2 g3 F1 j
  0x07,   /*Endpoint descriptor length = 7*/. U6 R/ n& a* C! e( ]
  0x05,   /*Endpoint descriptor type */& t& `2 v/ l7 @6 ~# g: v
  MSC_IN_EP,   /*Endpoint address (IN, address 1) */
1 p8 g( }- w1 w) i0 m8 o  M  0x02,   /*Bulk endpoint type */7 W& d' y3 u/ G8 s* G$ @
  LOBYTE(MSC_MAX_PACKET)," a, x6 T, s  l$ t
  HIBYTE(MSC_MAX_PACKET),4 `5 u) F) p/ c) y8 f! y
  0x00,   /*Polling interval in milliseconds */
' Y' X7 y9 }* {7 X+ u" \. ], E  
! G. H' @5 f; r( b' {  M5 i( u  0x07,   /*Endpoint descriptor length = 7 */2 A) U4 o! S; o! z
  0x05,   /*Endpoint descriptor type */
) H" N; }. j6 N  M  MSC_OUT_EP,   /*Endpoint address (OUT, address 1) */, s0 X! _6 n1 A2 s; y# T7 `
  0x02,   /*Bulk endpoint type */
  f( ~# B6 h& N4 ]3 Q  LOBYTE(MSC_MAX_PACKET),) v- Y2 }5 D4 C
  HIBYTE(MSC_MAX_PACKET),
& s4 x7 ~8 {0 _0 p& Z! B  0x00,     /*Polling interval in milliseconds*/
8 Z* U& v( I9 ^. w2 L};' }, q0 @& u! `

- A8 i8 L1 q# e- O( j
- F6 W) Z* ]! w) S/ |/ L7 F, e0 L+ p在usb_conf.h里" E3 ^1 J+ J7 c0 M
#define USBD_CFG_MAX_NUM           11 [! i/ _+ i: X+ S# P
#define USBD_ITF_MAX_NUM           1
' ?" {9 e4 p6 B& j# T: D0 l#define USB_MAX_STR_DESC_SIZ       64 6 Y% P: P5 ~: t+ C; C- m% ~. E/ G
; @# n3 R6 ^# W# k8 b
#define USBD_SELF_POWERED               
" v+ R4 L. Z$ C3 P
  V* o1 w5 m( R+ {" r0 H/ B; D* A/* Class Layer Parameter */
8 n4 x  g, M3 k" r# X % i( |" D) A0 l% b4 d5 }* Z
#define MSC_IN_EP                    0x82    /// 用于U盘
: @7 y" w* v+ G/ s#define MSC_OUT_EP                   0x02    /// 用于U盘
  }! A7 E5 ^& R& @3 C: Z# M* k#ifdef USE_USB_OTG_HS  8 ?0 p3 h8 {( L$ |. Z4 U' s
#ifdef USE_ULPI_PHY- T. h  M+ ^8 ^$ A% l+ d
#define MSC_MAX_PACKET               5128 P- O9 d7 b4 D. G  v
#else1 a5 Z, T7 W) ?/ p. u3 ?4 a
#define MSC_MAX_PACKET               64
" D7 D4 A, s, F#endif. U3 ~3 p3 I2 A+ r: o* Q2 I
#else  /*USE_USB_OTG_FS*/+ o( d4 ?1 j& X4 t! u; A. V
#define MSC_MAX_PACKET                64
, h* s9 T6 J; ^8 u1 }+ L  |: H. D- P#endif# i% x2 m: ^# U* x( O

3 I# J% Z$ |- u! T1 [3 c#define HID_IN_EP                    0x81    用于控制
* @9 i$ y1 S; Q; I; H% P#define HID_OUT_EP                   0x01 用于控制2 K' H% a$ o% A

5 I6 c7 I4 @. {- r#define HID_IN_PACKET                0x408 F2 d2 p, v& r/ ]+ L5 S' {
#define HID_OUT_PACKET               0x40
; K4 M, Q5 P+ `; ^
$ {& c7 ]& ?$ p  J: R3 f#define MSC_MEDIA_PACKET             4096
' F! Q& z' O2 @添加相应的端口定义
4 |' I! [# c2 R2 m将HID历程的一些必须函数拼接到MSC里面
8 J" v! o" }  A' w! E& e: fQQ:3934417461 M% U" ?  N0 P0 l% ?
欢迎一起交流STM32的知识,我使用过103 407 0300 D: D1 G1 ~8 h# q9 u/ r
或者直接在帖子里讨论 我常来的/ o' R$ [) X, J' M
库函数加快了我的开发% R; [0 `, P8 j  I8 e, n
你还在使用串口吗,像当年玩串口一样使用USB 将是不一样的体验目前自己创业在做PM2.5传感器
$ C7 W2 q; G4 I3 I- m( Bhttp://shop144438126.taobao.com/?spm=a1z10.1-c.0.0.A2q64T
  q+ f% C  c4 x0 P9 e; U6 G$ t; Y! r# r5 c

' T1 s. O( ]) D( b4 I3 ~: w9 M. ~; m8 p0 J
3 Z5 B$ ^) I: k0 C: N7 q
收藏 评论12 发布时间:2014-3-31 11:33

举报

12个回答
stm32f103vc 回答时间:2014-3-31 11:48:31

RE:【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)

在windows下,这个需要做驱动么?windows里面有MSC和HDI类的驱动,不装驱动试过没?
德华 回答时间:2014-3-31 12:57:20

回复:【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)

回复第 2 楼 于2014-03-31 11:48:31发表:
. I3 A) w8 s3 ?8 R( D在windows下,这个需要做驱动么?windows里面有MSC和HDI类的驱动,不装驱动试过没?
0 ~# a- e" e7 B  @0 A我说了 用NI VISA  再用labview 操作  如果会C++的可以自己写一个
5 E' _( `' n0 g* p$ m7 ]) o 
德华 回答时间:2014-3-31 12:59:46

RE:【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)

电脑可以识别成两个设备 但是你要在HID里实现自己的控制命令 就要知道端口啊
stm32f103vc 回答时间:2014-3-31 20:00:54

RE:【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)

但是,你要实现的是什么功能呢?能够识别就说明驱动已经识别成功了。你再做的应该是app,而不是driver了吧?不过用labview可能要装它自己另外做的驱动,而不用windows的通用驱动了。关键还是不知道你要实现啥功能,开始我以为是一个既当鼠标又当优盘的实现
德华 回答时间:2014-4-1 22:36:29

回复:【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)

回复第 5 楼 于2014-03-31 20:00:54发表:
: k4 X! c3 v$ [4 ^  b但是,你要实现的是什么功能呢?能够识别就说明驱动已经识别成功了。你再做的应该是app,而不是driver了吧?不过用labview可能要装它自己另外做的驱动,而不用windows的通用驱动了。关键还是不知道你要实现啥功能,开始我以为是一个既当鼠标又当优盘的实现 
6 B  m: [: S# A8 V. M+ f
( i- {0 O* L9 g我在里面配置时间  配置校准参数 配置采样率 配置等等 做成数据记录仪
froxy 回答时间:2014-4-5 23:09:05

回复:【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)

你好,楼主,你的usb存储设备的程序是什么写的,可以参考一下吗
德华 回答时间:2014-4-6 01:24:34

回复:【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)

回复第 7 楼 于2014-04-05 23:09:05发表:9 l; K8 C& d5 }4 @: b( p' O
你好,楼主,你的usb存储设备的程序是什么写的,可以参考一下吗
! b& K% n; e4 x# E0 h  m: Z8 Z ' N" i! B) @! u; {9 |" v
) T5 F* [. n* O& v
keil  项目应用 不好意思
德华 回答时间:2014-4-8 09:05:05

回复:【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)

回复第 7 楼 于2014-04-05 23:09:05发表:
2 C7 ]  U& l7 o1 f- V& @- D* B你好,楼主,你的usb存储设备的程序是什么写的,可以参考一下吗( v0 t* J7 i" s; z; W: u
就这块描述符比较重要 剩下的没多大改动 在官方驱动上修改0 d  O( Q; I$ A# r2 Y+ g# p
 
lwx309025167 回答时间:2014-8-4 22:10:40

回复:【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)

 楼主你好,小弟刚接触stm32不久。有一个小任务是与sdio读写emmc有关。楼主能分享一些相关的经验吗,多谢!
为它停留 回答时间:2015-1-12 13:50:49
请问用USB做设备和PC进行数据传输,USB_HID,USB_MSC,USB_CDC,哪种方式速度更快些?你有实现USB_HID进行数据传输的工程吗?可否借鉴一下?我的邮箱1305886705@qq.com
浮生若水ゝ 回答时间:2018-2-6 11:00:18
有U盘和虚拟串口的例子吗,最近在做这个,端点配置一直卡着
浮生若水ゝ 回答时间:2018-2-6 11:00:47
你好楼主
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版