最全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的合并开发
继续发图:8 Z J0 V) S5 ]. I" I+ V
电路很简单,占用F207的HS-usb:1 d3 S- V) ~6 q* @ j4 Q
2 \4 E3 G; J8 }5 e4 r$ @- g- X
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev){4 P) ?" N% J4 G. U+ W' Y/ o
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB , ENABLE);) ?) e1 t8 R4 x: I
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | : e$ S4 g D1 }' {6 l) X
GPIO_Pin_13 |
GPIO_Pin_14 | . B+ a4 D8 z- H; m0 E
GPIO_Pin_15;7 z2 O/ z( h* n* [
4 H; F/ n6 `# L9 @: |( a; M$ s2 C
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;, K& e' ]' y9 r% I
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init(GPIOB, &GPIO_InitStructure);
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) ;
//---------------------------------------------------------------2 D, U3 f$ L H
RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_OTG_HS, ENABLE) ;
//-----------------------------------------------------------------
//Vbus_EN 根据实际电路修改!
RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOE , ENABLE) ; 6 {. ]& G. G; |0 Y. {
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ; 3 ?8 ^# @, p+ z2 d+ O+ {# v% z
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;0 o2 p( C: a- }; \1 i( K, B
GPIO_Init(GPIOE, &GPIO_InitStructure);
. u1 @7 o' I* O1 [ G8 O
GPIO_ResetBits(GPIOE, GPIO_Pin_0);
//-------------------------------------------------------------------# p) Y( C s& G- w* l3 b
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% i: R7 R' c( @" o- r
#define USE_USB_OTG_HS
#endif /* USE_USB_OTG_HS */0 a; O r" B: J" h3 n; p. P9 t
#ifndef USE_ULPI_PHY/ S# `$ r% {8 U. c" r1 L
//#define USE_ULPI_PHY2 M# f# V" L5 f Q
#endif /* USE_ULPI_PHY */
#ifndef USE_EMBEDDED_PHY+ V. [6 g% q M- F5 C$ O
#define USE_EMBEDDED_PHY- W6 {# W7 B, X8 f- a _4 X
#endif /* USE_EMBEDDED_PHY */
#ifdef USE_USB_OTG_HS ; P. U5 {5 F3 c
#define USB_OTG_HS_CORE( g1 v0 s* Y, Q0 p
#endif
/*******************************************************************************
* FIFO Size Configuration in Host mode
* ' |2 D) B' c9 d j, }
* (i) Receive data FIFO size = (Largest Packet Size / 4) + 1 or 6 d6 [4 F" s+ d l/ d
* 2x (Largest Packet Size / 4) + 1, If a
* high-bandwidth channel or multiple isochronous 9 f1 l* |) V* P$ ^) G2 s
* channels are enabled
*
* (ii) For the host nonperiodic Transmit FIFO is the largest maximum packet size ' s( {) m- d" a! W P5 U; `+ p
* for all supported nonperiodic OUT channels. Typically, a space : v2 _$ R% P A" T( ]
* corresponding to two Largest Packet Size is recommended.
*& X: c' M: _: X K2 U! x( h+ a
* (iii) The minimum amount of RAM required for Host periodic Transmit FIFO is - A$ T# V2 h% E4 Z6 H1 a. J$ M
* the largest maximum packet size for all supported periodic OUT channels.6 X. c8 N6 f% r1 S7 @. }' I4 |
* If there is at least one High Bandwidth Isochronous OUT endpoint, + W' |8 Y$ j% ?/ y. a
* then the space must be at least two times the maximum packet size for * J: u9 Y# j! F' b6 c7 u% j
* that channel.
*******************************************************************************/
+ ?. X# e, F: I/ y9 M ]/ N
/****************** USB OTG HS CONFIGURATION **********************************/
#ifdef USB_OTG_HS_CORE4 c+ p# K+ D7 W4 I) t
#define RX_FIFO_HS_SIZE 512
#define TXH_NP_HS_FIFOSIZ 256
#define TXH_P_HS_FIFOSIZ 256
// #define USB_OTG_HS_LOW_PWR_MGMT_SUPPORT5 \! u& |$ W: T& d
// #define USB_OTG_HS_SOF_OUTPUT_ENABLED
#ifdef USE_ULPI_PHY
#define USB_OTG_ULPI_PHY_ENABLED: a+ m8 H q! K+ W
#endif4 e( U V8 w# X
#ifdef USE_EMBEDDED_PHY, Q& d! o7 Q |& H5 d+ B0 S
#define USB_OTG_EMBEDDED_PHY_ENABLED$ {8 Q+ q$ q7 f \9 B
#endif( C. Q; }' ~0 i7 F
#define USB_OTG_HS_INTERNAL_DMA_ENABLED
#define USB_OTG_EXTERNAL_VBUS_ENABLED1 F' M% r! E% n7 N; p
//#define USB_OTG_INTERNAL_VBUS_ENABLED5 g% X9 O# x/ W( P
#endif5 a6 Q) o- W$ F5 w9 l& M- T
/****************** USB OTG FS CONFIGURATION **********************************/
#ifdef USB_OTG_FS_CORE
#define RX_FIFO_FS_SIZE 1280 J) o- j6 H) k9 R3 Z& Z9 [. L7 J) R
#define TXH_NP_FS_FIFOSIZ 96$ r( e; S+ o1 G8 \& e
#define TXH_P_FS_FIFOSIZ 965 X1 P0 a" z0 ~6 X; h
// #define USB_OTG_FS_LOW_PWR_MGMT_SUPPORT
// #define USB_OTG_FS_SOF_OUTPUT_ENABLED1 Z0 \8 [9 i6 s2 N
#endif, |6 ~, X6 y! Z1 d8 U& `
/****************** USB OTG MODE CONFIGURATION ********************************/
#define USE_HOST_MODE& |6 m) H' M4 h* U/ M
//#define USE_DEVICE_MODE
//#define USE_OTG_MODE e1 O* H7 X3 w4 X8 a
#ifndef USB_OTG_FS_CORE
#ifndef USB_OTG_HS_CORE9 A$ N$ {4 i y; Z7 A$ g
#error "USB_OTG_HS_CORE or USB_OTG_FS_CORE should be defined"
#endif
#endif8 z& I( o3 H, c7 W' S. d+ L
#ifndef USE_DEVICE_MODE$ n% y% ~" u9 ~, M0 G
#ifndef USE_HOST_MODE
#error "USE_DEVICE_MODE or USE_HOST_MODE should be defined"
#endif
#endif
#ifndef USE_USB_OTG_HS( b8 A% d' }: p( C4 }0 h6 X8 y
#ifndef USE_USB_OTG_FS6 e, e" p* G u( ]- E9 D
#error "USE_USB_OTG_HS or USE_USB_OTG_FS should be defined"0 [1 q' Z* a$ R. d4 q
#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
#endif
#endif2 o9 ~& C" p+ x) f" ?/ x9 _* |
/****************** C Compilers dependant keywords ****************************// N) t: K! R' |9 D$ u
/* In HS mode and when the DMA is used, all variables and data structures dealing
with the DMA during the transaction process should be 4-bytes aligned */ ! S4 F. y! F2 z2 G3 T. O5 ]
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED" d N- K4 {7 o& o" m
#if defined (__GNUC__) /* GNU Compiler */7 K; [3 t( k, S5 R- v( \
#define __ALIGN_END __attribute__ ((aligned (4)))" X3 Y! ]- r( B5 x
#define __ALIGN_BEGIN
#else
#define __ALIGN_END
#if defined (__CC_ARM) /* ARM Compiler */
#define __ALIGN_BEGIN __align(4)
#elif defined (__ICCARM__) /* IAR Compiler */! `* u; x, ` i& m+ N1 I' ^
#define __ALIGN_BEGIN 1 K; W: I$ G/ T9 {$ [0 B, w$ T8 ~
#elif defined (__TASKING__) /* TASKING Compiler */
#define __ALIGN_BEGIN __align(4)
#endif /* __CC_ARM */ . q: k" w6 W4 P
#endif /* __GNUC__ */
#else
#define __ALIGN_BEGIN$ s" O. K3 X' }; L
#define __ALIGN_END
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */5 Q& g- ?. [4 m4 k v; `8 k/ F
/* __packed keyword used to decrease the data type alignment to 1-byte */
#if defined (__CC_ARM) /* ARM Compiler */
#define __packed __packed, r4 |' {& k9 ^$ O4 o/ H5 q, z
#elif defined (__ICCARM__) /* IAR Compiler */3 b8 w( n- Z. L0 n' T6 ?8 o
#define __packed __packed& G( p! P7 X% [3 Z( X
#elif defined ( __GNUC__ ) /* GNU Compiler */ 5 z+ K. O' C, S
#define __packed __attribute__ ((__packed__))
#elif defined (__TASKING__) /* TASKING Compiler */
#define __packed __unaligned. L( X- Q/ j7 k6 P
#endif /* __CC_ARM */
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
int main(void){; m! g& f& F4 x
% [# m3 t: j- C: P9 q
/*!< At this stage the microcontroller clock setting is already configured, }# Z# x* p0 U2 f; d5 C
this is done through SystemInit() function which is called from startup- |; R/ o y# S1 C
file (startup_stm32fxxx_xx.s) before to branch to application main., \$ }2 K/ B- `) `. w' h
To reconfigure the default setting of SystemInit() function, refer to
system_stm32fxxx.c file
*/ 1 e7 ]3 x: R. ~3 D9 \
/ k. u3 u/ a' r/ b# a( y! B. H1 Y
/* Init Host Library */& d" k: X6 a& |
USBH_Init(&USB_OTG_Core, / {5 O! A- P: ~. R" B1 S* C
USB_OTG_HS_CORE_ID,
&USB_Host, c+ z+ |& \: q3 p& S) g. K. |
&USBH_MSC_cb,
&USR_cb); D( S$ y/ A# ~& e: G! O
9 Q8 R9 D! X; l) y: h1 C" P: m& v
while (1){* g$ a: N5 w" C3 \, \( }
/* Host Task handler */
USBH_Process(&USB_OTG_Core, &USB_Host);5 j! B2 V2 F; C5 @* b- A6 z! N
if(iapRun==0){
IAP_URN_UserProgrammer();9 V, S9 B0 g7 O- q
}
}' _$ V' k1 ~3 |+ M0 C
}
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
case HOST_USR_INPUT: 7 n' d2 P, n, \% L5 @, ^# P2 I' ?* ~# @: `
/*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:判别HID
SetHOST_USB_MODE(0);
phost->class_cb=&USBH_MSC_cb;" k, A+ m8 G' @3 o7 @3 D E
if((phost->class_cb->Init(pdev, phost)) == USBH_OK){
phost->gState = HOST_CLASS_REQUEST;
} , @8 q. B( ? p
}else{
if(JB_MSC_HID(phost,1)){ //0:判别MSC,1:判别HID
SetHOST_USB_MODE(1);
phost->class_cb=&HID_cb;1 X0 K. J" P/ B! r" a3 x
//phost->usr_cb=&USR_Callbacks;//???????0 v9 Z j4 }6 T7 A
if((phost->class_cb->Init(pdev, phost)) == USBH_OK){
phost->gState = HOST_CLASS_REQUEST;
} ) @ i* @6 J x* Y0 O
}( }5 E) U' z1 ~
} # w4 d/ i& X; x
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 */
/* user callback for end of device basic enumeration */
phost->usr_cb->EnumerationDone();! U7 ?, J9 i H |
phost->gState = HOST_USR_INPUT;
}5 a& U. M% L8 r( ^
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:判别HID7 N8 B$ [2 \8 U* S) C/ L3 Q
if(flag==0){
if(phost->device_prop.Itf_Desc[0].bInterfaceClass == MSC_CLASS){
if(phost->device_prop.Itf_Desc[0].bInterfaceProtocol == MSC_PROTOCOL) return 1;3 v$ O i+ e5 U% ~
}
}else{
if(phost->device_prop.Itf_Desc[0].bInterfaceSubClass == HID_BOOT_CODE) return 1;
}
return 0;
}
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 # y+ Q0 C0 [& q5 |, e
* completion of the request% X# |/ Q: m3 t1 _2 [
* @param pdev: Selected device. e, y+ c3 S2 z( B
* @param req: Setup Request Structure
* @param buff: data buffer address to store the response+ b3 B! G* N- ^4 T5 j8 z
* @param length: length of the response
* @retval Status
*/
USBH_Status USBH_CtlReq (USB_OTG_CORE_HANDLE *pdev,
USBH_HOST *phost, . @* h; m6 h# l- g
uint8_t *buff,
uint16_t length)
{% p8 w9 J5 Z8 Z
USBH_Status status;
status = USBH_BUSY;
7 c7 ^ W E. e8 I4 i
switch (phost->RequestState)
{
case CMD_SEND:
/* Start a SETUP transfer */
USBH_SubmitSetupRequest(phost, buff, length);& t; e' Z$ K# ~/ J! e% E! X" v3 m
phost->RequestState = CMD_WAIT;
status = USBH_BUSY;2 |" @; Y$ J' M8 T9 S
break;
case CMD_WAIT:2 ~) @5 x5 g- B
if(Get_HOST_USB_MODE()==0){ //--2014-3-30 添加2种模式判别!!!
if (status == URB_DONE){( s Z/ u& x6 W0 H
/* Commands successfully sent and Response Received */ 0 |3 `" J6 ?. M- d" O; E% b1 _
phost->RequestState = CMD_SEND;* F9 M/ C9 |, V
status = USBH_OK;
}
else if (status == URB_ERROR){+ F1 A; C d3 W' O
/* Failure Mode */& S2 `* B7 Z- Z1 v: p- @
phost->RequestState = CMD_SEND;. Y* g" L6 ^1 G \# p
status = USBH_FAIL;
}
else if (status == URB_STALL){$ w9 d3 O1 \; z+ p4 B
/* Commands successfully sent and Response Received */ , B5 v% c: |* a3 y
phost->RequestState = CMD_SEND;
status = USBH_NOT_SUPPORTED;" D5 T2 a/ n. L4 {+ {; ^$ i
}+ T( Z: Y0 \% e( i6 A( n2 [
}else{
if (phost->Control.state == CTRL_COMPLETE ){//HID 处理!!& e8 A5 } T4 Z0 F2 L
// Commands successfully sent and Response Received
phost->RequestState = CMD_SEND;
phost->Control.state =CTRL_IDLE; & Z9 P4 _" f" _$ c+ J3 G( ]* \
status = USBH_OK;
}/ Q/ U; L5 s* f! @ y
else if (phost->Control.state == CTRL_ERROR)$ S8 w2 \% \5 U
{1 F' g/ Y3 Z, @) m/ n/ q
// Failure Mode + E: a, i B0 f/ C2 J: ^2 U6 \
phost->RequestState = CMD_SEND;
status = USBH_FAIL;% j9 y# _( A; F- q" r( m% T
} 9 o9 ^5 e9 k$ c" M6 g. N
else if (phost->Control.state == CTRL_STALLED )
{
// Commands successfully sent and Response Received ) L% n: |/ [! R3 y# A4 d
phost->RequestState = CMD_SEND;
status = USBH_NOT_SUPPORTED;
}. J5 x- F0 X2 J4 ?' A% j
}3 Q u$ r n; d- ^3 E0 e
break;
//-------------------------------------
default:
break;
}- Q, _- O$ g; H7 U0 T5 x/ {
return status;* R: a# @, t9 e& I @, \% K2 x1 [
}
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
回复:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发