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

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

[复制链接]
德华 发布时间:2014-3-31 11:33
设计目的:实现一个可以控制的U盘 USB口选用高速口,MSC选用SD卡(我用的eMMC)5 p0 h: N# D2 _  c
设计思路:选择标准的历程MSC当做基础历程,U盘的功能就实现了,那么怎么做一个HID上去呢,就是修改描述符了,做一个复合设备的描述符,将HID历程的一些必须函数拼接到MSC里面,做好了设备驱动怎么弄呢,我也不会写 ,但是我安装了NI VISA 可以自己生成驱动文件,再用LABVIEW在线编程。
. F& l: Y7 N: T2 Z7 v2 V_ALIGN_BEGIN uint8_t USBD_MSC_CfgDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END =6 l, j2 W  k: N7 S5 ~, R3 n
{
# Q, E, e' @" x( [. r  
0 J/ t# ~3 U( r- H- n  0x09,   /* bLength: Configuation Descriptor size */
" A! c# K( [2 h  USB_DESC_TYPE_CONFIGURATION,   /* bDescriptorType: Configuration */. N: U; ^& S% o2 U
  USB_MSC_CONFIG_DESC_SIZ,
% r1 I$ \6 Q& g) z  2 M- ]+ s$ l/ ]" |7 w# ^/ ^7 h0 s
  0x00,
" d2 d9 Z# J6 E: ?* q; ^8 e! I6 Z' J  0x02,   /* bNumInterfaces: 1 interface  既然是复合设备就应该有两个端口*/
* ^# ]( l" O$ d! g' f  0x01,   /* bConfigurationValue: */" y( m: [6 t2 H- P7 F7 J
  0x04,   /* iConfiguration: */
- V9 x: A/ c  m0 L  0xC0,   /* bmAttributes: */2 e9 y- @& G4 p( ?2 P
  0x64,   /* MaxPower 100 mA */
$ f3 R" N2 O( D% ?; ?
: x7 L& a# f6 B; S+ l        /************** Descriptor of Joystick Mouse interface ****************/
  D4 P- S2 P* t$ ]  /* 09 */( u3 a0 d  O! b2 Y7 g
  0x09,         /*bLength: Interface Descriptor size*/
  }+ a- a# u# J; K, }: H  USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/
. D8 M( o1 p; u2 k# y$ X  0x00,         /*bInterfaceNumber: Number of Interface*/8 s/ z( _( R( y" P
  0x00,         /*bAlternateSetting: Alternate setting*/3 J. ?+ D( I! \4 M: F
  0x02,         /*bNumEndpoints*/
, ?* h& D# \* n5 v2 L7 r  0x03,         /*bInterfaceClass: HID*/- ?: r/ s' ^5 Z' |! t0 ]
  0x00,         /*bInterfaceSubClass : 1=BOOT, 0=no boot*/
; X4 z& W+ ~: X  0x00,         /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/2 d8 Q: a* ^9 P; e
  0,            /*iInterface: Index of string descriptor*/6 d5 q" A5 }) ^. B% Q
  /******************** Descriptor of Joystick Mouse HID ********************/
* S2 ~% S+ O/ ?  /* 18 */
. c- }! k! ]$ s) m, ]  0x09,         /*bLength: HID Descriptor size*/5 l4 u* i4 Q# m
  HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/
3 g/ E6 Y) }6 F) b; s  x  0x11,         /*bcdHID: HID Class Spec release number*/+ Q1 o( z! J3 G/ S+ h5 b+ X
  0x01,9 H/ e& g; _1 e4 c* g7 O# x0 @7 M
  0x00,         /*bCountryCode: Hardware target country*/
/ k$ w4 t3 N4 C* e3 n0 i  0x01,         /*bNumDescriptors: Number of HID class descriptors to follow*/( D3 Q( O' j+ n9 E
  0x22,         /*bDescriptorType*/
% L8 G" h  x$ J4 F# {% ?# _/ c1 i  33,/*wItemLength: Total length of Report descriptor*/  y) L3 M7 s0 l) h
  0x00,# Q. h5 C, _6 x) Z/ p+ ~( [
  /******************** Descriptor of Mouse endpoint ********************/
2 V- A. w& Z6 Z8 {2 L  /* 27 */
% g+ Z# Z3 U7 C! ]* O% t' y  0x07,          /*bLength: Endpoint Descriptor size*/2 V, {; W5 d$ D0 Q# S/ G
  USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/& C# z9 ?1 v- K# X
  
  D8 }1 Z: e. k. D9 }4 {! Q  HID_IN_EP,     /*bEndpointAddress: Endpoint Address (IN)*/% E6 r4 ?) m* s
  0x02,          /*bmAttributes: Interrupt endpoint*/# U: `% F$ a1 T' Q
  HID_IN_PACKET, /*wMaxPacketSize: 64 Byte max */  m  f/ S9 y- P* E* Z8 J! O
  0x00,
& J$ G/ T3 z  o7 n2 S4 J* V  0x0A,          /*bInterval: Polling Interval (10 ms)*/9 _( r% p8 f: p& ^* J8 C- l
  /* 34 */
' z0 w% J. d" k& g$ m  0x07,          /*bLength: Endpoint Descriptor size*/3 M9 `+ N% R$ [% K
  USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/0 S# H& D& A4 N+ l6 T# I
  - A! x" n$ I3 g8 z( I1 M
  HID_OUT_EP,     /*bEndpointAddress: Endpoint Address (IN)*/- B; c, n+ {8 M5 `$ y+ G% F
  0x02,          /*bmAttributes: Interrupt endpoint*/! T- r( ]" m8 o
  HID_IN_PACKET, /*wMaxPacketSize: 64 Byte max */- J2 _' k7 n- [0 H
  0x00,) c" b, E$ e7 q, J% _; O9 w
  0x0A,          /*bInterval: Polling Interval (10 ms)*/$ S) S; f1 r8 e4 r: R
  /*41*/( ~4 b$ s7 A6 S& Y+ s/ O
                 /********************  Mass Storage interface ********************/8 @" y. [- }! T4 `
  0x09,   /* bLength: Interface Descriptor size */  ~4 E: C# x/ Q) x* T/ F' m
  0x04,   /* bDescriptorType: */
: i. \3 Y% }. L# x2 ~8 U1 ]  0x01,   /* bInterfaceNumber: Number of Interface */
# r8 ~( ?* j; o* h' i) v" {  0x00,   /* bAlternateSetting: Alternate setting */* B: R  W" a$ c1 _9 H! M( N0 v1 M
  0x02,   /* bNumEndpoints*/
0 O- j2 A  y# N  0x08,   /* bInterfaceClass: MSC Class */0 K# ?5 ~5 s2 S$ i3 ?
  0x06,   /* bInterfaceSubClass : SCSI transparent*/
6 o( l0 z3 z5 n0 z  0x50,   /* nInterfaceProtocol */! p1 U1 ?- P3 b! a
  0x05,          /* iInterface: */" L7 b' E/ A* z! F7 Y# F
  /********************  Mass Storage Endpoints ********************/4 g. J' _5 M( {% t+ R
  0x07,   /*Endpoint descriptor length = 7*/
, l0 h7 A( q, h9 i/ N- Q- H& X  0x05,   /*Endpoint descriptor type */1 |5 ?! u1 y5 _! t
  MSC_IN_EP,   /*Endpoint address (IN, address 1) */  H$ C4 D# k9 [+ K
  0x02,   /*Bulk endpoint type */
. X6 @" O, G; Z+ q0 m4 [/ L  LOBYTE(MSC_MAX_PACKET),9 I" K7 x! G- }- w7 o9 b
  HIBYTE(MSC_MAX_PACKET),9 h! G6 s" I, h* i7 q* v
  0x00,   /*Polling interval in milliseconds */$ {0 `) b  u1 R
  
0 T9 p1 B$ c7 N/ I7 K8 n$ O1 y! N  0x07,   /*Endpoint descriptor length = 7 */
  T7 h$ H. F4 q3 `% s  0x05,   /*Endpoint descriptor type */
% H- d7 ~; D. ]+ v) k. j  MSC_OUT_EP,   /*Endpoint address (OUT, address 1) */8 e) n. w# ^/ J. s+ R. a& k
  0x02,   /*Bulk endpoint type */$ c8 Y! ]  G' h8 s
  LOBYTE(MSC_MAX_PACKET),
0 g( ~6 {4 u+ U" d  HIBYTE(MSC_MAX_PACKET),' J2 V- M2 `8 m/ Y% k- c
  0x00,     /*Polling interval in milliseconds*/+ l3 E1 T* ~0 r& g# I% c
};
3 k  \8 U8 v% v' I! h& g 8 Q# O$ `) I; D6 U# o
7 |' J2 \) N8 ?7 Y5 E* }
在usb_conf.h里
/ w& w$ e, ]. P: T/ z/ [5 F4 S- S#define USBD_CFG_MAX_NUM           1
1 U* f! y0 r8 J8 o' t#define USBD_ITF_MAX_NUM           1( N$ @8 y4 ~* ~, O
#define USB_MAX_STR_DESC_SIZ       64
. \* h! C- [) q  ^ , v* w+ Q# Q) k- n
#define USBD_SELF_POWERED               
* d1 x% g' C2 z' }+ N; T5 | # Z4 z# Z% E0 W/ ?) i5 _% J
/* Class Layer Parameter */6 L# L5 F' Q7 k* r% d% e! T# i
* \5 h2 k+ ^. {+ P2 K1 e5 @+ g. L
#define MSC_IN_EP                    0x82    /// 用于U盘4 I) }; v4 `( u0 c% s4 {  x# x! H3 a
#define MSC_OUT_EP                   0x02    /// 用于U盘
( [& O  [4 W3 f4 |% _2 @( e6 n3 c#ifdef USE_USB_OTG_HS  
1 G* i% N0 s- n% k. U* h! |2 a  ]9 K#ifdef USE_ULPI_PHY
$ P9 j: n  Y8 J7 e#define MSC_MAX_PACKET               512
! W( z) ]8 d# {) B: c4 X; I#else1 C" x  t$ I' @- r. q7 k
#define MSC_MAX_PACKET               64
% e9 [% s- y  m" R#endif- w1 `9 H% S- \7 ?) C5 d8 z, R
#else  /*USE_USB_OTG_FS*/% F/ s$ B* u/ N
#define MSC_MAX_PACKET                64# R) X- K4 c. d  S+ ^
#endif+ x6 {/ m, [2 o8 J2 c+ ^& V
' h! r9 V# \# F9 s+ k. K  W
#define HID_IN_EP                    0x81    用于控制# ]; L. |# l2 x1 T* {7 }' y
#define HID_OUT_EP                   0x01 用于控制: s/ b) i" R! G9 F  S" C

9 u* ?  N; G$ X  Y& P#define HID_IN_PACKET                0x40) v+ j+ \  t; g" ?
#define HID_OUT_PACKET               0x408 L9 ?# q/ a0 H7 Z
. c: H1 _: k- Q6 t
#define MSC_MEDIA_PACKET             4096: t/ M1 q) h1 {5 `8 l
添加相应的端口定义
" ^* Y; x0 ~2 F+ T1 o( I将HID历程的一些必须函数拼接到MSC里面
+ A+ K( F, ~2 Z+ d1 F) b; J, cQQ:393441746# {: y8 k) ?' e5 T' Z
欢迎一起交流STM32的知识,我使用过103 407 0307 R* x5 I! N/ c) B% o# h
或者直接在帖子里讨论 我常来的
5 g1 v* ~) c# T, o: e, h3 R库函数加快了我的开发
+ K( w5 N% k3 y( n2 z" j0 H3 X你还在使用串口吗,像当年玩串口一样使用USB 将是不一样的体验目前自己创业在做PM2.5传感器. E: P: |) e. L  s# B& l
http://shop144438126.taobao.com/?spm=a1z10.1-c.0.0.A2q64T. B4 V* A- a2 Z$ `" _

6 l* J$ Z( ?' O1 e7 N) y 7 E: }  |) X; C6 [" L
; c9 g# Q9 q' e& F0 B
- t7 k( H+ D* {4 Q- s, C. G
收藏 评论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发表:& X2 v" [9 k$ K9 t8 c; [; |* @1 L
在windows下,这个需要做驱动么?windows里面有MSC和HDI类的驱动,不装驱动试过没?
4 x1 M  U8 ]" l  p1 k" r我说了 用NI VISA  再用labview 操作  如果会C++的可以自己写一个
$ Z- k  ?' k, o$ X' `+ ^; T 
德华 回答时间: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发表:( p/ `$ W( W% u$ v+ ]0 c
但是,你要实现的是什么功能呢?能够识别就说明驱动已经识别成功了。你再做的应该是app,而不是driver了吧?不过用labview可能要装它自己另外做的驱动,而不用windows的通用驱动了。关键还是不知道你要实现啥功能,开始我以为是一个既当鼠标又当优盘的实现 8 s9 b5 G6 |9 I% X6 I7 H& C9 K
! \0 n3 \0 p8 X% k. I1 w' Q' P
我在里面配置时间  配置校准参数 配置采样率 配置等等 做成数据记录仪
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发表:
( L% I# C$ y; Q+ a0 }% f你好,楼主,你的usb存储设备的程序是什么写的,可以参考一下吗/ E* D3 `0 s) F+ ?$ ], ?! e
 
* G4 h6 H% X% K+ N3 L
2 f: O( ~6 ]. z+ Jkeil  项目应用 不好意思
德华 回答时间:2014-4-8 09:05:05

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

回复第 7 楼 于2014-04-05 23:09:05发表:$ u% j5 m6 U" p7 \0 S, ?
你好,楼主,你的usb存储设备的程序是什么写的,可以参考一下吗
( ?. s9 X. L& f+ }  J就这块描述符比较重要 剩下的没多大改动 在官方驱动上修改! @9 H. N1 e" @( t" d( L
 
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 手机版