设计目的:实现一个可以控制的U盘 USB口选用高速口,MSC选用SD卡(我用的eMMC)( R1 |' M7 ~7 `. W/ E8 S- T 设计思路:选择标准的历程MSC当做基础历程,U盘的功能就实现了,那么怎么做一个HID上去呢,就是修改描述符了,做一个复合设备的描述符,将HID历程的一些必须函数拼接到MSC里面,做好了设备驱动怎么弄呢,我也不会写 ,但是我安装了NI VISA 可以自己生成驱动文件,再用LABVIEW在线编程。 _ALIGN_BEGIN uint8_t USBD_MSC_CfgDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END =, V6 B7 H6 f2 W. [! F1 C9 Z { 0x09, /* bLength: Configuation Descriptor size */ USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ USB_MSC_CONFIG_DESC_SIZ,9 M+ h. S$ f* F6 K+ ^/ A - @1 K/ R- l8 ]$ O$ S' F2 J 0x00,# p8 d: B; Y) \. U- n 0x02, /* bNumInterfaces: 1 interface 既然是复合设备就应该有两个端口*/ 0x01, /* bConfigurationValue: */ 0x04, /* iConfiguration: */ G6 h5 L5 G+ N. B5 V/ _# T5 n 0xC0, /* bmAttributes: */ 0x64, /* MaxPower 100 mA */7 r* Z( j3 L% w* a0 L; C6 U 4 n8 Q j+ U7 D2 x) X1 H1 T /************** Descriptor of Joystick Mouse interface ****************/" _$ l: t- m E$ n /* 09 */9 F1 }' Q7 e& ?/ q. { 0x09, /*bLength: Interface Descriptor size*/; g$ f5 Q. a# u! G, k# v USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/ 0x00, /*bInterfaceNumber: Number of Interface*/* q2 ?8 F5 V, \) I 0x00, /*bAlternateSetting: Alternate setting*/, |) I4 o5 G o& f" C5 ?& N 0x02, /*bNumEndpoints*/ 0x03, /*bInterfaceClass: HID*/5 O4 ]; n& _$ ]. ~ 0x00, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/ 0x00, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/ 0, /*iInterface: Index of string descriptor*/6 u# `# }' X5 O; O" @5 }! W /******************** Descriptor of Joystick Mouse HID ********************/+ b$ u* Z. v: x: ~3 @7 K /* 18 */) m/ X+ g$ n6 o2 P, C 0x09, /*bLength: HID Descriptor size*/ HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/- z8 A' u# f: b4 S7 n 0x11, /*bcdHID: HID Class Spec release number*/0 |& W9 `) \8 v" O+ u8 d3 i 0x01, K: r) C: P1 J 0x00, /*bCountryCode: Hardware target country*/ 0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/ 0x22, /*bDescriptorType*/3 i) D% T3 E! D- n 33,/*wItemLength: Total length of Report descriptor*/; v: W; I5 ~, w0 m( ]: D# ` 0x00,* n H/ v+ C5 ?8 F4 l% D7 a /******************** Descriptor of Mouse endpoint ********************// w$ x v4 ?' q: O' f' J /* 27 */, f! I* _! W4 ?1 n9 l* h 0x07, /*bLength: Endpoint Descriptor size*/* o( Z7 I1 G8 N7 l, [& h9 U8 W1 W) ~- j USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/ " ?8 E4 Z3 C& C0 I: ^! j HID_IN_EP, /*bEndpointAddress: Endpoint Address (IN)*/( X! g6 w/ g8 ?, e5 { Z: Y8 k 0x02, /*bmAttributes: Interrupt endpoint*/2 C, H# u; I- ~( `# _ HID_IN_PACKET, /*wMaxPacketSize: 64 Byte max */, q/ O6 C- \3 k# e 0x00,1 S. }* j6 w% q+ ~ q. h9 ? 0x0A, /*bInterval: Polling Interval (10 ms)*/ /* 34 */ 0x07, /*bLength: Endpoint Descriptor size*/ USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/% ^# a: n7 X+ R8 y6 G HID_OUT_EP, /*bEndpointAddress: Endpoint Address (IN)*/ 0x02, /*bmAttributes: Interrupt endpoint*/: s) J! J/ n0 D h HID_IN_PACKET, /*wMaxPacketSize: 64 Byte max */( v6 m: i& t, T; ?. b8 J5 }: G/ ` 0x00,* X+ g1 }( D3 V9 }( [2 n7 b o8 e 0x0A, /*bInterval: Polling Interval (10 ms)*/0 E& H/ o9 o6 i$ L$ L /*41*/ /******************** Mass Storage interface ********************/; Q/ @- ~/ c, u6 g+ C! { 0x09, /* bLength: Interface Descriptor size */ 0x04, /* bDescriptorType: */ 0x01, /* bInterfaceNumber: Number of Interface */ 0x00, /* bAlternateSetting: Alternate setting */ 0x02, /* bNumEndpoints*/ 0x08, /* bInterfaceClass: MSC Class */ 0x06, /* bInterfaceSubClass : SCSI transparent*/ 0x50, /* nInterfaceProtocol */ 0x05, /* iInterface: */$ {- P2 a6 M9 h3 V* W /******************** Mass Storage Endpoints ********************/, S. Z, U7 s7 J2 g3 F1 j 0x07, /*Endpoint descriptor length = 7*/. U6 R/ n& a* C! e( ] 0x05, /*Endpoint descriptor type */& t& `2 v/ l7 @6 ~# g: v MSC_IN_EP, /*Endpoint address (IN, address 1) */ 0x02, /*Bulk endpoint type */7 W& d' y3 u/ G8 s* G$ @ LOBYTE(MSC_MAX_PACKET)," a, x6 T, s l$ t HIBYTE(MSC_MAX_PACKET),4 `5 u) F) p/ c) y8 f! y 0x00, /*Polling interval in milliseconds */ 0x07, /*Endpoint descriptor length = 7 */2 A) U4 o! S; o! z 0x05, /*Endpoint descriptor type */ MSC_OUT_EP, /*Endpoint address (OUT, address 1) */, s0 X! _6 n1 A2 s; y# T7 ` 0x02, /*Bulk endpoint type */ LOBYTE(MSC_MAX_PACKET),) v- Y2 }5 D4 C HIBYTE(MSC_MAX_PACKET), 0x00, /*Polling interval in milliseconds*/ };' }, q0 @& u! ` 在usb_conf.h里" E3 ^1 J+ J7 c0 M #define USBD_CFG_MAX_NUM 11 [! i/ _+ i: X+ S# P #define USBD_ITF_MAX_NUM 1 #define USB_MAX_STR_DESC_SIZ 64 6 Y% P: P5 ~: t+ C; C- m% ~. E/ G ; @# n3 R6 ^# W# k8 b #define USBD_SELF_POWERED /* Class Layer Parameter */ % i( |" D) A0 l% b4 d5 }* Z #define MSC_IN_EP 0x82 /// 用于U盘 #define MSC_OUT_EP 0x02 /// 用于U盘 #ifdef USE_USB_OTG_HS 8 ?0 p3 h8 {( L$ |. Z4 U' s #ifdef USE_ULPI_PHY- T. h M+ ^8 ^$ A% l+ d #define MSC_MAX_PACKET 5128 P- O9 d7 b4 D. G v #else1 a5 Z, T7 W) ?/ p. u3 ?4 a #define MSC_MAX_PACKET 64 #endif. U3 ~3 p3 I2 A+ r: o* Q2 I #else /*USE_USB_OTG_FS*/+ o( d4 ?1 j& X4 t! u; A. V #define MSC_MAX_PACKET 64 #endif# i% x2 m: ^# U* x( O #define HID_IN_EP 0x81 用于控制 #define HID_OUT_EP 0x01 用于控制2 K' H% a$ o% A #define HID_IN_PACKET 0x408 F2 d2 p, v& r/ ]+ L5 S' { #define HID_OUT_PACKET 0x40 #define MSC_MEDIA_PACKET 4096 添加相应的端口定义 将HID历程的一些必须函数拼接到MSC里面 QQ:3934417461 M% U" ? N0 P0 l% ? 欢迎一起交流STM32的知识,我使用过103 407 0300 D: D1 G1 ~8 h# q9 u/ r 或者直接在帖子里讨论 我常来的/ o' R$ [) X, J' M 库函数加快了我的开发% R; [0 `, P8 j I8 e, n 你还在使用串口吗,像当年玩串口一样使用USB 将是不一样的体验目前自己创业在做PM2.5传感器 http://shop144438126.taobao.com/?spm=a1z10.1-c.0.0.A2q64T 9 e; U6 G$ t; Y! r# r5 c 3 ~: w9 M. ~; m8 p0 J 3 Z5 B$ ^) I: k0 C: N7 q |
STM32固件库分享,超全系列整理
最全USB HID开发资料,悉心整理一个月,亲自测试
【中文文档】AN3965_STM32F40x和STM32F41x基于串口的IAP
USB Audio设计与实现
【MCU实战经验】+STM32F107的USB使用
圈圈发布USB图书第二版有感,以及分享一些我学习USB过程...
STM32F4-DISC 实现USB主机(U盘)和USB设备(虚拟串口)自动切换
STM32 USB-HID通信移植步骤STM32 USB HID键盘例程
STM32F4中文用户手册
基于STM32F407的FreeRTOS阶段性的总结(13)
RE:【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)
回复:【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)
在windows下,这个需要做驱动么?windows里面有MSC和HDI类的驱动,不装驱动试过没?
我说了 用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的通用驱动了。关键还是不知道你要实现啥功能,开始我以为是一个既当鼠标又当优盘的实现
我在里面配置时间 配置校准参数 配置采样率 配置等等 做成数据记录仪
回复:【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)
回复:【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)
你好,楼主,你的usb存储设备的程序是什么写的,可以参考一下吗
' N" i! B) @! u; {9 |" v
) T5 F* [. n* O& v
keil 项目应用 不好意思
回复:【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)
你好,楼主,你的usb存储设备的程序是什么写的,可以参考一下吗( v0 t* J7 i" s; z; W: u
就这块描述符比较重要 剩下的没多大改动 在官方驱动上修改0 d O( Q; I$ A# r2 Y+ g# p
回复:【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)