设计目的:实现一个可以控制的U盘 USB口选用高速口,MSC选用SD卡(我用的eMMC) 设计思路:选择标准的历程MSC当做基础历程,U盘的功能就实现了,那么怎么做一个HID上去呢,就是修改描述符了,做一个复合设备的描述符,将HID历程的一些必须函数拼接到MSC里面,做好了设备驱动怎么弄呢,我也不会写 ,但是我安装了NI VISA 可以自己生成驱动文件,再用LABVIEW在线编程。5 f* C% r$ C/ _+ |% _0 X# J5 c _ALIGN_BEGIN uint8_t USBD_MSC_CfgDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END = {4 p9 g5 h0 \' i# m' d" W4 K - W2 t* D+ ^, J" J7 S$ m% F 0x09, /* bLength: Configuation Descriptor size */ USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */7 K& H, @& G/ r USB_MSC_CONFIG_DESC_SIZ,3 v e( H2 c/ ]7 }, D / d/ l- G( P) V7 w, T 0x00, 0x02, /* bNumInterfaces: 1 interface 既然是复合设备就应该有两个端口*/ 0x01, /* bConfigurationValue: */ 0x04, /* iConfiguration: */6 _2 P5 E/ f3 t. f( @1 x 0xC0, /* bmAttributes: */ 0x64, /* MaxPower 100 mA */ / Q. }: h4 X) \( L, G5 E/ v& U /************** Descriptor of Joystick Mouse interface ****************/% o6 m& o: f1 I& r! u! a /* 09 */* ?% J4 {1 _+ H/ s9 R) E8 T [ 0x09, /*bLength: Interface Descriptor size*/; G; S1 \- A; C/ ~$ {- W. o USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/( K/ i: o5 Z/ u& @- n" | 0x00, /*bInterfaceNumber: Number of Interface*/, ?' S7 V9 o) ? ` 0x00, /*bAlternateSetting: Alternate setting*/4 ^5 r, f5 E# H% J, P7 t4 j' ]7 \ 0x02, /*bNumEndpoints*/ 0x03, /*bInterfaceClass: HID*/ 0x00, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/9 `8 t; k: {. Z! W2 X 0x00, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/$ t( J2 ]1 G- X( u! t 0, /*iInterface: Index of string descriptor*/7 G1 a( M" @5 ^7 U" j! x) N' h6 u; m6 \6 d /******************** Descriptor of Joystick Mouse HID ********************/% r: w+ f* H$ u e7 @8 q /* 18 */ 0x09, /*bLength: HID Descriptor size*/ HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/ 0x11, /*bcdHID: HID Class Spec release number*/! X, \+ e. D v* r+ Q* h 0x01,% x# x% t# T9 E( c K, I. } 0x00, /*bCountryCode: Hardware target country*/ 0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/ 0x22, /*bDescriptorType*/ 33,/*wItemLength: Total length of Report descriptor*/ 0x00, /******************** Descriptor of Mouse endpoint ********************/# H# |5 p0 u! i5 I /* 27 */! _' } A i7 L! s6 n 0x07, /*bLength: Endpoint Descriptor size*/ USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/ 0 j' Q6 D5 u7 f4 a5 W) F) `# V) N HID_IN_EP, /*bEndpointAddress: Endpoint Address (IN)*/ 0x02, /*bmAttributes: Interrupt endpoint*/ HID_IN_PACKET, /*wMaxPacketSize: 64 Byte max */4 a! D# I) P( z, \- V: m4 C 0x00,( r1 s& [+ D- E1 p" d* R4 ^" L 0x0A, /*bInterval: Polling Interval (10 ms)*/ /* 34 */ 0x07, /*bLength: Endpoint Descriptor size*/ USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/- W+ ^5 Z3 r+ T4 |3 u HID_OUT_EP, /*bEndpointAddress: Endpoint Address (IN)*/ 0x02, /*bmAttributes: Interrupt endpoint*/ HID_IN_PACKET, /*wMaxPacketSize: 64 Byte max */ 0x00, 0x0A, /*bInterval: Polling Interval (10 ms)*/ /*41*/6 S; S0 H8 l/ {5 ~ I /******************** Mass Storage interface ********************/: W% {% I3 D+ O 0x09, /* bLength: Interface Descriptor size */; r" s" T( D# ]: L/ O4 s 0x04, /* bDescriptorType: */ 0x01, /* bInterfaceNumber: Number of Interface */ N9 B# p) e3 v P0 \8 a 0x00, /* bAlternateSetting: Alternate setting */" Y" W( X# C$ f0 p j 0x02, /* bNumEndpoints*/6 G. i# g4 ]( c V% f5 ? 0x08, /* bInterfaceClass: MSC Class */) N6 [7 u- @) L g$ o- e 0x06, /* bInterfaceSubClass : SCSI transparent*/ 0x50, /* nInterfaceProtocol */ 0x05, /* iInterface: */ /******************** Mass Storage Endpoints ********************/5 I. h; `$ T! y3 R! s 0x07, /*Endpoint descriptor length = 7*/3 N) t b8 v8 R 0x05, /*Endpoint descriptor type */8 X0 l* T" r- F. O MSC_IN_EP, /*Endpoint address (IN, address 1) */) n! F9 y- H- C1 F8 H* l 0x02, /*Bulk endpoint type */ LOBYTE(MSC_MAX_PACKET)," j o, W$ y9 v/ U HIBYTE(MSC_MAX_PACKET),6 R Y! C" m2 ~# `; N. P 0x00, /*Polling interval in milliseconds */# C3 s/ y$ W F* w b$ }5 W" A* W 0x07, /*Endpoint descriptor length = 7 */ 0x05, /*Endpoint descriptor type *// a% {5 n+ I6 D MSC_OUT_EP, /*Endpoint address (OUT, address 1) */: X( v ?# f4 E& t) V3 D# z 0x02, /*Bulk endpoint type */( e0 e; e+ e4 ] LOBYTE(MSC_MAX_PACKET), HIBYTE(MSC_MAX_PACKET), 0x00, /*Polling interval in milliseconds*/. m' k5 b& m9 o$ x3 v+ B& { }; 0 z# t$ c, N `% }1 g4 K! t # d; U+ W- Y! r2 @" p# U 在usb_conf.h里' z: b# }; W; i #define USBD_CFG_MAX_NUM 1 #define USBD_ITF_MAX_NUM 1 #define USB_MAX_STR_DESC_SIZ 64 $ W& y t+ t2 j3 u 8 D' [ f7 |9 \( Z1 C- U; Z #define USBD_SELF_POWERED 2 d* [& {- M- A. N /* Class Layer Parameter */ ( z& Q- j+ w$ \* K) ? #define MSC_IN_EP 0x82 /// 用于U盘: u# `0 @8 L" @7 R+ w #define MSC_OUT_EP 0x02 /// 用于U盘0 z# i0 x9 E6 y/ o #ifdef USE_USB_OTG_HS #ifdef USE_ULPI_PHY #define MSC_MAX_PACKET 512' ?7 [; d6 z F6 o #else #define MSC_MAX_PACKET 64 #endif #else /*USE_USB_OTG_FS*/ #define MSC_MAX_PACKET 640 S' e [& M/ z, G5 f: U+ C( X #endif+ h# F4 O' j7 a0 Z5 N/ } / v; E3 R9 B2 }6 i #define HID_IN_EP 0x81 用于控制 #define HID_OUT_EP 0x01 用于控制 # ^ I4 t$ ~3 j8 V2 K* X8 [/ R #define HID_IN_PACKET 0x40$ [$ ]6 P6 u. k$ k& m #define HID_OUT_PACKET 0x40 1 E" l, I1 e4 ]* g5 T) S9 y #define MSC_MEDIA_PACKET 4096 添加相应的端口定义 将HID历程的一些必须函数拼接到MSC里面' {3 M0 q% V1 V9 _& v5 j: W QQ:393441746 欢迎一起交流STM32的知识,我使用过103 407 0302 K2 k- U' ~5 B. y. L. v 或者直接在帖子里讨论 我常来的, s+ Z" D" I" X5 K1 j" H% t 库函数加快了我的开发: q4 Z% j' U" X% ] d" X8 N 你还在使用串口吗,像当年玩串口一样使用USB 将是不一样的体验目前自己创业在做PM2.5传感器$ X- t: @ x0 P @2 D/ T http://shop144438126.taobao.com/?spm=a1z10.1-c.0.0.A2q64T , q% h* k7 g, W6 f |
圈圈发布USB图书第二版有感,以及分享一些我学习USB过程...
STM32固件库分享,超全系列整理
最全USB HID开发资料,悉心整理一个月,亲自测试
【中文文档】AN3965_STM32F40x和STM32F41x基于串口的IAP
USB Audio设计与实现
【MCU实战经验】+STM32F107的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的通用驱动了。关键还是不知道你要实现啥功能,开始我以为是一个既当鼠标又当优盘的实现 , L1 T3 P! {% N1 U" A U- D- E, ?9 i
我在里面配置时间 配置校准参数 配置采样率 配置等等 做成数据记录仪
回复:【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)
回复:【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)
你好,楼主,你的usb存储设备的程序是什么写的,可以参考一下吗& C% y3 k) J; R; N3 l# Y5 a" l- v
keil 项目应用 不好意思
回复:【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)
你好,楼主,你的usb存储设备的程序是什么写的,可以参考一下吗9 P$ @4 E/ C( }8 L
就这块描述符比较重要 剩下的没多大改动 在官方驱动上修改
回复:【MCU实战经验】+STM32F407=USB符合设备(HID+MSC)