最全USB HID开发资料,悉心整理一个月,亲自测试
【源码】STLINK-V3MINI 高速USB仿真器,成功改刷【高速CMSIS-DAP】
入门嵌入式,为什么STM32是“优选起步”?
STM32和Arduino对比,谁更耐打?
STM32串口自动识别波特率的原理
STM32 USB CDC 虚拟多串口
实战经验 | 选择USBX模块生成USB CDC ACM无PD的项目
STM32超详细学习笔记
新手必看!STM32单片机应该怎么学?
如果你解决了这些问题,就可以直接学STM32
微信公众号
手机版
RE:STM32F207的host USB的MSC和HID的合并开发
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
电路很简单,占用F207的HS-usb:
回复:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
继续发图:& D) t2 `( W+ ?6 S' y4 }" B7 k) e
电路很简单,占用F207的HS-usb:
) \5 u' E1 w; y
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev){
GPIO_InitTypeDef GPIO_InitStructure;$ k& ?* E6 O8 B: L
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB , ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 |
GPIO_Pin_13 |
GPIO_Pin_14 | 3 O/ ~2 _ A$ w
GPIO_Pin_15;2 H) {4 H% o& W( [% o0 o- d
2 L4 V2 e& @( B0 [1 I
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;( e1 F4 k8 [: Y# v7 I$ e
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;* @6 q% |# U' K0 w; J6 |& @& m" k+ q5 w
GPIO_Init(GPIOB, &GPIO_InitStructure); ; |* r( }, n$ S: S' j
GPIO_PinAFConfig(GPIOB,GPIO_PinSource12, GPIO_AF_OTG2_FS) ;
GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_OTG2_FS) ;
GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_OTG2_FS) ; & Y+ y, D' d; t8 c1 a
GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_OTG2_FS) ;# e- @/ q- i! ]1 e" l
//---------------------------------------------------------------+ k4 j$ g( O6 ]& A
RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_OTG_HS, ENABLE) ; ) B) x/ Q' H5 o- m/ A+ e+ Q
//-----------------------------------------------------------------' R3 g- o- p$ ^$ S
//Vbus_EN 根据实际电路修改!2 E. q. Q; J3 ^, Z! c1 L+ A2 J
RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOE , ENABLE) ; : ^+ }9 ^0 j) ]; }0 X) @
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; W, S1 l2 q; Z" v5 B* Z
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;' } f! |# M4 c. ?% M$ k( {
GPIO_Init(GPIOE, &GPIO_InitStructure);/ m8 h7 x; ]: P9 o7 W; n& N! u
: [& g! O0 U) r' z! i' [9 o& M
GPIO_ResetBits(GPIOE, GPIO_Pin_0);
//-------------------------------------------------------------------* h6 P! {2 ]9 b
USB_OTG_BSP_TimeInit();! j! m9 N# H0 r/ v: \7 R
USB_OTG_BSP_mDelay(500); //Delay is need for stabilising the Vbus Low - g& i6 S) v: n% n3 ?! G7 x6 r
}
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
#ifndef USE_USB_OTG_HS% W: ^0 h- G) v# o# h) u
#define USE_USB_OTG_HS
#endif /* USE_USB_OTG_HS */
#ifndef USE_ULPI_PHY, ]& ^* o3 b0 r" B) j
//#define USE_ULPI_PHY
#endif /* USE_ULPI_PHY */
#ifndef USE_EMBEDDED_PHY+ Q( I" v) d. A0 z [
#define USE_EMBEDDED_PHY; D7 B* L6 J { ?
#endif /* USE_EMBEDDED_PHY */2 \( }+ Q/ q8 T0 u* n% {9 K: m
#ifdef USE_USB_OTG_HS
#define USB_OTG_HS_CORE" ~$ D7 y7 K+ z: V$ b+ S
#endif
/*******************************************************************************1 K4 t8 K- Q4 X
* FIFO Size Configuration in Host mode
*
* (i) Receive data FIFO size = (Largest Packet Size / 4) + 1 or
* 2x (Largest Packet Size / 4) + 1, If a / h. v+ a6 O/ J$ F9 c1 h
* high-bandwidth channel or multiple isochronous
* channels are enabled0 v7 a( q9 ^& {2 h2 g y
*
* (ii) For the host nonperiodic Transmit FIFO is the largest maximum packet size
* for all supported nonperiodic OUT channels. Typically, a space : {( F4 E6 y- _
* corresponding to two Largest Packet Size is recommended.0 x0 v% |( t, l) d9 l6 u+ T
*
* (iii) The minimum amount of RAM required for Host periodic Transmit FIFO is - T0 h2 y P6 V y' j* S" P
* the largest maximum packet size for all supported periodic OUT channels.* }" [' L& B- K' [7 }
* If there is at least one High Bandwidth Isochronous OUT endpoint, 2 @8 S' F1 u, c6 |
* then the space must be at least two times the maximum packet size for / [/ [5 k2 }9 x2 ]% l; k
* that channel.
*******************************************************************************/
/****************** USB OTG HS CONFIGURATION **********************************/8 q d$ _( K2 b3 J6 s* l* _
#ifdef USB_OTG_HS_CORE/ y6 N8 v; i: I& D9 Q. w* q9 y* J9 h
#define RX_FIFO_HS_SIZE 512, Y; c1 {+ ?: o, w
#define TXH_NP_HS_FIFOSIZ 256
#define TXH_P_HS_FIFOSIZ 256
// #define USB_OTG_HS_LOW_PWR_MGMT_SUPPORT
// #define USB_OTG_HS_SOF_OUTPUT_ENABLED9 R# Z0 v! _' ]
#ifdef USE_ULPI_PHY
#define USB_OTG_ULPI_PHY_ENABLED" A% g9 D2 L1 I
#endif
#ifdef USE_EMBEDDED_PHY
#define USB_OTG_EMBEDDED_PHY_ENABLED
#endif
#define USB_OTG_HS_INTERNAL_DMA_ENABLED
#define USB_OTG_EXTERNAL_VBUS_ENABLED
//#define USB_OTG_INTERNAL_VBUS_ENABLED
#endif; O2 @ g" o" M2 ~3 |
/****************** USB OTG FS CONFIGURATION **********************************/
#ifdef USB_OTG_FS_CORE
#define RX_FIFO_FS_SIZE 128+ M* h. O, ~! B3 N/ ? a
#define TXH_NP_FS_FIFOSIZ 965 `% h! c6 I+ c. [: z
#define TXH_P_FS_FIFOSIZ 965 o% q y l2 j5 j
// #define USB_OTG_FS_LOW_PWR_MGMT_SUPPORT
// #define USB_OTG_FS_SOF_OUTPUT_ENABLED
#endif- B( p$ I D& Z- {* c
/****************** USB OTG MODE CONFIGURATION ********************************/0 s6 }# g- x$ ^9 \
#define USE_HOST_MODE& M( F& P7 J1 N6 @
//#define USE_DEVICE_MODE1 t0 t$ ^" e+ d( |0 }
//#define USE_OTG_MODE. t( X0 ~& f/ k
#ifndef USB_OTG_FS_CORE0 O9 ~& r3 H d9 f. R: r% R7 H* b$ g% a
#ifndef USB_OTG_HS_CORE5 y O \" d' U/ R. q+ _
#error "USB_OTG_HS_CORE or USB_OTG_FS_CORE should be defined"5 x/ O; I# l3 o) a$ G3 s2 c7 \) W6 X
#endif1 z+ C5 a; C0 h3 X. n& N% w U: ~4 _9 @4 `
#endif6 m J) D6 t2 }' k8 p/ v
#ifndef USE_DEVICE_MODE
#ifndef USE_HOST_MODE
#error "USE_DEVICE_MODE or USE_HOST_MODE should be defined"8 z$ X, `7 h. T
#endif
#endif5 v' n6 B3 N$ `) ^2 ^. I/ J
#ifndef USE_USB_OTG_HS2 E) Y4 X) V. N# z
#ifndef USE_USB_OTG_FS
#error "USE_USB_OTG_HS or USE_USB_OTG_FS should be defined"9 H/ Q' n7 |6 h" Q ?& M
#endif5 T1 |) K8 s0 a
#else //USE_USB_OTG_HS8 L# I$ z. z, b3 y" p- p8 g
#ifndef USE_ULPI_PHY
#ifndef USE_EMBEDDED_PHY
#error "USE_ULPI_PHY or USE_EMBEDDED_PHY should be defined"& ~0 i2 X8 ~/ G" y/ m3 t" K' w
#endif4 u0 J7 P) ~8 ?0 @, N! V" n
#endif
#endif" R5 c) U, N! [, V/ R
/****************** C Compilers dependant keywords ****************************/3 L. v" x4 Y. g3 l- I0 d3 _1 l, H! {3 Q
/* In HS mode and when the DMA is used, all variables and data structures dealing0 e5 Q- ]0 o7 p; |8 r
with the DMA during the transaction process should be 4-bytes aligned */ & }# w* x9 C8 U9 \/ _" q
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
#if defined (__GNUC__) /* GNU Compiler */
#define __ALIGN_END __attribute__ ((aligned (4)))
#define __ALIGN_BEGIN A& j0 X7 L% a6 H) m
#else
#define __ALIGN_END
#if defined (__CC_ARM) /* ARM Compiler */
#define __ALIGN_BEGIN __align(4) - v3 J7 _8 M! s2 s& L
#elif defined (__ICCARM__) /* IAR Compiler */
#define __ALIGN_BEGIN / ~8 D! `5 V9 Q) {" T, y& \. W
#elif defined (__TASKING__) /* TASKING Compiler */) b$ \) M7 u/ |) @, T' r* O
#define __ALIGN_BEGIN __align(4)
#endif /* __CC_ARM */ : l- Y/ ]# X% |6 i7 S
#endif /* __GNUC__ */
#else
#define __ALIGN_BEGIN
#define __ALIGN_END
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
/* __packed keyword used to decrease the data type alignment to 1-byte */. b \% |& V. n3 [, G
#if defined (__CC_ARM) /* ARM Compiler */! i0 r9 U1 v+ [5 i7 H; i
#define __packed __packed
#elif defined (__ICCARM__) /* IAR Compiler */
#define __packed __packed
#elif defined ( __GNUC__ ) /* GNU Compiler */
#define __packed __attribute__ ((__packed__))) b: {6 f& t& K# }: j2 T
#elif defined (__TASKING__) /* TASKING Compiler */5 @. M2 v5 l2 E! U0 h, A) w
#define __packed __unaligned- E8 u/ h; }% @4 n8 }. T4 E
#endif /* __CC_ARM */
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
int main(void){( w: P3 `4 R; _" K
/*!< At this stage the microcontroller clock setting is already configured,
this is done through SystemInit() function which is called from startup
file (startup_stm32fxxx_xx.s) before to branch to application main.: A+ k& Q) N6 P, b. X5 C, I
To reconfigure the default setting of SystemInit() function, refer to1 d! i) I& E7 A
system_stm32fxxx.c file" Z+ R9 ?, H* F1 K- @) K
*/ # X& R6 z. a( U# ^
, y: w4 k% B* d
/* Init Host Library */
USBH_Init(&USB_OTG_Core,
USB_OTG_HS_CORE_ID,$ [6 `& V$ U- c8 h" n/ c! [* a
&USB_Host,' ^( {0 r% Y5 Y& }* v5 b3 d/ h
&USBH_MSC_cb,
&USR_cb);
while (1){! r& L9 P3 ?6 K/ [; v7 ]3 {
/* Host Task handler */
USBH_Process(&USB_OTG_Core, &USB_Host);8 j' w1 w; h4 ?; j% W
if(iapRun==0){; r z: v: ]1 T3 T. b7 t* {
IAP_URN_UserProgrammer();: R* ~7 K; N; @% R3 f# s! N
}: J- G2 D9 Q( a
}9 D% z; a- N3 R* F
}
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
case HOST_USR_INPUT: 9 \4 j5 U6 _9 _2 d, m
/*The function should return user response true to move to class state */. T- q# s: s- c6 g9 g
//修改:添加MSC-HID自动判别,然后再初始化CALSS-CB
if(JB_MSC_HID(phost,0)){ //0:判别MSC,1:判别HID
SetHOST_USB_MODE(0);
phost->class_cb=&USBH_MSC_cb;' ^7 P' W2 j) I
if((phost->class_cb->Init(pdev, phost)) == USBH_OK){* u3 [" U: M: s/ W2 ^
phost->gState = HOST_CLASS_REQUEST; - B" d" T# @( `& Z
} 0 s' d. t" p: ^ J8 \1 w+ z1 r
}else{1 c9 G# o4 r# W0 X; u
if(JB_MSC_HID(phost,1)){ //0:判别MSC,1:判别HID
SetHOST_USB_MODE(1);6 [) t' O M; a" c
phost->class_cb=&HID_cb;, _; d( N6 B+ g; t3 b1 `' a
//phost->usr_cb=&USR_Callbacks;//???????5 O0 s9 _6 A6 Q. l0 O8 T
if((phost->class_cb->Init(pdev, phost)) == USBH_OK){
phost->gState = HOST_CLASS_REQUEST; 2 L: h2 z7 G: a" n _: N, O! f
}
}; k# _" g. L7 R" P
} 7 P8 U0 V' S8 H5 \* b0 t$ a8 n# ?
break;
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
/* Check for enumeration status */ ; d; d6 n" U1 h& c; w, r
if ( USBH_HandleEnum(pdev , phost) == USBH_OK){ ' g0 ^( {6 J, I% L
/* The function shall return USBH_OK when full enumeration is complete */
9 e4 G( Z5 F" M3 t
/* user callback for end of device basic enumeration */
phost->usr_cb->EnumerationDone();
9 p4 @ {9 h ] _* B0 B$ O
phost->gState = HOST_USR_INPUT;
}
break;
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
//修改:添加MSC-HID自动判别,然后再初始化CALSS-CB
unsigned char JB_MSC_HID(USBH_HOST *phost,unsigned char flag){//0:判别MSC,1:判别HID5 A$ k! o8 `+ n6 T' A
- V- ]; e0 U6 N5 Q, Q
if(flag==0){8 r3 b( e" h8 S, N$ a3 S
if(phost->device_prop.Itf_Desc[0].bInterfaceClass == MSC_CLASS){' n3 `6 J4 i# Y
if(phost->device_prop.Itf_Desc[0].bInterfaceProtocol == MSC_PROTOCOL) return 1;
}
}else{/ N! ?, y( Z8 l9 q- u( o! o# U# n
if(phost->device_prop.Itf_Desc[0].bInterfaceSubClass == HID_BOOT_CODE) return 1;( R0 ~# s; j9 h
}
return 0;
}
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
/**
* @brief USBH_CtlReq$ b- _: U& R' _$ ?2 \
* USBH_CtlReq sends a control request and provide the status after 8 e( \, w6 a1 ^' W
* completion of the request
* @param pdev: Selected device
* @param req: Setup Request Structure
* @param buff: data buffer address to store the response
* @param length: length of the response
* @retval Status
*/
USBH_Status USBH_CtlReq (USB_OTG_CORE_HANDLE *pdev, 4 D5 X+ i) |1 M* u
USBH_HOST *phost, ! ^7 N$ b) K0 F8 N0 @* m
uint8_t *buff,
uint16_t length)
{
USBH_Status status;
status = USBH_BUSY;: t. j/ {% h$ ^) s
switch (phost->RequestState)
{
case CMD_SEND:) M. f; |3 |5 L0 I3 D% ]
/* Start a SETUP transfer */5 O- _! [! s8 s& P0 u& m
USBH_SubmitSetupRequest(phost, buff, length);$ f1 q) k1 h+ ]2 p( l8 T
phost->RequestState = CMD_WAIT;
status = USBH_BUSY;
break;. q% O# d- D+ }0 k
case CMD_WAIT:
if(Get_HOST_USB_MODE()==0){ //--2014-3-30 添加2种模式判别!!!% c8 G+ z' J( K" l
if (status == URB_DONE){
/* Commands successfully sent and Response Received */
phost->RequestState = CMD_SEND;
status = USBH_OK;" F- N: T8 z7 l" ?% [
}* c$ \. p* {8 P& m+ G3 l4 ]& O
else if (status == URB_ERROR){
/* Failure Mode */. _: w# @3 S; }* p6 A& S* p- _( Q
phost->RequestState = CMD_SEND;
status = USBH_FAIL;- a3 [) l0 O3 W# V* v) q" ?; B
} 5 n7 w% G3 h0 ~. ]6 w: p
else if (status == URB_STALL){
/* Commands successfully sent and Response Received */
phost->RequestState = CMD_SEND;3 F7 \2 r9 R/ d# u" X; k, P/ {+ P( m
status = USBH_NOT_SUPPORTED;' s8 P9 W* V/ b0 j4 v
}: T+ i K G4 |. r
}else{' Z* L" G# Q! g8 p5 b* u1 g" M
if (phost->Control.state == CTRL_COMPLETE ){//HID 处理!!
// Commands successfully sent and Response Received
phost->RequestState = CMD_SEND;
phost->Control.state =CTRL_IDLE; , O) T7 [5 _' b. R: H* T& b
status = USBH_OK;
}, w9 u! ]/ C% ^' z) ]1 ?7 N6 }
else if (phost->Control.state == CTRL_ERROR)% E$ T* e/ W. R% V5 p! u
{" [" C! a; Q' ~4 d- o1 l" F. A( i
// Failure Mode
phost->RequestState = CMD_SEND;# f* p# W/ s2 s4 d3 d0 N1 \& @. B
status = USBH_FAIL;
} 8 [6 k% c9 }# g+ @8 U
else if (phost->Control.state == CTRL_STALLED )$ j3 s/ G1 S \7 h5 R; k, H: P
{9 o9 y3 f9 l3 d0 l. [) w
// Commands successfully sent and Response Received
phost->RequestState = CMD_SEND;
status = USBH_NOT_SUPPORTED;0 c$ ^$ S. I, _7 k/ W6 A' R
}* }0 W- n A( {8 Y4 ]% K
}
break;
//-------------------------------------
default:
break; % E# D4 P+ W, y' j: ^
}& `5 s8 O5 A5 q
return status;
}
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
回复:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发