
设计目的:实现一个可以控制的U盘 USB口选用高速口,MSC选用SD卡(我用的eMMC)5 p0 h: N# D2 _ c 设计思路:选择标准的历程MSC当做基础历程,U盘的功能就实现了,那么怎么做一个HID上去呢,就是修改描述符了,做一个复合设备的描述符,将HID历程的一些必须函数拼接到MSC里面,做好了设备驱动怎么弄呢,我也不会写 ,但是我安装了NI VISA 可以自己生成驱动文件,再用LABVIEW在线编程。 _ALIGN_BEGIN uint8_t USBD_MSC_CfgDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END =6 l, j2 W k: N7 S5 ~, R3 n { 0x09, /* bLength: Configuation Descriptor size */ USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */. N: U; ^& S% o2 U USB_MSC_CONFIG_DESC_SIZ, 2 M- ]+ s$ l/ ]" |7 w# ^/ ^7 h0 s 0x00, 0x02, /* bNumInterfaces: 1 interface 既然是复合设备就应该有两个端口*/ 0x01, /* bConfigurationValue: */" y( m: [6 t2 H- P7 F7 J 0x04, /* iConfiguration: */ 0xC0, /* bmAttributes: */2 e9 y- @& G4 p( ?2 P 0x64, /* MaxPower 100 mA */ /************** Descriptor of Joystick Mouse interface ****************/ /* 09 */( u3 a0 d O! b2 Y7 g 0x09, /*bLength: Interface Descriptor size*/ USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/ 0x00, /*bInterfaceNumber: Number of Interface*/8 s/ z( _( R( y" P 0x00, /*bAlternateSetting: Alternate setting*/3 J. ?+ D( I! \4 M: F 0x02, /*bNumEndpoints*/ 0x03, /*bInterfaceClass: HID*/- ?: r/ s' ^5 Z' |! t0 ] 0x00, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/ 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 ********************/ /* 18 */ 0x09, /*bLength: HID Descriptor size*/5 l4 u* i4 Q# m HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/ 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*/ 0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/( D3 Q( O' j+ n9 E 0x22, /*bDescriptorType*/ 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 ********************/ /* 27 */ 0x07, /*bLength: Endpoint Descriptor size*/2 V, {; W5 d$ D0 Q# S/ G USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/& C# z9 ?1 v- K# X 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, 0x0A, /*bInterval: Polling Interval (10 ms)*/9 _( r% p8 f: p& ^* J8 C- l /* 34 */ 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: */ 0x01, /* bInterfaceNumber: Number of Interface */ 0x00, /* bAlternateSetting: Alternate setting */* B: R W" a$ c1 _9 H! M( N0 v1 M 0x02, /* bNumEndpoints*/ 0x08, /* bInterfaceClass: MSC Class */0 K# ?5 ~5 s2 S$ i3 ? 0x06, /* bInterfaceSubClass : SCSI transparent*/ 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*/ 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 */ 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 0x07, /*Endpoint descriptor length = 7 */ 0x05, /*Endpoint descriptor type */ 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), 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 }; 8 Q# O$ `) I; D6 U# o 7 |' J2 \) N8 ?7 Y5 E* } 在usb_conf.h里 #define USBD_CFG_MAX_NUM 1 #define USBD_ITF_MAX_NUM 1( N$ @8 y4 ~* ~, O #define USB_MAX_STR_DESC_SIZ 64 , v* w+ Q# Q) k- n #define USBD_SELF_POWERED # 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盘 #ifdef USE_USB_OTG_HS #ifdef USE_ULPI_PHY #define MSC_MAX_PACKET 512 #else1 C" x t$ I' @- r. q7 k #define MSC_MAX_PACKET 64 #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 #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 添加相应的端口定义 将HID历程的一些必须函数拼接到MSC里面 QQ:393441746# {: y8 k) ?' e5 T' Z 欢迎一起交流STM32的知识,我使用过103 407 0307 R* x5 I! N/ c) B% o# h 或者直接在帖子里讨论 我常来的 库函数加快了我的开发 你还在使用串口吗,像当年玩串口一样使用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$ `" _ 7 E: } |) X; C6 [" L ; c9 g# Q9 q' e& F0 B - t7 k( H+ D* {4 Q- s, C. G |
RE:【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)
回复:【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)
在windows下,这个需要做驱动么?
我说了 用NI VISA 再用labview 操作 如果会C++的可以自己写一个
RE:【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)
RE:【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)
回复:【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)
但是,你要实现的是什么功能呢?能够识别就说明驱动已经识别成功了。你再做的应该是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
我在里面配置时间 配置校准参数 配置采样率 配置等等 做成数据记录仪
回复:【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)
回复:【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)
你好,楼主,你的usb存储设备的程序是什么写的,可以参考一下吗/ E* D3 `0 s) F+ ?$ ], ?! e
keil 项目应用 不好意思
回复:【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)
你好,楼主,你的usb存储设备的程序是什么写的,可以参考一下吗
就这块描述符比较重要 剩下的没多大改动 在官方驱动上修改! @9 H. N1 e" @( t" d( L
回复:【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)