
STM32硬件结构学习
最全USB HID开发资料,悉心整理一个月,亲自测试
实战经验 | 选择USBX模块生成USB CDC ACM无PD的项目
STM32 USB HID键盘例程
刘氓兔的杂谈【001】-片上USB 高速PHY
【经验分享】在进行 USB CDC 类开发时,无法发送 64整数倍的数据
【源码】STLINK-V3MINI 高速USB仿真器,成功改刷【高速CMSIS-DAP】
在线直播|无需编写任何代码即可在STM32上实现USB-C Power Delivery
STM32 USB CDC 虚拟多串口
圈圈发布USB图书第二版有感,以及分享一些我学习USB过程...
RE:STM32F207的host USB的MSC和HID的合并开发
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
电路很简单,占用F207的HS-usb:
回复:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
继续发图:3 o- D6 ?3 ?9 l, k b
电路很简单,占用F207的HS-usb:
; z0 L2 f& V: p) q( h" K3 b
8 |6 r3 {5 Q% m; c+ J$ G0 d
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev){ X- J8 g. _) b: @( N* a+ f" B
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB , ENABLE);' m: h8 b' e; V t4 L% @
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 |
GPIO_Pin_13 |$ ]' g l* R- c( G3 n; a
GPIO_Pin_14 |
GPIO_Pin_15;
' T) @* D- t V
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;" x. m6 U. L [6 g
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource12, GPIO_AF_OTG2_FS) ; ) a9 I2 w; z; w# m( q
GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_OTG2_FS) ;
GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_OTG2_FS) ; 9 ?; K# R# Y0 B1 M k
GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_OTG2_FS) ;
//---------------------------------------------------------------/ m G# s5 }9 Q( ^+ J- z/ b* u5 s
RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_OTG_HS, ENABLE) ;
//-----------------------------------------------------------------
//Vbus_EN 根据实际电路修改!$ b; k) p& O* E% V! O* v$ k
RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOE , ENABLE) ; & |5 ]! h- ^3 G) z" [3 ~8 T
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;& w9 f2 k J3 l, t
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;9 M2 a4 U. r' T- O; |
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ; . o L# R7 z9 {9 w3 e+ b0 G% r3 v
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;' Y* B2 R4 Z: i6 e0 g. i
GPIO_Init(GPIOE, &GPIO_InitStructure);$ f) W; R* S3 m& Q
GPIO_ResetBits(GPIOE, GPIO_Pin_0);
//-------------------------------------------------------------------
USB_OTG_BSP_TimeInit();
USB_OTG_BSP_mDelay(500); //Delay is need for stabilising the Vbus Low
}
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
#ifndef USE_USB_OTG_HS
#define USE_USB_OTG_HS
#endif /* USE_USB_OTG_HS */
#ifndef USE_ULPI_PHY8 F# a( r, [6 x3 y; J* @
//#define USE_ULPI_PHY
#endif /* USE_ULPI_PHY */) h$ r2 q+ t7 P6 F# n
#ifndef USE_EMBEDDED_PHY
#define USE_EMBEDDED_PHY6 s, g+ i0 d. }! L
#endif /* USE_EMBEDDED_PHY */
#ifdef USE_USB_OTG_HS
#define USB_OTG_HS_CORE
#endif
/*******************************************************************************8 N9 O' F; J4 x) V: E" D$ O
* FIFO Size Configuration in Host mode
*
* (i) Receive data FIFO size = (Largest Packet Size / 4) + 1 or ( n- _4 U, U4 e/ Z: S; ~
* 2x (Largest Packet Size / 4) + 1, If a
* high-bandwidth channel or multiple isochronous
* channels are enabled9 i. `4 L2 a7 O
*: D. M$ ?* _# ]* A# D% B
* (ii) For the host nonperiodic Transmit FIFO is the largest maximum packet size ( U; a9 M4 E& {$ b7 b+ s2 F
* for all supported nonperiodic OUT channels. Typically, a space
* corresponding to two Largest Packet Size is recommended.2 }2 k9 H8 L2 O$ \3 m
*
* (iii) The minimum amount of RAM required for Host periodic Transmit FIFO is - m7 ]$ T% z5 e
* the largest maximum packet size for all supported periodic OUT channels.
* If there is at least one High Bandwidth Isochronous OUT endpoint,
* then the space must be at least two times the maximum packet size for 9 Y' I" W2 X. M+ B7 S9 m, m+ G
* that channel.. }" ~. z/ O: o) p
*******************************************************************************/
* a9 z- ~ L+ F$ b1 y1 g( U; U
/****************** USB OTG HS CONFIGURATION **********************************// `& t$ s2 l g: e2 L
#ifdef USB_OTG_HS_CORE+ A. Q- t E8 W4 D/ o
#define RX_FIFO_HS_SIZE 512
#define TXH_NP_HS_FIFOSIZ 256- k9 E- a( e8 M6 S" y
#define TXH_P_HS_FIFOSIZ 256
// #define USB_OTG_HS_LOW_PWR_MGMT_SUPPORT, v5 S+ [0 D7 E
// #define USB_OTG_HS_SOF_OUTPUT_ENABLED2 l5 \% c q2 j. z
#ifdef USE_ULPI_PHY8 d9 Y' D m6 b3 U3 _! f3 c" Z: G
#define USB_OTG_ULPI_PHY_ENABLED
#endif
#ifdef USE_EMBEDDED_PHY* x$ E' y- E; L5 b a/ U5 V
#define USB_OTG_EMBEDDED_PHY_ENABLED
#endif
#define USB_OTG_HS_INTERNAL_DMA_ENABLED- C: z6 V" [0 e. L! c/ S8 A9 v
#define USB_OTG_EXTERNAL_VBUS_ENABLED( K, A) r! p" s3 D2 H1 Y
//#define USB_OTG_INTERNAL_VBUS_ENABLED
#endif
/****************** USB OTG FS CONFIGURATION **********************************/. e1 A+ ^* r* A3 O2 p# M* j
#ifdef USB_OTG_FS_CORE& x" K9 X& Y( v, o* [1 C
#define RX_FIFO_FS_SIZE 128
#define TXH_NP_FS_FIFOSIZ 96
#define TXH_P_FS_FIFOSIZ 96
// #define USB_OTG_FS_LOW_PWR_MGMT_SUPPORT
// #define USB_OTG_FS_SOF_OUTPUT_ENABLED
#endif4 I* e$ F& J! q- M0 t0 ^6 k
/****************** USB OTG MODE CONFIGURATION ********************************/
#define USE_HOST_MODE
//#define USE_DEVICE_MODE8 u: V: _, W( T- { Z. m& u
//#define USE_OTG_MODE& d6 l4 l% V4 a/ t
#ifndef USB_OTG_FS_CORE
#ifndef USB_OTG_HS_CORE4 \/ q2 D* N1 c! B
#error "USB_OTG_HS_CORE or USB_OTG_FS_CORE should be defined"
#endif
#endif" k3 [5 A6 p) a Z. s
#ifndef USE_DEVICE_MODE
#ifndef USE_HOST_MODE4 i) n1 X: A! H: V8 K' t' P. k
#error "USE_DEVICE_MODE or USE_HOST_MODE should be defined"5 l4 v' A; N2 M7 i9 s6 T+ x
#endif
#endif
#ifndef USE_USB_OTG_HS' q! y7 a5 q4 `
#ifndef USE_USB_OTG_FS
#error "USE_USB_OTG_HS or USE_USB_OTG_FS should be defined"
#endif
#else //USE_USB_OTG_HS
#ifndef USE_ULPI_PHY
#ifndef USE_EMBEDDED_PHY" S# c% l" t) o5 }& [' i
#error "USE_ULPI_PHY or USE_EMBEDDED_PHY should be defined"; }: _) y& U6 u6 J9 p
#endif
#endif0 t. T, n- D1 R, w3 E
#endif
/****************** C Compilers dependant keywords ****************************/
/* In HS mode and when the DMA is used, all variables and data structures dealing- s3 W# y p/ R0 ^6 w
with the DMA during the transaction process should be 4-bytes aligned */ 9 S v( O: ?* X* o% L
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED' Y" Q( f7 L8 M
#if defined (__GNUC__) /* GNU Compiler */( `0 {5 _1 U/ o) i
#define __ALIGN_END __attribute__ ((aligned (4)))
#define __ALIGN_BEGIN
#else
#define __ALIGN_END
#if defined (__CC_ARM) /* ARM Compiler */
#define __ALIGN_BEGIN __align(4)
#elif defined (__ICCARM__) /* IAR Compiler */: A8 o" u/ M! ~" W' M) O
#define __ALIGN_BEGIN
#elif defined (__TASKING__) /* TASKING Compiler */9 ~" Z- v# I& U f1 n" q0 L
#define __ALIGN_BEGIN __align(4) : A$ T Q& |2 o
#endif /* __CC_ARM */
#endif /* __GNUC__ */ - x! W* g7 L8 C1 O$ w+ [
#else
#define __ALIGN_BEGIN! d3 i# f. A1 F: C" h
#define __ALIGN_END . Z# o3 y: ^" L& k# F8 p0 {3 C
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */$ E6 S/ @) ~0 Z0 o
/* __packed keyword used to decrease the data type alignment to 1-byte */ ^- b# N7 ~; c J- ]
#if defined (__CC_ARM) /* ARM Compiler */0 o" ]1 x4 _% X2 w; e6 a
#define __packed __packed4 X( F% e* r3 S3 B3 h3 Q8 q
#elif defined (__ICCARM__) /* IAR Compiler */+ {" D7 k* }, Q/ ?1 y. t
#define __packed __packed
#elif defined ( __GNUC__ ) /* GNU Compiler */ 7 [0 n. Z: B2 Z0 o: A8 M
#define __packed __attribute__ ((__packed__))7 E5 L/ I; j$ s8 o6 X) V# B
#elif defined (__TASKING__) /* TASKING Compiler */
#define __packed __unaligned
#endif /* __CC_ARM */
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
int main(void){2 g# K2 M8 G& V4 u5 S: T' z3 S( H* }& ]0 c
/*!< At this stage the microcontroller clock setting is already configured,
this is done through SystemInit() function which is called from startup( M1 D% [( o1 ^3 M3 U
file (startup_stm32fxxx_xx.s) before to branch to application main.
To reconfigure the default setting of SystemInit() function, refer to6 s" b G. b! N/ i) `# J9 W, S
system_stm32fxxx.c file/ p+ m6 \% t/ P7 F ^7 w9 W8 I: y
*/ ' j- a- M X Z0 A. W0 J- \* }
/* Init Host Library */
USBH_Init(&USB_OTG_Core,
USB_OTG_HS_CORE_ID,! x/ R1 u0 G* \ H Y3 w! ~$ y
&USB_Host,
&USBH_MSC_cb, # e0 u+ q5 ^* x
&USR_cb);4 O9 A% v+ x8 |5 i
, g3 m0 m/ K# H/ R; e1 E
while (1){' s* C# s) P% n3 ~: m
/* Host Task handler *// Q) R! G( m+ P* }, L) Q! \. S
USBH_Process(&USB_OTG_Core, &USB_Host);& N" T3 |& d3 H/ ^
if(iapRun==0){
IAP_URN_UserProgrammer();
}9 A, x' ^2 V; d" o3 j- T
}$ y6 |8 |( R$ s1 i: j+ r
}
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
case HOST_USR_INPUT: 5 O0 g/ P3 G& `
/*The function should return user response true to move to class state */
//修改:添加MSC-HID自动判别,然后再初始化CALSS-CB
if(JB_MSC_HID(phost,0)){ //0:判别MSC,1:判别HID3 H" {: _7 U+ m3 ~, _4 Z- @6 z9 J
SetHOST_USB_MODE(0);
phost->class_cb=&USBH_MSC_cb;7 z! c- y/ b, t
if((phost->class_cb->Init(pdev, phost)) == USBH_OK){7 @9 L8 J- D8 m% g- D$ @
phost->gState = HOST_CLASS_REQUEST; 1 r% G4 G7 \/ u( ^- t6 D9 A$ Z
} " h+ \! j; c- {5 ]
}else{9 w, U5 q5 w* h* C" h
if(JB_MSC_HID(phost,1)){ //0:判别MSC,1:判别HID0 G2 A5 M$ w7 ^ F' v9 G$ R: Z% o+ y
SetHOST_USB_MODE(1);
phost->class_cb=&HID_cb;1 D3 n+ t) S# c
//phost->usr_cb=&USR_Callbacks;//???????
if((phost->class_cb->Init(pdev, phost)) == USBH_OK){' ]9 Z4 ?, X, s8 P. D- Z+ y% x
phost->gState = HOST_CLASS_REQUEST;
}
}
}
break;
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
/* Check for enumeration status */
if ( USBH_HandleEnum(pdev , phost) == USBH_OK){ % v) G. }% {2 m- ?
/* The function shall return USBH_OK when full enumeration is complete */2 t+ t! @ V1 p0 z
: d' X. {4 V# C& L: ]9 r ?6 U
/* user callback for end of device basic enumeration */
phost->usr_cb->EnumerationDone();) }( O/ K# `1 G5 _3 |
0 K8 |* w$ ?: M9 b* ]% y# L& C
phost->gState = HOST_USR_INPUT; . I$ I1 P- J! d$ O
}
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:判别HID
if(flag==0){' E; f9 Q! u1 ^5 _/ |
if(phost->device_prop.Itf_Desc[0].bInterfaceClass == MSC_CLASS){
if(phost->device_prop.Itf_Desc[0].bInterfaceProtocol == MSC_PROTOCOL) return 1;
}& K H2 Y- s2 ?
}else{
if(phost->device_prop.Itf_Desc[0].bInterfaceSubClass == HID_BOOT_CODE) return 1;( _ I) I7 M6 H: t5 D0 Q
}
return 0;; w* x4 g4 H2 H6 E
}
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
/**
* @brief USBH_CtlReq
* USBH_CtlReq sends a control request and provide the status after 6 H! [$ s9 u s z; r
* completion of the request
* @param pdev: Selected device$ Y7 ]) k$ I l
* @param req: Setup Request Structure" r7 @4 q3 k2 t' c# Z# K
* @param buff: data buffer address to store the response7 f. l5 c& E* o; l/ L- S
* @param length: length of the response$ o9 n8 `- l' @. [: E$ T
* @retval Status
*/
USBH_Status USBH_CtlReq (USB_OTG_CORE_HANDLE *pdev,
USBH_HOST *phost,
uint8_t *buff,8 E6 \5 g1 O! Q& _. c2 ~
uint16_t length)
{% A8 A/ }) X) m" m9 u
USBH_Status status;
status = USBH_BUSY;
% ^: a% T/ n# y- q# C3 R% N/ V
switch (phost->RequestState)
{8 |+ Q9 V! \$ t
case CMD_SEND:
/* Start a SETUP transfer *// o9 \; V0 T5 ^, S
USBH_SubmitSetupRequest(phost, buff, length);6 I5 V: m; @2 \5 u$ F) S
phost->RequestState = CMD_WAIT;
status = USBH_BUSY;
break;
case CMD_WAIT:
if(Get_HOST_USB_MODE()==0){ //--2014-3-30 添加2种模式判别!!!
if (status == URB_DONE){+ g: d4 f' x, k2 S
/* Commands successfully sent and Response Received */ ! V3 H/ Z/ ~; k8 b) V! }, i
phost->RequestState = CMD_SEND;- V. i6 v/ P2 d$ }
status = USBH_OK;
}
else if (status == URB_ERROR){
/* Failure Mode */; P2 Z' s' E/ O9 l. t, q
phost->RequestState = CMD_SEND;5 @( A& n7 Z* K3 m& X
status = USBH_FAIL;, K* C( m2 C! }
}
else if (status == URB_STALL){
/* Commands successfully sent and Response Received */
phost->RequestState = CMD_SEND;
status = USBH_NOT_SUPPORTED;) m! r/ Z7 i$ u# N# }: \; x, o
}
}else{* z, ?/ S* v2 G# i: @ X7 H& x! ^5 A5 Q
if (phost->Control.state == CTRL_COMPLETE ){//HID 处理!!
// Commands successfully sent and Response Received
phost->RequestState = CMD_SEND;+ b2 e9 S' T! W7 J. x, p6 e
phost->Control.state =CTRL_IDLE;
status = USBH_OK; ! s: ^3 M2 X( _
}
else if (phost->Control.state == CTRL_ERROR); n- }" F; C: L/ z3 C" W: B/ [7 J
{
// Failure Mode
phost->RequestState = CMD_SEND;
status = USBH_FAIL;; J5 t# Q: l& m0 Y/ o
} 0 q) b* ^. H+ a' Y
else if (phost->Control.state == CTRL_STALLED )8 s, T- K6 l6 L/ d R" N
{
// Commands successfully sent and Response Received " Z y/ [/ j7 E/ z1 `7 H/ q- W
phost->RequestState = CMD_SEND;
status = USBH_NOT_SUPPORTED;6 m" R) P) e. I9 G
}
}
break;
//-------------------------------------
default:2 U) g `* q# j6 V
break;
}, ~; K6 K2 e2 C# Y, D4 V7 @
return status;
}
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
回复:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发