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

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

[复制链接]
德华 发布时间:2014-3-31 11:33
设计目的:实现一个可以控制的U盘 USB口选用高速口,MSC选用SD卡(我用的eMMC)
: T! S) p6 o3 |, |设计思路:选择标准的历程MSC当做基础历程,U盘的功能就实现了,那么怎么做一个HID上去呢,就是修改描述符了,做一个复合设备的描述符,将HID历程的一些必须函数拼接到MSC里面,做好了设备驱动怎么弄呢,我也不会写 ,但是我安装了NI VISA 可以自己生成驱动文件,再用LABVIEW在线编程。
8 Q5 M' O3 g" Z. f_ALIGN_BEGIN uint8_t USBD_MSC_CfgDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END =. s, V  i1 b4 P3 G8 y* ^$ c
{: Z$ H; Q1 b+ o& l0 r# D7 n
  ( S5 [; k  g. |0 L+ R, C& \
  0x09,   /* bLength: Configuation Descriptor size */- \( Z! C: k8 m, r' p2 k
  USB_DESC_TYPE_CONFIGURATION,   /* bDescriptorType: Configuration */
- `+ n7 B7 t  A  USB_MSC_CONFIG_DESC_SIZ,
) ?( W, E- e) x  
% w) D; Z6 c1 A1 B, w) {0 T  0x00,
: K: H# H# F" X- K: u) Y6 e  0x02,   /* bNumInterfaces: 1 interface  既然是复合设备就应该有两个端口*/
  ^, F, s0 s4 w9 j  0x01,   /* bConfigurationValue: */
$ s& f% Q* i0 H$ r# e' {  0x04,   /* iConfiguration: */+ @6 i0 n; k. F+ _* s8 A, d2 C
  0xC0,   /* bmAttributes: */
! H' j$ u9 b$ c" o5 B  0x64,   /* MaxPower 100 mA */, }) D  d; C: S) [6 l3 h

. G* w  u2 g6 \0 @" w- T9 ~        /************** Descriptor of Joystick Mouse interface ****************/
0 ^5 W. _9 @+ x- x9 M9 {, F  /* 09 */( N0 Z) Z; [$ {  M$ Y
  0x09,         /*bLength: Interface Descriptor size*/4 B3 Z* Q- [& i6 P" H) k, v- d
  USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/" I% A, o" v* N4 X
  0x00,         /*bInterfaceNumber: Number of Interface*/
9 R- s; Q3 G0 s& ~, b) x) R  0x00,         /*bAlternateSetting: Alternate setting*/0 a( x+ L- d! d* {- R
  0x02,         /*bNumEndpoints*/
8 f6 i' e. C+ {! ^; w- L  0x03,         /*bInterfaceClass: HID*/8 i# `1 G! p: S9 Y0 b
  0x00,         /*bInterfaceSubClass : 1=BOOT, 0=no boot*/6 m4 N5 E' [/ y. b! r! n6 ^
  0x00,         /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/4 @# T! l; m( R8 ?# Y5 ]0 v
  0,            /*iInterface: Index of string descriptor*/
0 B7 F3 }4 ~# w+ w  /******************** Descriptor of Joystick Mouse HID ********************/# w0 C/ B$ i  u
  /* 18 */
# r+ Q8 U6 [  B" A  0x09,         /*bLength: HID Descriptor size*/" A4 u" u0 F/ g3 Q3 @# t  f& L
  HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/
% ]1 l0 x  k' a2 o  0x11,         /*bcdHID: HID Class Spec release number*/
/ T9 q2 c% p& D8 n/ K) B  0x01,5 t8 y. S4 r7 o1 `! S' B
  0x00,         /*bCountryCode: Hardware target country*/% C# }; L! P, P
  0x01,         /*bNumDescriptors: Number of HID class descriptors to follow*/" n& S# |( }& `" j
  0x22,         /*bDescriptorType*/
& C9 {5 k( Q  ?) p( ~  33,/*wItemLength: Total length of Report descriptor*/" s- [4 H; G5 F3 g! r2 F
  0x00,
4 T: D# O7 Q7 O  /******************** Descriptor of Mouse endpoint ********************/: V1 `2 ]( B3 K- C3 j
  /* 27 */5 O* d( f" W/ l& m
  0x07,          /*bLength: Endpoint Descriptor size*/8 [! O1 m% V& n
  USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*// x9 n+ l9 ~( r0 r& |
  $ E7 i' e$ a( l6 ^
  HID_IN_EP,     /*bEndpointAddress: Endpoint Address (IN)*/
4 @9 `% q& F4 N+ P$ [* M  0x02,          /*bmAttributes: Interrupt endpoint*/3 Q1 ^. R5 g* F0 u! [
  HID_IN_PACKET, /*wMaxPacketSize: 64 Byte max */3 k& X% |( ]( g3 O3 l+ ^" l9 q( o
  0x00,
1 h( w1 n9 Q& J6 m) o$ ^9 o( |# {4 {  0x0A,          /*bInterval: Polling Interval (10 ms)*/
- f$ [  y. m5 R: V4 T8 U  /* 34 */
' q3 K0 ^& A# M* L4 x6 r9 m) w  0x07,          /*bLength: Endpoint Descriptor size*/% k  j  Y, {$ B" V- w8 l
  USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/% l  n* B9 L6 W! j( X1 r
  
: e% y6 }4 f: ~' T  HID_OUT_EP,     /*bEndpointAddress: Endpoint Address (IN)*/! {5 U0 F* Z7 t3 o
  0x02,          /*bmAttributes: Interrupt endpoint*/
/ H# v+ s/ i, ?" r- J+ y9 B  HID_IN_PACKET, /*wMaxPacketSize: 64 Byte max */% @  D4 C5 R  u+ K2 ?8 b- {
  0x00,
9 e- w. m4 e' }! e: ^  0x0A,          /*bInterval: Polling Interval (10 ms)*/
  P3 L2 C6 D% i$ }6 E  /*41*/
3 b4 t: [) T9 c- `2 d2 l8 Z+ W7 }3 m                 /********************  Mass Storage interface ********************/# ~6 O) G7 _6 i3 e0 Z7 i8 r
  0x09,   /* bLength: Interface Descriptor size */
* {" v, R7 K1 \( d6 A9 ^- h  0x04,   /* bDescriptorType: */
" e5 v3 I; v: q2 Z9 @" `" B  0x01,   /* bInterfaceNumber: Number of Interface */  ^5 a. y+ s6 v, U/ @, @! E
  0x00,   /* bAlternateSetting: Alternate setting */( P) M" j) n# A/ f  U3 [0 b. D
  0x02,   /* bNumEndpoints*/
$ E$ [4 u# T/ D( x: ^  0x08,   /* bInterfaceClass: MSC Class */
, G1 R$ F/ V' G1 J# l  0x06,   /* bInterfaceSubClass : SCSI transparent*/
/ u- m0 n  p, ~) ~$ _  0x50,   /* nInterfaceProtocol */
$ d4 p3 L  {4 y  0x05,          /* iInterface: */
- O, U, g& h9 d0 K  /********************  Mass Storage Endpoints ********************/- V7 I/ x  g4 Q3 i. v" X
  0x07,   /*Endpoint descriptor length = 7*/
& M( s2 @3 w6 Q* D6 C; x  0x05,   /*Endpoint descriptor type */
3 @/ Y; C, [0 _  MSC_IN_EP,   /*Endpoint address (IN, address 1) */# B( l: j1 m7 p) V( |
  0x02,   /*Bulk endpoint type */$ d+ ^) y. _( N: h4 o- `1 U
  LOBYTE(MSC_MAX_PACKET),
. M& s: l# v" s* T4 ~0 J  HIBYTE(MSC_MAX_PACKET),2 `& R' \+ x* l5 @5 j/ `
  0x00,   /*Polling interval in milliseconds */" `7 w6 m2 R) x0 C% S  ?+ v. l
  
: n; b  J; n1 b  0x07,   /*Endpoint descriptor length = 7 */
2 E* }# B0 |( K- w+ m" R  0x05,   /*Endpoint descriptor type */
# r7 A9 |  A6 @* b/ B4 n. D3 n  MSC_OUT_EP,   /*Endpoint address (OUT, address 1) */1 T! X' }. I9 x' k# [
  0x02,   /*Bulk endpoint type */1 Z8 |; x0 A7 {! n+ a. k
  LOBYTE(MSC_MAX_PACKET),
, r4 `" m0 y9 a$ l$ C  HIBYTE(MSC_MAX_PACKET),
+ _" E, N& ~8 l" B; c+ `  0x00,     /*Polling interval in milliseconds*/
# d1 g4 w2 E4 G  k% x" Q};
' w- Z5 ]/ a3 R4 a5 U( U& h/ R: G; u
7 z8 d- R4 P: ` 5 E; b; b! m- {" t; U+ r4 T8 v
在usb_conf.h里
3 _. V, `/ s1 K. J2 r5 z#define USBD_CFG_MAX_NUM           1
$ z) ^# w: ?7 _3 c#define USBD_ITF_MAX_NUM           1$ m$ Y! B! e: }) N/ R/ A& a
#define USB_MAX_STR_DESC_SIZ       64 & p& N, o; t+ z) h9 t2 p) J- p
3 U$ r0 D- R8 O0 P
#define USBD_SELF_POWERED               
$ w$ e- x4 |. q" f! a 7 E( H/ u9 p8 u  ~$ l( v5 c
/* Class Layer Parameter */
0 L2 D; B( u9 ]$ Z! H4 P$ r ' U* t4 z# U' X. o
#define MSC_IN_EP                    0x82    /// 用于U盘
" l6 H' O/ B) n* e6 Q#define MSC_OUT_EP                   0x02    /// 用于U盘
8 \2 D" H" Q6 q/ ]+ K#ifdef USE_USB_OTG_HS  
: s( X" t5 [  r! N#ifdef USE_ULPI_PHY
9 a- L' I% z) C. |: A# n4 n: p#define MSC_MAX_PACKET               512
  x# V2 ^' C7 j1 R#else0 X) W, N, x  c
#define MSC_MAX_PACKET               64: J6 t( V$ ^0 t9 K/ ~7 m( b9 \
#endif
7 @! B  {  \+ L. P3 Y#else  /*USE_USB_OTG_FS*/
# I, ]5 @! r' X% }#define MSC_MAX_PACKET                64  L: i7 ]7 Z3 z/ Z7 ?  S
#endif! L8 ~, J0 F  H/ B8 w2 T  r, \
6 u- |/ B  e4 O
#define HID_IN_EP                    0x81    用于控制+ U" M5 K' a* P, ^
#define HID_OUT_EP                   0x01 用于控制
, N8 m9 K% w7 L" O% i- X  Q) X * z" r3 r) B8 n! T  g
#define HID_IN_PACKET                0x40
! ?3 R/ v; _+ @# }1 K0 [) M#define HID_OUT_PACKET               0x40
$ |) r* _: w0 I, r
1 s' x% X+ E: i5 Y! Z! J  J- S7 N#define MSC_MEDIA_PACKET             4096
* \: \7 P! a) U1 K+ U添加相应的端口定义
8 z" D7 A2 }, V9 c+ m将HID历程的一些必须函数拼接到MSC里面$ H0 N" ]  H* u' _6 {% p( H- W
QQ:393441746
$ H# l' t  b. ]) n2 M7 J6 n! h欢迎一起交流STM32的知识,我使用过103 407 030
  X5 R; d  I4 V7 g$ h! g* w或者直接在帖子里讨论 我常来的" i: Q3 I- f( e; E$ ^
库函数加快了我的开发+ N0 u5 |& p0 ^4 {& w% |
你还在使用串口吗,像当年玩串口一样使用USB 将是不一样的体验目前自己创业在做PM2.5传感器
4 M' i5 f& G4 n; ^5 u9 W( q4 Yhttp://shop144438126.taobao.com/?spm=a1z10.1-c.0.0.A2q64T: ?4 F2 l6 N$ B- U7 K9 I% E

- j6 s: h# h# r 2 P+ U! y2 z# u/ _+ W7 |

. z; V; B3 N% D: a2 ]5 [. k6 W9 K& t) D
赞 收藏 评论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发表:' K9 T7 w0 d6 o" H9 q! W5 M' |
在windows下,这个需要做驱动么?windows里面有MSC和HDI类的驱动,不装驱动试过没?- v" `1 @$ s. ?" V
我说了 用NI VISA  再用labview 操作  如果会C++的可以自己写一个
. V+ ~( A. }5 N4 R  e8 [ 
德华 回答时间: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发表:
+ y8 c  S; P) d$ o但是,你要实现的是什么功能呢?能够识别就说明驱动已经识别成功了。你再做的应该是app,而不是driver了吧?不过用labview可能要装它自己另外做的驱动,而不用windows的通用驱动了。关键还是不知道你要实现啥功能,开始我以为是一个既当鼠标又当优盘的实现 
) V# Z, k" f( U  n9 {- P
+ o; m1 Z, y% R0 ^9 m我在里面配置时间  配置校准参数 配置采样率 配置等等 做成数据记录仪
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发表:( q& m* E* U( |  c. f5 o
你好,楼主,你的usb存储设备的程序是什么写的,可以参考一下吗- G+ A' k3 \. [' E& _5 ?) @% q
 
1 D6 e7 ?. N' |. r' y- I: w
) S: l, R8 Z+ p2 j0 N0 wkeil  项目应用 不好意思
德华 回答时间:2014-4-8 09:05:05

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

回复第 7 楼 于2014-04-05 23:09:05发表:
0 k( S+ M: S8 T1 q你好,楼主,你的usb存储设备的程序是什么写的,可以参考一下吗7 S# T3 V# b6 r
就这块描述符比较重要 剩下的没多大改动 在官方驱动上修改
- O( A4 t" y) T4 f8 G( k/ x 
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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版