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

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

[复制链接]
德华 发布时间:2014-3-31 11:33
设计目的:实现一个可以控制的U盘 USB口选用高速口,MSC选用SD卡(我用的eMMC). i; d! n! _% I1 o
设计思路:选择标准的历程MSC当做基础历程,U盘的功能就实现了,那么怎么做一个HID上去呢,就是修改描述符了,做一个复合设备的描述符,将HID历程的一些必须函数拼接到MSC里面,做好了设备驱动怎么弄呢,我也不会写 ,但是我安装了NI VISA 可以自己生成驱动文件,再用LABVIEW在线编程。/ k" m8 ]3 Y$ Z# I& C. F
_ALIGN_BEGIN uint8_t USBD_MSC_CfgDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END =
5 [  J0 E8 o; {* x2 D3 c- H{
6 t3 q: X: V7 r% c/ |! H  
2 C6 S3 g  P# k6 _( a  {, s; X  0x09,   /* bLength: Configuation Descriptor size */
5 T, G0 t$ w( ~1 b  USB_DESC_TYPE_CONFIGURATION,   /* bDescriptorType: Configuration */
. O2 {: C+ N; n+ E/ ^/ X  USB_MSC_CONFIG_DESC_SIZ,5 X& `9 w# m% C7 F9 L
  
) o( T' h0 `3 }0 D! Q5 v) d  0x00,' c; b% y% Q% E. Q( e
  0x02,   /* bNumInterfaces: 1 interface  既然是复合设备就应该有两个端口*/: b2 Z/ w, a* }; D# P8 D
  0x01,   /* bConfigurationValue: */; ]% q5 X) I6 y: \
  0x04,   /* iConfiguration: *// Z6 t" B% n. j/ y
  0xC0,   /* bmAttributes: */) B& X, C6 f( S0 h; O+ Y  a4 n
  0x64,   /* MaxPower 100 mA */6 d7 H2 Y# M. g2 k0 Q2 o

* G: F* }5 Z. C  u        /************** Descriptor of Joystick Mouse interface ****************/+ w) L- h8 V7 N+ L; H
  /* 09 */
( ~. s  Z8 X! p" N6 w+ W  0x09,         /*bLength: Interface Descriptor size*/+ f: Q' X* O% |# I1 h
  USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/) w% e- F- x2 x9 S
  0x00,         /*bInterfaceNumber: Number of Interface*/" h: J5 w* Q2 O9 I; i* K; F
  0x00,         /*bAlternateSetting: Alternate setting*/
" x+ w/ ^1 H5 s/ M- e* o  q' I  0x02,         /*bNumEndpoints*/# F% v& E1 \/ n. i9 ?, a
  0x03,         /*bInterfaceClass: HID*/
$ z, ?( s- t! u1 f! W) }# c  0x00,         /*bInterfaceSubClass : 1=BOOT, 0=no boot*/! q9 L9 @+ u% N; A
  0x00,         /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/
' m, n$ G/ J. R  0,            /*iInterface: Index of string descriptor*/
7 q/ ~! F3 k" ]' ^! S# H" Y  /******************** Descriptor of Joystick Mouse HID ********************/
8 O6 @- d( @8 O, ^: X3 P5 a: \5 E  /* 18 */
& x0 n5 T+ y. ?' J, d' s  0x09,         /*bLength: HID Descriptor size*/
3 P7 \% q1 [* z' J  a0 E  HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/
6 f# H* R& w$ Y5 k9 w5 U  0x11,         /*bcdHID: HID Class Spec release number*/# O% Q$ O$ L5 C( B8 b
  0x01,
' Y4 c$ S) a4 o( p* T) g5 M  0x00,         /*bCountryCode: Hardware target country*/
+ b  N" |9 Q; X( J4 h  0x01,         /*bNumDescriptors: Number of HID class descriptors to follow*/9 }' T* o1 r3 p( f; s1 U; ?
  0x22,         /*bDescriptorType*/
5 F6 ~  x2 u$ Y0 ^( O7 H" R  33,/*wItemLength: Total length of Report descriptor*/  w# M6 y9 b# _  M- h( ^
  0x00,5 k# ]& U+ A+ k9 N1 t
  /******************** Descriptor of Mouse endpoint ********************/
3 s7 Q2 e1 |2 H& h$ F( Q- P% r6 V  /* 27 */
# H, f/ j, t3 G& ^2 n% X( M. |2 ]! j  0x07,          /*bLength: Endpoint Descriptor size*/
7 Y2 \" e" P6 k. u9 d  USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/" ~2 j  a$ f: w% X" }& T
  0 E& e6 W% j  `+ ~9 z3 C
  HID_IN_EP,     /*bEndpointAddress: Endpoint Address (IN)*/
* P" O% x. A6 L4 ~" U: A  0x02,          /*bmAttributes: Interrupt endpoint*/3 q  u0 k+ H( ^1 t# X- E1 r
  HID_IN_PACKET, /*wMaxPacketSize: 64 Byte max */
3 Q3 b$ c; u! _& f$ p$ B+ {  0x00,# d+ Z; \" P' m$ p# o7 T
  0x0A,          /*bInterval: Polling Interval (10 ms)*/8 q! b+ y, ~0 U+ f9 |; D5 h
  /* 34 */
1 V# M* Y: x  f& R  0x07,          /*bLength: Endpoint Descriptor size*/
3 H' w0 n+ \4 i  USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/
* T# `9 }3 O2 x' [  
) E+ A7 h5 `$ ~  HID_OUT_EP,     /*bEndpointAddress: Endpoint Address (IN)*/( C2 \. h" Z( i9 q3 F9 v5 o
  0x02,          /*bmAttributes: Interrupt endpoint*/
) U8 O# C& R2 c: e, p* w  HID_IN_PACKET, /*wMaxPacketSize: 64 Byte max */1 T8 B1 y. q- y' G  e1 f% w: ^
  0x00,
& X& d! X: B5 X) F  0x0A,          /*bInterval: Polling Interval (10 ms)*/
4 U1 ?3 B$ ]- c! D4 h4 t  /*41*/
9 U: i8 B1 ?, k7 W% t                 /********************  Mass Storage interface ********************/% b* H3 u* m  O1 f7 j4 t
  0x09,   /* bLength: Interface Descriptor size */
. L& J  A) B( \, X" {  0x04,   /* bDescriptorType: */8 G7 Y  r& d* V6 V0 E
  0x01,   /* bInterfaceNumber: Number of Interface */
$ ^) t/ k! Z1 [# B7 b* P/ G  0x00,   /* bAlternateSetting: Alternate setting */
6 y4 v- ]9 }' p+ G5 S! b  0x02,   /* bNumEndpoints*/1 z9 f. H# t8 J% |- ^% a
  0x08,   /* bInterfaceClass: MSC Class */$ z. h$ K* I7 ?
  0x06,   /* bInterfaceSubClass : SCSI transparent*/
, P1 f0 W$ Q  R  R$ {" j! j  0x50,   /* nInterfaceProtocol */
1 Y0 B0 \2 C! x. b  0x05,          /* iInterface: */
: o% y: `* J* D" w3 f  /********************  Mass Storage Endpoints ********************/
+ P" L3 I8 G; v" Y6 g! l5 w  0x07,   /*Endpoint descriptor length = 7*/! x  m9 e0 `  ?2 t" K
  0x05,   /*Endpoint descriptor type */
( Y' l: T& \( J/ I7 B  MSC_IN_EP,   /*Endpoint address (IN, address 1) */
, ?: y2 N, ?! s  0x02,   /*Bulk endpoint type */- q" n# b: `' p/ ]* d2 T3 Z5 C. l8 F4 V
  LOBYTE(MSC_MAX_PACKET),% z- s# G; `+ |- W  V* M1 s
  HIBYTE(MSC_MAX_PACKET),
* o9 |! }( x- X' H9 }# |5 J4 e  0x00,   /*Polling interval in milliseconds */
$ {1 k9 u, @# e  a- R- b& y  8 ]2 Y1 L  }/ f/ N# ^
  0x07,   /*Endpoint descriptor length = 7 */
0 J; G# g7 ^9 e: ?8 ?! l9 c  0x05,   /*Endpoint descriptor type */! \5 j4 D6 g; u& ?4 ?
  MSC_OUT_EP,   /*Endpoint address (OUT, address 1) */5 Q5 X- s; J6 e( T
  0x02,   /*Bulk endpoint type */
2 B2 }( P) d; b5 w4 D' E  LOBYTE(MSC_MAX_PACKET),
( J! Y5 C4 l+ v( g* E7 q  HIBYTE(MSC_MAX_PACKET),, D6 h: h: [4 j3 v4 S# e
  0x00,     /*Polling interval in milliseconds*/
. H+ x6 T6 \  r1 O; }};
4 `! G! Q6 h# g9 k& k
* w$ Y( H: a8 r% Y& [5 ?: g7 u 8 G# p8 i% T8 \
在usb_conf.h里
& K$ q% z$ [, U9 y/ h3 y#define USBD_CFG_MAX_NUM           1
- @1 M2 x* J# J  V#define USBD_ITF_MAX_NUM           1! t" p1 r) n. N& D  |
#define USB_MAX_STR_DESC_SIZ       64
, w9 |% M- M. x5 u4 X. m3 L0 P0 ~ ; o: m8 Y; i8 D9 z& k# }6 {
#define USBD_SELF_POWERED               6 k2 X: q& p( n5 t

8 H' q9 h% t1 Q/* Class Layer Parameter */1 }* g; p$ r# e$ {8 Q

. g; t/ B) T7 Z: E6 ]#define MSC_IN_EP                    0x82    /// 用于U盘
3 ~3 z6 W# \% m#define MSC_OUT_EP                   0x02    /// 用于U盘
- Z$ _! P  f( U! z0 e' ?#ifdef USE_USB_OTG_HS  ) s: f( ]/ B& q  E8 ~
#ifdef USE_ULPI_PHY
3 j0 v4 J, {7 F! W% H#define MSC_MAX_PACKET               512
4 u# \8 H  H; I, ]#else
. b3 Y( u; E' q" ]#define MSC_MAX_PACKET               64& e; p: N1 V! O
#endif
. _1 ?% X; n; W#else  /*USE_USB_OTG_FS*/, u6 p! @" V6 n' p/ ]. M
#define MSC_MAX_PACKET                64( f0 K: C8 X6 b  h
#endif
- t8 [; ?7 X  r* B. e
- q. `, q9 t3 W5 D& _/ K3 D1 q2 V#define HID_IN_EP                    0x81    用于控制
, C1 f" ]4 m$ L0 z+ ^#define HID_OUT_EP                   0x01 用于控制4 B" O: f9 Q: X$ S( R" I
  U# N$ ^* ]% `  V8 I
#define HID_IN_PACKET                0x40
5 S2 d& s4 ~! B6 A3 d#define HID_OUT_PACKET               0x40
, L8 _2 Y) a1 w7 [3 d) w
" A+ y9 Q+ m  S#define MSC_MEDIA_PACKET             4096
* f: b! B  F3 {$ x添加相应的端口定义
- ^5 \0 Z6 r/ e% m" s将HID历程的一些必须函数拼接到MSC里面) ]" T) E4 u7 ]: g- \& |8 e* @
QQ:3934417465 l* j8 j% E2 l( h4 |
欢迎一起交流STM32的知识,我使用过103 407 0306 f& a/ ]$ j, t- H1 K
或者直接在帖子里讨论 我常来的/ k" F4 j3 s' L% t& Q1 {+ b2 k. F
库函数加快了我的开发% M1 X: H2 _1 E" R( h- ~  B
你还在使用串口吗,像当年玩串口一样使用USB 将是不一样的体验目前自己创业在做PM2.5传感器2 L& \# h/ \2 W7 ^6 q# |
http://shop144438126.taobao.com/?spm=a1z10.1-c.0.0.A2q64T5 o+ s" ~( m& |! s
3 D; s( r6 b# p2 x
; `4 f* N  `. u2 m8 F2 L

* e* T5 o3 `; G  v
3 s5 a3 c( {! Q( K; n: Z
收藏 评论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发表:) ]5 z8 Q3 B: }, a
在windows下,这个需要做驱动么?windows里面有MSC和HDI类的驱动,不装驱动试过没?
' h5 ?7 l/ Z1 e9 H0 P! r, q我说了 用NI VISA  再用labview 操作  如果会C++的可以自己写一个
; _3 U3 C/ C9 ^* D 
德华 回答时间: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发表:
7 \5 A. ?: z  R' `0 |但是,你要实现的是什么功能呢?能够识别就说明驱动已经识别成功了。你再做的应该是app,而不是driver了吧?不过用labview可能要装它自己另外做的驱动,而不用windows的通用驱动了。关键还是不知道你要实现啥功能,开始我以为是一个既当鼠标又当优盘的实现 
; L2 b0 g6 C7 z* }; O" T$ b% p5 v. n
4 N& ]4 t$ R' q' [4 [6 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发表:. j: T) K7 o' a
你好,楼主,你的usb存储设备的程序是什么写的,可以参考一下吗
$ K" w! o8 i9 X$ z* C: s 
* u, V( _: D7 }$ ]/ X- w8 a* |# ^+ `
keil  项目应用 不好意思
德华 回答时间:2014-4-8 09:05:05

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

回复第 7 楼 于2014-04-05 23:09:05发表:
" a9 Z% P% B6 A; @- R# `你好,楼主,你的usb存储设备的程序是什么写的,可以参考一下吗+ O% L' j8 U/ L5 E8 n6 }( ]
就这块描述符比较重要 剩下的没多大改动 在官方驱动上修改2 A$ Z$ Q' ?" r
 
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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版