
设计目的:实现一个可以控制的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 = { 0x09, /* bLength: Configuation Descriptor size */ USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ USB_MSC_CONFIG_DESC_SIZ,5 X& `9 w# m% C7 F9 L 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 /************** Descriptor of Joystick Mouse interface ****************/+ w) L- h8 V7 N+ L; H /* 09 */ 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*/ 0x02, /*bNumEndpoints*/# F% v& E1 \/ n. i9 ?, a 0x03, /*bInterfaceClass: HID*/ 0x00, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/! q9 L9 @+ u% N; A 0x00, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/ 0, /*iInterface: Index of string descriptor*/ /******************** Descriptor of Joystick Mouse HID ********************/ /* 18 */ 0x09, /*bLength: HID Descriptor size*/ HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/ 0x11, /*bcdHID: HID Class Spec release number*/# O% Q$ O$ L5 C( B8 b 0x01, 0x00, /*bCountryCode: Hardware target country*/ 0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/9 }' T* o1 r3 p( f; s1 U; ? 0x22, /*bDescriptorType*/ 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 ********************/ /* 27 */ 0x07, /*bLength: Endpoint Descriptor size*/ 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)*/ 0x02, /*bmAttributes: Interrupt endpoint*/3 q u0 k+ H( ^1 t# X- E1 r HID_IN_PACKET, /*wMaxPacketSize: 64 Byte max */ 0x00,# d+ Z; \" P' m$ p# o7 T 0x0A, /*bInterval: Polling Interval (10 ms)*/8 q! b+ y, ~0 U+ f9 |; D5 h /* 34 */ 0x07, /*bLength: Endpoint Descriptor size*/ USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/ HID_OUT_EP, /*bEndpointAddress: Endpoint Address (IN)*/( C2 \. h" Z( i9 q3 F9 v5 o 0x02, /*bmAttributes: Interrupt endpoint*/ HID_IN_PACKET, /*wMaxPacketSize: 64 Byte max */1 T8 B1 y. q- y' G e1 f% w: ^ 0x00, 0x0A, /*bInterval: Polling Interval (10 ms)*/ /*41*/ /******************** Mass Storage interface ********************/% b* H3 u* m O1 f7 j4 t 0x09, /* bLength: Interface Descriptor size */ 0x04, /* bDescriptorType: */8 G7 Y r& d* V6 V0 E 0x01, /* bInterfaceNumber: Number of Interface */ 0x00, /* bAlternateSetting: Alternate setting */ 0x02, /* bNumEndpoints*/1 z9 f. H# t8 J% |- ^% a 0x08, /* bInterfaceClass: MSC Class */$ z. h$ K* I7 ? 0x06, /* bInterfaceSubClass : SCSI transparent*/ 0x50, /* nInterfaceProtocol */ 0x05, /* iInterface: */ /******************** Mass Storage Endpoints ********************/ 0x07, /*Endpoint descriptor length = 7*/! x m9 e0 ` ?2 t" K 0x05, /*Endpoint descriptor type */ MSC_IN_EP, /*Endpoint address (IN, address 1) */ 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), 0x00, /*Polling interval in milliseconds */ 8 ]2 Y1 L }/ f/ N# ^ 0x07, /*Endpoint descriptor length = 7 */ 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 */ LOBYTE(MSC_MAX_PACKET), HIBYTE(MSC_MAX_PACKET),, D6 h: h: [4 j3 v4 S# e 0x00, /*Polling interval in milliseconds*/ }; 8 G# p8 i% T8 \ 在usb_conf.h里 #define USBD_CFG_MAX_NUM 1 #define USBD_ITF_MAX_NUM 1! t" p1 r) n. N& D | #define USB_MAX_STR_DESC_SIZ 64 ; o: m8 Y; i8 D9 z& k# }6 { #define USBD_SELF_POWERED 6 k2 X: q& p( n5 t /* Class Layer Parameter */1 }* g; p$ r# e$ {8 Q #define MSC_IN_EP 0x82 /// 用于U盘 #define MSC_OUT_EP 0x02 /// 用于U盘 #ifdef USE_USB_OTG_HS ) s: f( ]/ B& q E8 ~ #ifdef USE_ULPI_PHY #define MSC_MAX_PACKET 512 #else #define MSC_MAX_PACKET 64& e; p: N1 V! O #endif #else /*USE_USB_OTG_FS*/, u6 p! @" V6 n' p/ ]. M #define MSC_MAX_PACKET 64( f0 K: C8 X6 b h #endif #define HID_IN_EP 0x81 用于控制 #define HID_OUT_EP 0x01 用于控制4 B" O: f9 Q: X$ S( R" I U# N$ ^* ]% ` V8 I #define HID_IN_PACKET 0x40 #define HID_OUT_PACKET 0x40 #define MSC_MEDIA_PACKET 4096 添加相应的端口定义 将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 |
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的通用驱动了。关键还是不知道你要实现啥功能,开始我以为是一个既当鼠标又当优盘的实现
我在里面配置时间 配置校准参数 配置采样率 配置等等 做成数据记录仪
回复:【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)
回复:【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)
你好,楼主,你的usb存储设备的程序是什么写的,可以参考一下吗
/ X- w8 a* |# ^+ `
keil 项目应用 不好意思
回复:【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)
你好,楼主,你的usb存储设备的程序是什么写的,可以参考一下吗+ O% L' j8 U/ L5 E8 n6 }( ]
就这块描述符比较重要 剩下的没多大改动 在官方驱动上修改2 A$ Z$ Q' ?" r
回复:【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)