![shequ.stmicroelectronics.cn](./template/st_v1/static/img/logo2.png)
圈圈发布USB图书第二版有感,以及分享一些我学习USB过程...
最全USB HID开发资料,悉心整理一个月,亲自测试
USB Audio设计与实现
【MCU实战经验】+STM32F107的USB使用
STM32F4-DISC 实现USB主机(U盘)和USB设备(虚拟串口)自动切换
STM32 USB-HID通信移植步骤STM32 USB HID键盘例程
stm32f207/stm32f407擦除内部flash讲解
【经验分享】STM32F2 中 DMA 的 FIFO 模式
【经验分享】在进行 USB CDC 类开发时,无法发送 64整数倍的数据
如何让CDC类USB设备批量接收64字节以上数据
RE:STM32F207的host USB的MSC和HID的合并开发
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
电路很简单,占用F207的HS-usb:
回复:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
继续发图:" p% k- D/ \3 [
电路很简单,占用F207的HS-usb:
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev){
GPIO_InitTypeDef GPIO_InitStructure;. p/ @2 _8 d: y- N
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB , ENABLE);$ L+ Q- K! N1 B' ~4 f/ F: R e" f
6 }8 |2 s5 f( v1 H; }( \4 N
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | u( h$ g) l: E) m* j- q- v' ]
GPIO_Pin_13 |9 l% Z1 D' p" {
GPIO_Pin_14 | 0 ~) W* `1 ^$ | X
GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;1 Y- _7 F& a0 e$ B
GPIO_Init(GPIOB, &GPIO_InitStructure); $ O# x) w$ p( Y' m# i
/ X) T" ^' Q4 R. f. y0 _# |
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) ;
GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_OTG2_FS) ;
//---------------------------------------------------------------7 @2 H; P- j4 L' I4 [- t
RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_OTG_HS, ENABLE) ;
//-----------------------------------------------------------------
//Vbus_EN 根据实际电路修改!( w& V7 O" T* |3 |2 d
RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOE , ENABLE) ; 3 w: V9 Z7 s* S4 O6 a- w
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;8 O8 p6 s5 D. D# s! R) f
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;8 g8 x* r/ }5 h5 G8 }4 [
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; a1 e; ?; U; k/ O: @5 i
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_ResetBits(GPIOE, GPIO_Pin_0);
//-------------------------------------------------------------------+ y) f2 D) Y' ?% `7 A
USB_OTG_BSP_TimeInit();7 M! X- I; p4 V- ?/ }
USB_OTG_BSP_mDelay(500); //Delay is need for stabilising the Vbus Low 2 P( t8 w4 J; C& }
}
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
#ifndef USE_USB_OTG_HS: k% C! R* N4 R' A7 ?) |( L
#define USE_USB_OTG_HS
#endif /* USE_USB_OTG_HS */
#ifndef USE_ULPI_PHY& z7 f' \9 i \ K/ n
//#define USE_ULPI_PHY9 [4 e, T( y+ G& t1 A' r& r
#endif /* USE_ULPI_PHY */0 [" |* ^9 A( n
#ifndef USE_EMBEDDED_PHY
#define USE_EMBEDDED_PHY8 L3 t, \' n2 E5 \6 u+ T
#endif /* USE_EMBEDDED_PHY */( D# v0 a( N! g: f, f: d
#ifdef USE_USB_OTG_HS ' G0 c# R9 G$ V' D$ c" J b4 @
#define USB_OTG_HS_CORE
#endif6 G, A( y' K9 p' H2 K
/*******************************************************************************
* FIFO Size Configuration in Host mode
*
* (i) Receive data FIFO size = (Largest Packet Size / 4) + 1 or , Q x; L: d; x" N, K/ E
* 2x (Largest Packet Size / 4) + 1, If a 4 `. {" o( [6 ?2 r3 T
* high-bandwidth channel or multiple isochronous 2 I% y1 f8 i# p& W/ P% g
* channels are enabled5 f& b7 Z4 q2 h W$ w8 b5 |
*
* (ii) For the host nonperiodic Transmit FIFO is the largest maximum packet size ) g! _+ L j7 S9 i- r# q& k8 }# {
* for all supported nonperiodic OUT channels. Typically, a space
* corresponding to two Largest Packet Size is recommended.
*
* (iii) The minimum amount of RAM required for Host periodic Transmit FIFO is + S. {2 y0 R) A
* 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
* that channel.
*******************************************************************************/
/****************** USB OTG HS CONFIGURATION **********************************/4 k; L7 l' T6 ?' S' u. l' K7 R
#ifdef USB_OTG_HS_CORE* p2 g8 I @! r& g6 Q4 k! L
#define RX_FIFO_HS_SIZE 5124 k i8 }) S3 v
#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_ENABLED3 ?0 L5 H4 m+ I5 p1 |1 S8 w
#ifdef USE_ULPI_PHY
#define USB_OTG_ULPI_PHY_ENABLED
#endif
#ifdef USE_EMBEDDED_PHY) \9 p7 m" p8 L* n7 M1 w1 l/ h
#define USB_OTG_EMBEDDED_PHY_ENABLED: ^0 b* H. _7 R' \( Q2 d
#endif; T3 A. C4 C8 D) l; G! Z; @# Y, A
#define USB_OTG_HS_INTERNAL_DMA_ENABLED- `2 p, x% d/ X
#define USB_OTG_EXTERNAL_VBUS_ENABLED
//#define USB_OTG_INTERNAL_VBUS_ENABLED
#endif
/****************** USB OTG FS CONFIGURATION **********************************/, `" ^: g9 E" n' b) S4 w6 j/ f
#ifdef USB_OTG_FS_CORE2 n. M+ Z1 M1 L6 ]3 ?; T* s# j
#define RX_FIFO_FS_SIZE 128
#define TXH_NP_FS_FIFOSIZ 96; }: C" W* ]5 Y( z6 w& I
#define TXH_P_FS_FIFOSIZ 96 v: ^4 E6 c- H3 Q b! r
// #define USB_OTG_FS_LOW_PWR_MGMT_SUPPORT4 T" U3 b1 Q7 d* g' Y
// #define USB_OTG_FS_SOF_OUTPUT_ENABLED
#endif
/****************** USB OTG MODE CONFIGURATION ********************************/
#define USE_HOST_MODE
//#define USE_DEVICE_MODE+ @# {3 j$ Q/ N
//#define USE_OTG_MODE' X9 F9 Z# [+ }( F I, Z
#ifndef USB_OTG_FS_CORE
#ifndef USB_OTG_HS_CORE
#error "USB_OTG_HS_CORE or USB_OTG_FS_CORE should be defined"# H: j* T- ?& }! E! Y8 a
#endif6 H9 |9 }( c2 e2 D2 u8 h" j9 n
#endif5 W; x; a) r- @( Q
#ifndef USE_DEVICE_MODE
#ifndef USE_HOST_MODE
#error "USE_DEVICE_MODE or USE_HOST_MODE should be defined"( s0 T* L2 B8 J# e- l/ }/ h
#endif3 W" J; e$ U% z" y9 w
#endif! {3 Q) s( [ w2 q/ X' _
#ifndef USE_USB_OTG_HS: z* @- K: [/ \
#ifndef USE_USB_OTG_FS
#error "USE_USB_OTG_HS or USE_USB_OTG_FS should be defined"8 e2 M* Q; c7 W2 e8 {5 v3 H* M
#endif" o5 y4 S7 J) G* @# F! j/ t
#else //USE_USB_OTG_HS( x& d; ?& w5 \ v9 t' z# J
#ifndef USE_ULPI_PHY, y/ t) \+ t' i- U; A/ D/ ^
#ifndef USE_EMBEDDED_PHY7 w2 X$ F9 P F7 `. Z
#error "USE_ULPI_PHY or USE_EMBEDDED_PHY should be defined": \/ ]7 u+ y* w9 P; B
#endif
#endif9 K+ |! M! S" F5 `8 h$ i
#endif9 U' h3 m3 J) R, o T
/****************** C Compilers dependant keywords ****************************/! n0 N5 N# `& E
/* In HS mode and when the DMA is used, all variables and data structures dealing, A+ n. r/ E* V8 i" ~
with the DMA during the transaction process should be 4-bytes aligned */
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
#if defined (__GNUC__) /* GNU Compiler */* x+ ~$ J; b1 P
#define __ALIGN_END __attribute__ ((aligned (4))) E8 E# [$ ]( r
#define __ALIGN_BEGIN ; _ h+ J6 F& f( n
#else 5 [! w5 \3 g# W. ?& v* u
#define __ALIGN_END6 I9 H; k, ^4 u
#if defined (__CC_ARM) /* ARM Compiler */! o- T6 t0 h/ h" A8 h3 R1 Z, d
#define __ALIGN_BEGIN __align(4)
#elif defined (__ICCARM__) /* IAR Compiler */! ~7 r* P* [4 P
#define __ALIGN_BEGIN
#elif defined (__TASKING__) /* TASKING Compiler */
#define __ALIGN_BEGIN __align(4) + F, v( p: k4 H. P
#endif /* __CC_ARM */
#endif /* __GNUC__ */ 1 P2 {4 p' \" V8 Y
#else
#define __ALIGN_BEGIN
#define __ALIGN_END
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */( R! n# h2 T" b% z
/* __packed keyword used to decrease the data type alignment to 1-byte */. r9 Q( X6 g$ H) H# h
#if defined (__CC_ARM) /* ARM Compiler */
#define __packed __packed
#elif defined (__ICCARM__) /* IAR Compiler */" a! a7 Z' B( c* w( X8 B4 L# L
#define __packed __packed( ]3 }6 W! m$ a' R; q! W/ x! \2 q0 `
#elif defined ( __GNUC__ ) /* GNU Compiler */
#define __packed __attribute__ ((__packed__))1 l+ J, M+ G! m3 V9 W+ s
#elif defined (__TASKING__) /* TASKING Compiler */, k0 {3 ?2 O. @0 T% T
#define __packed __unaligned
#endif /* __CC_ARM */
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
int main(void){/ ^; R: j: h4 G3 ~
6 e, m" x( K; x3 S* g
/*!< 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.
To reconfigure the default setting of SystemInit() function, refer to
system_stm32fxxx.c file
*/
/* Init Host Library */
USBH_Init(&USB_OTG_Core, * u( ]0 M( U8 l$ Y9 q C5 b
USB_OTG_HS_CORE_ID,5 l+ l) H+ D( @6 p, h" I+ R9 h7 d/ d9 U
&USB_Host,) x- d1 K; W8 b3 k# y: s7 n" Z
&USBH_MSC_cb, 6 @3 Z, F; ?0 i# @( `
&USR_cb);
+ a( |, l* y: c& f4 ?0 Z9 H
while (1){
/* Host Task handler */3 K) J4 \& g, p; s
USBH_Process(&USB_OTG_Core, &USB_Host);
if(iapRun==0){
IAP_URN_UserProgrammer();
}0 i# S2 e; f c C2 K
}
}
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
case HOST_USR_INPUT: - L; f4 }7 K( V# s) ^
/*The function should return user response true to move to class state */% `' S. J6 o$ _4 q @
//修改:添加MSC-HID自动判别,然后再初始化CALSS-CB
if(JB_MSC_HID(phost,0)){ //0:判别MSC,1:判别HID
SetHOST_USB_MODE(0);, }, F6 ~0 P- _ o7 {: G. O
phost->class_cb=&USBH_MSC_cb;: H- d- R/ h( K Q6 C7 [
if((phost->class_cb->Init(pdev, phost)) == USBH_OK){# }! e. f e; n9 E( y
phost->gState = HOST_CLASS_REQUEST; ' V: j3 E/ \5 j1 u+ \$ E! m
} - Z) t* k9 W+ s& a
}else{
if(JB_MSC_HID(phost,1)){ //0:判别MSC,1:判别HID
SetHOST_USB_MODE(1);
phost->class_cb=&HID_cb;
//phost->usr_cb=&USR_Callbacks;//???????. o1 u/ C, Q1 H" @$ ~( g, k
if((phost->class_cb->Init(pdev, phost)) == USBH_OK){
phost->gState = HOST_CLASS_REQUEST; . T" ?$ l# z: {, a& R* S
}
}
} 5 t2 I9 x2 N% Y1 z
break;
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
/* Check for enumeration status */
if ( USBH_HandleEnum(pdev , phost) == USBH_OK){ * j- h' [/ z4 N2 S
/* The function shall return USBH_OK when full enumeration is complete */1 ?, r% `, B7 Z4 ^" T1 }9 T% Z
9 R$ f, F) c% V& B6 k
/* user callback for end of device basic enumeration */) U( `. K+ ^- J! W2 I
phost->usr_cb->EnumerationDone();
phost->gState = HOST_USR_INPUT; z d" b3 y$ k6 }2 S; y+ U' F7 h% ?+ Q& 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){
if(phost->device_prop.Itf_Desc[0].bInterfaceClass == MSC_CLASS){/ i- S) ^5 u) X3 C, \0 w/ T/ P; F
if(phost->device_prop.Itf_Desc[0].bInterfaceProtocol == MSC_PROTOCOL) return 1;
}9 s( G, A% E& ^' t1 ] g9 g
}else{
if(phost->device_prop.Itf_Desc[0].bInterfaceSubClass == HID_BOOT_CODE) return 1;
}
return 0;7 N2 L. R: Z E/ J% m! ?# I3 T
}
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
/**! q( ^$ i" T# ~/ q- s& w/ g1 F& U$ p3 G
* @brief USBH_CtlReq
* USBH_CtlReq sends a control request and provide the status after . G' | Q( C+ _; e& `6 _9 x# Y
* completion of the request# `1 k/ I; G. m n5 ^! Y/ B3 Q
* @param pdev: Selected device. e* x( }" i: _" @7 j0 G
* @param req: Setup Request Structure
* @param buff: data buffer address to store the response
* @param length: length of the response1 @3 n8 w0 S- t, J6 [2 y
* @retval Status. S2 o; k3 d% O# P- j2 `, c
*/0 Z/ _1 Z/ v9 d" b% c0 [9 I
USBH_Status USBH_CtlReq (USB_OTG_CORE_HANDLE *pdev,
USBH_HOST *phost, 5 u$ E2 L g% I9 a
uint8_t *buff,$ ^6 s6 E* i/ E- K3 Q1 C5 Y
uint16_t length)
{% e) \; |% }( @4 b! b+ I
USBH_Status status;
status = USBH_BUSY;
1 l4 q2 B8 r) F
switch (phost->RequestState)
{ u7 o2 ]7 u' ~) q" ~
case CMD_SEND:3 Z5 E r4 Z+ f- T: U. f Z6 E9 \
/* Start a SETUP transfer */
USBH_SubmitSetupRequest(phost, buff, length);
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){
/* Commands successfully sent and Response Received */ ) i) T- `+ Z& I' ^+ C2 l. L/ n
phost->RequestState = CMD_SEND;
status = USBH_OK;1 u) x, i9 X! ^. ?
}& N! \/ \+ `' x
else if (status == URB_ERROR){
/* Failure Mode */
phost->RequestState = CMD_SEND;) y7 S6 f: k8 ~. i5 n A1 Z5 X% O
status = USBH_FAIL;
}
else if (status == URB_STALL){
/* Commands successfully sent and Response Received */ ) V" s' G0 x' e. L9 {9 o f
phost->RequestState = CMD_SEND;# d$ J% X3 N3 B, y; j
status = USBH_NOT_SUPPORTED;
}
}else{6 U9 i0 t0 B L2 E4 ?, O6 B3 |4 M
if (phost->Control.state == CTRL_COMPLETE ){//HID 处理!!1 _/ d+ D! P0 Q2 T) Q
// Commands successfully sent and Response Received
phost->RequestState = CMD_SEND;
phost->Control.state =CTRL_IDLE;
status = USBH_OK; & \8 _0 L# e7 z# L* q) m- G: T
}
else if (phost->Control.state == CTRL_ERROR)
{
// Failure Mode
phost->RequestState = CMD_SEND;. R* ^, [) d0 @- o3 O8 ~+ p: Q
status = USBH_FAIL;
}
else if (phost->Control.state == CTRL_STALLED )7 Y: R9 W9 s) B9 s6 `% P( v
{
// Commands successfully sent and Response Received 1 O5 e+ X! m# I
phost->RequestState = CMD_SEND;
status = USBH_NOT_SUPPORTED;
}* n+ N5 }( x8 E0 ?( _; | v
}
break;
//-------------------------------------
default:
break;
}
return status; L7 h) Y. v5 I
}
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
回复:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发