
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的合并开发
继续发图:
电路很简单,占用F207的HS-usb:& v) S" l7 k" a; @; L
! Q: n' W+ Z- T6 G* {% f; J$ t; w
5 w+ A7 A* V6 f# i {
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev){ q9 N0 |1 U" }+ t
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB , ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 |
GPIO_Pin_13 | S$ @" y% Q6 c" c q5 u$ Y
GPIO_Pin_14 | $ ?/ G6 K: P% W2 ?; j; T
GPIO_Pin_15;
) S7 w1 L0 f3 w) P$ X# E9 ]' S
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;/ B1 ~# d7 C- j2 Z$ @
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;0 Q" ~6 r5 R2 w8 c j
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource12, GPIO_AF_OTG2_FS) ; $ v& q' K! @5 d" v+ x# e' r0 ~* O' ?7 y5 b3 X
GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_OTG2_FS) ;
GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_OTG2_FS) ; ) c* t: x# y$ k
GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_OTG2_FS) ;
//---------------------------------------------------------------
RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_OTG_HS, ENABLE) ; 8 `1 U9 h3 ^4 Q7 T1 s! I7 {3 k3 H ~
//-----------------------------------------------------------------
//Vbus_EN 根据实际电路修改!
RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOE , ENABLE) ; 2 R0 ^+ r' A Y; d" x& I
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;% Z3 Q3 h, T% }; v" x. j
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ; 9 k h* e: T% Y3 g( L
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;2 S' l* b E% A D* o$ f
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_ResetBits(GPIOE, GPIO_Pin_0);" k$ W- i$ w% C
//-------------------------------------------------------------------
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, E# v* H3 @( i
#endif /* USE_USB_OTG_HS */
#ifndef USE_ULPI_PHY
//#define USE_ULPI_PHY6 ]' ?: a' M9 h$ k( W+ c: m
#endif /* USE_ULPI_PHY */, s, {& r+ d) \6 {
#ifndef USE_EMBEDDED_PHY
#define USE_EMBEDDED_PHY
#endif /* USE_EMBEDDED_PHY */
#ifdef USE_USB_OTG_HS 4 S3 `7 U O- \! m
#define USB_OTG_HS_CORE
#endif
/*******************************************************************************8 W% g% I+ q7 i% [
* FIFO Size Configuration in Host mode( \( K: h2 s/ S9 P' J
*
* (i) Receive data FIFO size = (Largest Packet Size / 4) + 1 or
* 2x (Largest Packet Size / 4) + 1, If a
* high-bandwidth channel or multiple isochronous
* channels are enabled
*3 ]2 Y& c9 `) L9 u% g
* (ii) For the host nonperiodic Transmit FIFO is the largest maximum packet size - E) ~$ g' a' L
* for all supported nonperiodic OUT channels. Typically, a space 0 J H) E' }% f" a( C) p
* corresponding to two Largest Packet Size is recommended.7 C% ]; `1 K! W: N2 c
*
* (iii) The minimum amount of RAM required for Host periodic Transmit FIFO is % ?( M' T2 z! i0 T1 u# a
* the largest maximum packet size for all supported periodic OUT channels.- `7 R; h9 ?0 Z
* 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 3 r1 p- I4 }1 F/ O3 p8 m! c
* that channel.+ l, p& Y4 y! s# U* K E
*******************************************************************************/% [- n. u" |5 _; z6 G U6 X" Q
# Y' p( t4 A7 H: R( w
/****************** USB OTG HS CONFIGURATION **********************************/
#ifdef USB_OTG_HS_CORE
#define RX_FIFO_HS_SIZE 512
#define TXH_NP_HS_FIFOSIZ 256" N, t9 m& _* z; z8 ^7 s5 N' d
#define TXH_P_HS_FIFOSIZ 2565 X& }& o' S- {2 C e; D# `" N% u
// #define USB_OTG_HS_LOW_PWR_MGMT_SUPPORT# F; C1 @6 }) a! {0 ]+ o3 W
// #define USB_OTG_HS_SOF_OUTPUT_ENABLED3 y6 O' U/ G; t1 @1 w6 g
#ifdef USE_ULPI_PHY
#define USB_OTG_ULPI_PHY_ENABLED( l+ m' z, K7 q8 N. [
#endif
#ifdef USE_EMBEDDED_PHY9 v4 b; [7 P% ]2 o& a2 ^
#define USB_OTG_EMBEDDED_PHY_ENABLED
#endif: s" F+ O! j, \! K( \1 e
#define USB_OTG_HS_INTERNAL_DMA_ENABLED
#define USB_OTG_EXTERNAL_VBUS_ENABLED9 `) X4 f/ V, ]) A1 R' @! r
//#define USB_OTG_INTERNAL_VBUS_ENABLED
#endif
/****************** USB OTG FS CONFIGURATION **********************************/
#ifdef USB_OTG_FS_CORE
#define RX_FIFO_FS_SIZE 128
#define TXH_NP_FS_FIFOSIZ 96; e- e: L! {: k+ }4 p
#define TXH_P_FS_FIFOSIZ 96
// #define USB_OTG_FS_LOW_PWR_MGMT_SUPPORT
// #define USB_OTG_FS_SOF_OUTPUT_ENABLED7 X: @5 J# H7 N1 f/ }( c& C
#endif
/****************** USB OTG MODE CONFIGURATION ********************************/
#define USE_HOST_MODE
//#define USE_DEVICE_MODE) H4 j1 d! V" I( L- ^4 c. U2 z8 _" F4 G
//#define USE_OTG_MODE7 [3 l; x3 s% |' M! @8 g' ^$ r
#ifndef USB_OTG_FS_CORE( d3 e( d7 J0 E
#ifndef USB_OTG_HS_CORE2 \# _4 w2 i" @, W) {
#error "USB_OTG_HS_CORE or USB_OTG_FS_CORE should be defined"6 a( ~5 ~& S# m
#endif$ [( ~& c+ C6 ~8 [
#endif
#ifndef USE_DEVICE_MODE6 h5 B* N! X( a6 W6 j
#ifndef USE_HOST_MODE
#error "USE_DEVICE_MODE or USE_HOST_MODE should be defined"
#endif1 B2 X2 D3 C. u: A0 ?. f/ C
#endif: A# j* b& i7 i, v: A5 }# k( l% g( K
#ifndef USE_USB_OTG_HS' s( m) ]2 a/ \; a/ ~: }6 _
#ifndef USE_USB_OTG_FS! W- @! }! r R- q5 h
#error "USE_USB_OTG_HS or USE_USB_OTG_FS should be defined"! W( l- F* b' u) D6 q7 l4 ~
#endif
#else //USE_USB_OTG_HS
#ifndef USE_ULPI_PHY
#ifndef USE_EMBEDDED_PHY
#error "USE_ULPI_PHY or USE_EMBEDDED_PHY should be defined"
#endif' k, x; W' E3 c! s/ J* I' K: @6 B
#endif
#endif2 w) ]7 U7 M7 Z# |+ z
/****************** C Compilers dependant keywords ****************************/$ b! v8 o' F' i3 E1 {9 F
/* In HS mode and when the DMA is used, all variables and data structures dealing; s1 b, Y1 P; u9 n7 S9 L9 \
with the DMA during the transaction process should be 4-bytes aligned */
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
#if defined (__GNUC__) /* GNU Compiler */
#define __ALIGN_END __attribute__ ((aligned (4)))
#define __ALIGN_BEGIN
#else 2 n3 Z5 Z; ]% A D8 f# V0 c; j" P
#define __ALIGN_END
#if defined (__CC_ARM) /* ARM Compiler */
#define __ALIGN_BEGIN __align(4) ; E5 A3 }: e4 [1 G' G E
#elif defined (__ICCARM__) /* IAR Compiler */" b# j9 G! i: l* G& b, X7 B
#define __ALIGN_BEGIN
#elif defined (__TASKING__) /* TASKING Compiler */
#define __ALIGN_BEGIN __align(4) 2 Z" q" r- Z9 W! F- K
#endif /* __CC_ARM */
#endif /* __GNUC__ */
#else- F3 S4 e: D9 q$ w1 z
#define __ALIGN_BEGIN
#define __ALIGN_END 2 x. b% F, K$ w, j! `4 H* U; r
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
/* __packed keyword used to decrease the data type alignment to 1-byte */
#if defined (__CC_ARM) /* ARM Compiler */
#define __packed __packed
#elif defined (__ICCARM__) /* IAR Compiler */# M& }1 [* @9 N9 N
#define __packed __packed
#elif defined ( __GNUC__ ) /* GNU Compiler */ / G% Z/ W% k( B) N( r" j
#define __packed __attribute__ ((__packed__))
#elif defined (__TASKING__) /* TASKING Compiler */2 w- X C8 Z6 I( N+ m$ x/ `1 r
#define __packed __unaligned$ E0 w' j4 n" w
#endif /* __CC_ARM */
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
int main(void){
2 d# L: E! L$ v; t0 s
/*!< 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.% d8 @! Y1 s, ]& {) u1 l7 w
To reconfigure the default setting of SystemInit() function, refer to) Z) q, h9 g! ~
system_stm32fxxx.c file1 K' u ~8 L/ ?
*/
/* Init Host Library */
USBH_Init(&USB_OTG_Core, 2 y. N- |6 w5 D n' A4 N1 l
USB_OTG_HS_CORE_ID,
&USB_Host,& u2 V0 j% z7 J: a: {
&USBH_MSC_cb, 3 k, h8 X5 b5 r& h: s
&USR_cb);
0 j0 d" O2 ]6 ^1 d2 B/ i+ U* h2 G
while (1){
/* Host Task handler */ g _- h% x- X- F
USBH_Process(&USB_OTG_Core, &USB_Host);% u! e2 O: S( b( o( t5 ?
if(iapRun==0){* V0 @8 ~+ c, g, f% i
IAP_URN_UserProgrammer();
}7 w% D2 q6 c9 i) e
}
}
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
case HOST_USR_INPUT: 7 ]* u& c) ` Y3 E$ U. [
/*The function should return user response true to move to class state */& `& v+ x' M, T. }( T
//修改:添加MSC-HID自动判别,然后再初始化CALSS-CB5 w2 L8 e% G7 N. k& \2 e% l% M
if(JB_MSC_HID(phost,0)){ //0:判别MSC,1:判别HID
SetHOST_USB_MODE(0);6 v. K2 c% J* e
phost->class_cb=&USBH_MSC_cb;
if((phost->class_cb->Init(pdev, phost)) == USBH_OK){+ _. \7 Q1 }- f
phost->gState = HOST_CLASS_REQUEST; # X. H" F! `4 C
}
}else{
if(JB_MSC_HID(phost,1)){ //0:判别MSC,1:判别HID7 o1 L$ q0 @& @" V3 o" i
SetHOST_USB_MODE(1);
phost->class_cb=&HID_cb;
//phost->usr_cb=&USR_Callbacks;//???????/ T0 S- D. r( R& i+ L2 i
if((phost->class_cb->Init(pdev, phost)) == USBH_OK){
phost->gState = HOST_CLASS_REQUEST; * x s! ?, m7 s( T5 y) D P
} 2 Q2 P$ B3 H, h1 U
}- t% K6 i8 W3 B7 g2 O2 h! ~
}
break;
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
/* Check for enumeration status */
if ( USBH_HandleEnum(pdev , phost) == USBH_OK){
/* The function shall return USBH_OK when full enumeration is complete */
2 O! p4 m' V: d
/* user callback for end of device basic enumeration */! F; d7 h, z7 O
phost->usr_cb->EnumerationDone();: s, g) R$ E8 Y0 Q; G
7 k( L" Y0 U" h5 f
phost->gState = HOST_USR_INPUT; 8 a& k( O& d$ V9 T% p# `3 ~
}
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
) \- i' r( K* E( I
if(flag==0){4 ]6 l' j* K- B8 n( s( C B4 y$ K
if(phost->device_prop.Itf_Desc[0].bInterfaceClass == MSC_CLASS){- L X9 ]. o! J2 U4 k4 c7 s
if(phost->device_prop.Itf_Desc[0].bInterfaceProtocol == MSC_PROTOCOL) return 1;1 {/ r# l1 f/ c' Y8 Q( `
}& D& F4 r) W7 P3 J" q
}else{2 _+ U4 V3 G8 u, P" b
if(phost->device_prop.Itf_Desc[0].bInterfaceSubClass == HID_BOOT_CODE) return 1;
}& W0 s. C0 T, H: V7 @
return 0;6 U- J H6 F2 f' `, r+ \
}
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 0 [5 ~8 y" v$ I$ y
* completion of the request. K& u! t6 L6 x& O$ @ _$ B% @9 a
* @param pdev: Selected device5 H3 I7 |3 q. ^. O$ n
* @param req: Setup Request Structure
* @param buff: data buffer address to store the response
* @param length: length of the response. x7 ^0 L4 y" E- S* W: q: B
* @retval Status
*/
USBH_Status USBH_CtlReq (USB_OTG_CORE_HANDLE *pdev, ! W0 z+ M' N0 |7 `9 A+ u
USBH_HOST *phost,
uint8_t *buff,; I, T' i; n! m3 S
uint16_t length)
{; H) f4 m& Z% R9 N0 g- M/ J
USBH_Status status;" {8 `/ Y* l* s# f" p+ k2 x
status = USBH_BUSY;
switch (phost->RequestState)
{
case CMD_SEND:
/* Start a SETUP transfer */! Z( q2 h( A1 S/ c
USBH_SubmitSetupRequest(phost, buff, length);
phost->RequestState = CMD_WAIT;
status = USBH_BUSY;: A( A4 p5 ?' p- G
break;- R, S: w% w% _# X8 H% ~' }% J, r
! J* V# A/ C$ U3 k
case CMD_WAIT:/ @- U. e, v6 L. [% z5 Q2 @
if(Get_HOST_USB_MODE()==0){ //--2014-3-30 添加2种模式判别!!!
if (status == URB_DONE){# N$ }$ k0 g9 H) S9 A
/* Commands successfully sent and Response Received */ 0 u9 I& w, t x, O; {( m
phost->RequestState = CMD_SEND;
status = USBH_OK;
}
else if (status == URB_ERROR){
/* Failure Mode */
phost->RequestState = CMD_SEND;
status = USBH_FAIL;
}
else if (status == URB_STALL){. I& ~/ u. E6 ]* R- Y+ X
/* Commands successfully sent and Response Received */ : U" M3 I v& Z& A& g7 A1 Y
phost->RequestState = CMD_SEND;
status = USBH_NOT_SUPPORTED;0 ~5 {5 D7 X) H% Y# Q
}
}else{/ [5 v* o' k1 ]7 R$ W3 P! s$ B
if (phost->Control.state == CTRL_COMPLETE ){//HID 处理!!# o& h7 a4 W5 z6 t/ a
// Commands successfully sent and Response Received ( w. T; y. z. x* a) h
phost->RequestState = CMD_SEND;
phost->Control.state =CTRL_IDLE;
status = USBH_OK; ' i& Y( [" U! g3 |1 m- A
}
else if (phost->Control.state == CTRL_ERROR)
{
// Failure Mode
phost->RequestState = CMD_SEND;# m" _3 e) ~! {. {# B
status = USBH_FAIL;7 S/ r0 S$ A; R! G7 d
}
else if (phost->Control.state == CTRL_STALLED )
{
// Commands successfully sent and Response Received
phost->RequestState = CMD_SEND;
status = USBH_NOT_SUPPORTED;/ Z! j! v% S8 G
}! j. N: N+ `1 X5 G3 ?9 Z
}
break;: k2 N+ ?+ ~$ q, z, ?" |4 ]
//-------------------------------------
default: f: k9 ^& G! j9 I& m
break;
}
return status;: k& `4 s9 Y% [7 V8 H' a
}
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
回复:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发