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

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

[复制链接]
德华 发布时间:2014-3-31 11:33
设计目的:实现一个可以控制的U盘 USB口选用高速口,MSC选用SD卡(我用的eMMC)
/ h) J* L* R1 N0 U. ^9 C; F: P设计思路:选择标准的历程MSC当做基础历程,U盘的功能就实现了,那么怎么做一个HID上去呢,就是修改描述符了,做一个复合设备的描述符,将HID历程的一些必须函数拼接到MSC里面,做好了设备驱动怎么弄呢,我也不会写 ,但是我安装了NI VISA 可以自己生成驱动文件,再用LABVIEW在线编程。5 f* C% r$ C/ _+ |% _0 X# J5 c
_ALIGN_BEGIN uint8_t USBD_MSC_CfgDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END =
  m0 M. ^  D/ }9 G{4 p9 g5 h0 \' i# m' d" W4 K
  - W2 t* D+ ^, J" J7 S$ m% F
  0x09,   /* bLength: Configuation Descriptor size */
: |0 C  `8 L  }- G; \! S  USB_DESC_TYPE_CONFIGURATION,   /* bDescriptorType: Configuration */7 K& H, @& G/ r
  USB_MSC_CONFIG_DESC_SIZ,3 v  e( H2 c/ ]7 }, D
  / d/ l- G( P) V7 w, T
  0x00,
# O! p- Y# G: E/ _& Y' o- J/ J  0x02,   /* bNumInterfaces: 1 interface  既然是复合设备就应该有两个端口*/
! P3 k" k7 E6 o+ P+ S  0x01,   /* bConfigurationValue: */
0 i% X* y& `, o) b: q2 A1 E' a8 t- x  0x04,   /* iConfiguration: */6 _2 P5 E/ f3 t. f( @1 x
  0xC0,   /* bmAttributes: */
& X5 h* b# _8 j: ?" ]+ B* q  0x64,   /* MaxPower 100 mA */
0 n8 o" R' O# Q8 y& B+ u7 ^& o / Q. }: h4 X) \( L, G5 E/ v& U
        /************** Descriptor of Joystick Mouse interface ****************/% o6 m& o: f1 I& r! u! a
  /* 09 */* ?% J4 {1 _+ H/ s9 R) E8 T  [
  0x09,         /*bLength: Interface Descriptor size*/; G; S1 \- A; C/ ~$ {- W. o
  USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/( K/ i: o5 Z/ u& @- n" |
  0x00,         /*bInterfaceNumber: Number of Interface*/, ?' S7 V9 o) ?  `
  0x00,         /*bAlternateSetting: Alternate setting*/4 ^5 r, f5 E# H% J, P7 t4 j' ]7 \
  0x02,         /*bNumEndpoints*/
1 `+ r0 H6 p% Y; Q1 a5 B4 M- M, B  O  0x03,         /*bInterfaceClass: HID*/
) {3 _3 }6 {3 n& X( e: Q  0x00,         /*bInterfaceSubClass : 1=BOOT, 0=no boot*/9 `8 t; k: {. Z! W2 X
  0x00,         /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/$ t( J2 ]1 G- X( u! t
  0,            /*iInterface: Index of string descriptor*/7 G1 a( M" @5 ^7 U" j! x) N' h6 u; m6 \6 d
  /******************** Descriptor of Joystick Mouse HID ********************/% r: w+ f* H$ u  e7 @8 q
  /* 18 */
. F$ ?  P" L# ^& z2 |# E7 S" _  0x09,         /*bLength: HID Descriptor size*/
: c  E; W: S5 M4 m1 w9 A6 L  HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/
$ c" K, w- J# G7 ~1 |  0x11,         /*bcdHID: HID Class Spec release number*/! X, \+ e. D  v* r+ Q* h
  0x01,% x# x% t# T9 E( c  K, I. }
  0x00,         /*bCountryCode: Hardware target country*/
# W3 M5 n5 w/ c! M$ Z( }  0x01,         /*bNumDescriptors: Number of HID class descriptors to follow*/
: {6 s, w! j* P8 f" S  0x22,         /*bDescriptorType*/
$ I# I3 g! E7 x& U$ Y  33,/*wItemLength: Total length of Report descriptor*/
# G( M8 N% C: S/ s+ e! k  0x00,
' n, H( B! z  a' [" V0 \* U/ {  /******************** Descriptor of Mouse endpoint ********************/# H# |5 p0 u! i5 I
  /* 27 */! _' }  A  i7 L! s6 n
  0x07,          /*bLength: Endpoint Descriptor size*/
+ h- C1 B1 g  r) J8 S  USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/
  u& a$ k( _: d0 k: H( E' P  0 j' Q6 D5 u7 f4 a5 W) F) `# V) N
  HID_IN_EP,     /*bEndpointAddress: Endpoint Address (IN)*/
, T0 S* X! f7 K( l  F  0x02,          /*bmAttributes: Interrupt endpoint*/
& ^6 w2 p6 _1 D& }* O, h7 i7 X% O9 V  HID_IN_PACKET, /*wMaxPacketSize: 64 Byte max */4 a! D# I) P( z, \- V: m4 C
  0x00,( r1 s& [+ D- E1 p" d* R4 ^" L
  0x0A,          /*bInterval: Polling Interval (10 ms)*/
% z$ a6 U# f4 G9 ^  a  /* 34 */
+ `1 u2 n, B' ]  0x07,          /*bLength: Endpoint Descriptor size*/
8 K# @- Q% s6 `6 I  Y, s  USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/- W+ ^5 Z3 r+ T4 |3 u
  
& a: w6 C1 r* Y% Z: O0 R& X  HID_OUT_EP,     /*bEndpointAddress: Endpoint Address (IN)*/
7 `1 {1 R3 u0 l: q  0x02,          /*bmAttributes: Interrupt endpoint*/
& M3 _# t" s0 f, Q% ^" T  HID_IN_PACKET, /*wMaxPacketSize: 64 Byte max */
) Q! A. i0 Y! O8 p+ C' r% O' h  0x00,
2 d! Y8 H# K! \5 F' r( M* I  0x0A,          /*bInterval: Polling Interval (10 ms)*/
, i) t6 ~) d7 O1 [  /*41*/6 S; S0 H8 l/ {5 ~  I
                 /********************  Mass Storage interface ********************/: W% {% I3 D+ O
  0x09,   /* bLength: Interface Descriptor size */; r" s" T( D# ]: L/ O4 s
  0x04,   /* bDescriptorType: */
, P6 ~) `; [& ]$ s# p5 t  0x01,   /* bInterfaceNumber: Number of Interface */  N9 B# p) e3 v  P0 \8 a
  0x00,   /* bAlternateSetting: Alternate setting */" Y" W( X# C$ f0 p  j
  0x02,   /* bNumEndpoints*/6 G. i# g4 ]( c  V% f5 ?
  0x08,   /* bInterfaceClass: MSC Class */) N6 [7 u- @) L  g$ o- e
  0x06,   /* bInterfaceSubClass : SCSI transparent*/
7 W* ?5 N; ]% K- r- |  0x50,   /* nInterfaceProtocol */
' I9 S" X4 \% X/ j; W3 {. g  0x05,          /* iInterface: */
" I. m8 B' O$ L$ S  /********************  Mass Storage Endpoints ********************/5 I. h; `$ T! y3 R! s
  0x07,   /*Endpoint descriptor length = 7*/3 N) t  b8 v8 R
  0x05,   /*Endpoint descriptor type */8 X0 l* T" r- F. O
  MSC_IN_EP,   /*Endpoint address (IN, address 1) */) n! F9 y- H- C1 F8 H* l
  0x02,   /*Bulk endpoint type */
' |; {% C3 I& Q. l3 h1 z  LOBYTE(MSC_MAX_PACKET)," j  o, W$ y9 v/ U
  HIBYTE(MSC_MAX_PACKET),6 R  Y! C" m2 ~# `; N. P
  0x00,   /*Polling interval in milliseconds */# C3 s/ y$ W  F* w  b$ }5 W" A* W
  
! n) j; _) G/ {  0x07,   /*Endpoint descriptor length = 7 */
  M' y  C( ~, [% c+ A& `/ F  0x05,   /*Endpoint descriptor type *// a% {5 n+ I6 D
  MSC_OUT_EP,   /*Endpoint address (OUT, address 1) */: X( v  ?# f4 E& t) V3 D# z
  0x02,   /*Bulk endpoint type */( e0 e; e+ e4 ]
  LOBYTE(MSC_MAX_PACKET),
0 x* n% V9 q- R: ~6 J7 w3 c9 |  HIBYTE(MSC_MAX_PACKET),
/ [: g" {% v! @  0x00,     /*Polling interval in milliseconds*/. m' k5 b& m9 o$ x3 v+ B& {
};
4 m3 b/ K; C8 L! n9 J. A% w 0 z# t$ c, N  `% }1 g4 K! t
# d; U+ W- Y! r2 @" p# U
在usb_conf.h里' z: b# }; W; i
#define USBD_CFG_MAX_NUM           1
% W* n5 J- F0 w, P3 _#define USBD_ITF_MAX_NUM           1
' T$ W9 r% y' [5 Z& x#define USB_MAX_STR_DESC_SIZ       64 $ W& y  t+ t2 j3 u
8 D' [  f7 |9 \( Z1 C- U; Z
#define USBD_SELF_POWERED               
0 J  p0 d6 r1 g8 I2 i 2 d* [& {- M- A. N
/* Class Layer Parameter */
) `' ?3 {1 \/ E* V' w+ m7 R; U ( z& Q- j+ w$ \* K) ?
#define MSC_IN_EP                    0x82    /// 用于U盘: u# `0 @8 L" @7 R+ w
#define MSC_OUT_EP                   0x02    /// 用于U盘0 z# i0 x9 E6 y/ o
#ifdef USE_USB_OTG_HS  
7 R" K% S, e, y2 b3 @#ifdef USE_ULPI_PHY
3 W  j4 Q; l3 \1 V5 Y7 M) x#define MSC_MAX_PACKET               512' ?7 [; d6 z  F6 o
#else
$ N& X( V3 l% `& B9 P( @& Q) H8 `#define MSC_MAX_PACKET               64
, V: W- \. O) W- E. v#endif
5 ]) K! ^: a, H5 K7 f) v#else  /*USE_USB_OTG_FS*/
' R$ z& f( K5 \7 d) ~8 N0 i0 ]#define MSC_MAX_PACKET                640 S' e  [& M/ z, G5 f: U+ C( X
#endif+ h# F4 O' j7 a0 Z5 N/ }
/ v; E3 R9 B2 }6 i
#define HID_IN_EP                    0x81    用于控制
: P* X/ \3 e. h5 w9 ^' s#define HID_OUT_EP                   0x01 用于控制
" D  X# Z  z6 r" _- B/ l2 Q% ~ # ^  I4 t$ ~3 j8 V2 K* X8 [/ R
#define HID_IN_PACKET                0x40$ [$ ]6 P6 u. k$ k& m
#define HID_OUT_PACKET               0x40
& `+ y4 X4 L4 u& K2 R2 Z3 ~+ K 1 E" l, I1 e4 ]* g5 T) S9 y
#define MSC_MEDIA_PACKET             4096
3 |% d9 Z9 ~( g4 C/ T添加相应的端口定义
, ^8 f$ u+ k" E$ C* v6 |将HID历程的一些必须函数拼接到MSC里面' {3 M0 q% V1 V9 _& v5 j: W
QQ:393441746
) @1 e. b  r$ O- U+ J, `1 Y: g6 W8 T欢迎一起交流STM32的知识,我使用过103 407 0302 K2 k- U' ~5 B. y. L. v
或者直接在帖子里讨论 我常来的, s+ Z" D" I" X5 K1 j" H% t
库函数加快了我的开发: q4 Z% j' U" X% ]  d" X8 N
你还在使用串口吗,像当年玩串口一样使用USB 将是不一样的体验目前自己创业在做PM2.5传感器$ X- t: @  x0 P  @2 D/ T
http://shop144438126.taobao.com/?spm=a1z10.1-c.0.0.A2q64T
) c4 l/ B' |. ]  ]. m9 M, q% h* k7 g, W6 f

2 Z6 F4 u7 H1 x* p( k. t9 K
. F( `4 z0 F( n$ M' e2 T" G0 q
$ n" \) _8 P5 s
收藏 评论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发表:' o& P6 ~4 T# g3 S
在windows下,这个需要做驱动么?windows里面有MSC和HDI类的驱动,不装驱动试过没?
6 d$ o0 m+ t3 B8 d我说了 用NI VISA  再用labview 操作  如果会C++的可以自己写一个
; m0 O3 N1 w# p+ g( ` 
德华 回答时间: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发表:
) b+ r% z- ]! Z/ ]& R但是,你要实现的是什么功能呢?能够识别就说明驱动已经识别成功了。你再做的应该是app,而不是driver了吧?不过用labview可能要装它自己另外做的驱动,而不用windows的通用驱动了。关键还是不知道你要实现啥功能,开始我以为是一个既当鼠标又当优盘的实现 , L1 T3 P! {% N1 U" A  U- D- E, ?9 i

& Y; O& w$ }, |8 y+ y" f我在里面配置时间  配置校准参数 配置采样率 配置等等 做成数据记录仪
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发表:
' N$ K$ _/ o6 j! P+ ^9 h你好,楼主,你的usb存储设备的程序是什么写的,可以参考一下吗& C% y3 k) J; R; N3 l# Y5 a" l- v
 
3 l0 M9 S0 ^) K3 b7 M
3 n8 W& Y0 a8 N9 L  ]' T6 J- ukeil  项目应用 不好意思
德华 回答时间:2014-4-8 09:05:05

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

回复第 7 楼 于2014-04-05 23:09:05发表:
! r$ q& n7 d+ t你好,楼主,你的usb存储设备的程序是什么写的,可以参考一下吗9 P$ @4 E/ C( }8 L
就这块描述符比较重要 剩下的没多大改动 在官方驱动上修改
0 r2 M5 w& a/ O2 K  |) | 
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 手机版