|
最近产品需要一个USB主机测试治具,所以需要做一个USB HOST去读取HID设备的数据,由于以前也没做过USB方面的项目,对这一块也不是很熟悉,因此遇到了很多困难,所幸的是经过两天半的努力,最终完成了CH375B的调试。 不多废话,先上一张我调试的MCU管脚分配图 6 `4 ]2 j2 I% c( o; S- N; i
7 x5 u; I h" x1 U! M6 C i

: l% v% I5 q) K; l) A0 j+ c: L- f 头文件 % `* w% E, W- |5 L7 R* g/ l* ~$ b
" ]. A( |2 D9 h5 L5 Y* G6 s4 u详细的代码如下: - #ifndef __BSP_INIT_H__ 8 B- n5 M* ]- t( X9 w
- #define __BSP_INIT_H__ ) d) o9 V2 p9 c; A' N
-
* S7 L' q) {: J$ c& V2 W: X - #include "stm32f0xx_hal.h"
3 @8 A5 a& Q/ E4 N8 v - #include "config.h" % b# v- H$ M& V8 L' D/ O- p
-
9 ^; e- N) o0 W - typedef struct
& Q- {5 E& n$ W' ?, B. p - {
8 e8 t8 W( A! ~# L" ^3 a/ e/ a: X - struct
5 p, d/ I/ ^/ r0 u! S; X - {
0 q: n1 V" Q, L ?+ v, J# h: Q - uint16_t USB_BaseTime;
1 G1 A; I1 k, Y% [* U; D/ g4 z - uint8_t USB_Flag;
4 K9 n; G, F; [! F0 N3 f - }USB_Heart;
9 s7 A0 b: j9 e. I2 o - }Sys_Heart_Def;
L' X) [' K# J8 h$ q" V -
2 m& B, p. y9 O - typedef struct 3 r; C7 @7 _% |
- { 2 L/ A& h8 H# L- h# V, R
- Sys_Heart_Def Sys_Heart_Info; ( K. y# I& J B2 a/ O- J5 b% D5 ^
- uint8_t USB_Connect_Status; ! H( M& Z* V3 L1 F% s9 d/ N
- }Sys_Param_Def;
- C- f! b" C. G4 K4 M8 V o! o+ |9 x* c -
+ K& m0 W4 T% B, |/ v! U' Z - extern Sys_Param_Def SysParam_Info; # g/ V; O! u9 V" j/ |& C5 }
- extern UART_HandleTypeDef HAL_CH375_USART; " N7 N6 ~8 G b! B
- % V$ o+ ]9 `. u2 e. L) ~2 L
- void Error_Handler(void); 4 v) ~) V4 z& R; \; p4 `( z: B7 |: D
- void Bsp_Peripherals_Init(void); ' a8 i1 d) L4 W; }, ^
-
. }7 N! n+ e" R$ W( c - #endif
" c+ g) Z; m& r: |
复制代码
: x' h( t- t& b4 @% b n详细的代码如下:. o+ H( v' @. }4 N$ x# `
- H% v6 J# P6 z( J/ e- {" O7 f- #include "bsp_init.h"
+ d) _" s8 C. W2 u* Y - . i' ?$ g' n8 ]- [: n" T
- Sys_Param_Def SysParam_Info; 9 d$ U$ x* l6 B Q% K, S
- /* Private variables ---------------------------------------------------------*/
2 k" G! ^/ s+ O9 t; s6 F - UART_HandleTypeDef HAL_CH375_USART;
% e' z* J& ~) ]4 e- j) ` -
6 H9 j, j1 C+ \! ]: F: W - void Bsp_SystemClock_Init(void) ( \* V0 L5 g5 Q8 I+ l/ W
- {
* ^9 y6 x) O3 `$ ^6 t( B4 P: [ - RCC_OscInitTypeDef RCC_OscInitStruct; Y5 k- f5 Z; w8 H# n: T% P- m4 @
- RCC_ClkInitTypeDef RCC_ClkInitStruct;
% R' D/ a9 a* j/ J8 l - RCC_PeriphCLKInitTypeDef PeriphClkInit;
N) y* u2 V7 l2 K6 q6 r -
1 g* e R v4 t9 H* I) a. ?) J, k - /* Initializes the CPU, AHB and APB busses clocks */ 9 a' T# t8 U# }7 L6 p2 i
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; 0 i6 r j/ y) ^8 e
- RCC_OscInitStruct.HSIState = RCC_HSI_ON;
: @ f2 ~& _0 x0 D; a - RCC_OscInitStruct.HSICalibrationValue = 16; * _+ M, Z5 C1 k, l
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
2 g5 k2 m" l8 a2 Z$ v; S% p. O - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
" U0 a2 b( p; a3 G - RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12;
' _+ q5 s" R3 {: H8 _) b$ a Q1 n& L - RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1; ) |) u/ E1 M9 }4 ]; o
- if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) ( D" I: t' {4 U
- {
1 }+ k" s! S, v7 X4 b* d - Error_Handler(); 6 ?8 F, R8 G* ^/ B' x: Y2 _
- } * ~' s6 p2 V* _
- , @& \& W! f k
- /* Initializes the CPU, AHB and APB busses clocks */
~% P5 ~" L- J$ c0 n - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
" j! x7 \7 O5 l, `0 K& K - |RCC_CLOCKTYPE_PCLK1; / Q* B3 J: Q. [7 |
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
' z- s a6 H( q0 P9 O' |! _ - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
3 q7 Q1 k7 n, e ` - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; * n6 @. _0 H E6 [* w
-
$ D2 a6 F8 h' U' l R0 t - if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) 4 b# P- a9 v, Q$ t6 e" ^6 u
- { 8 u* J. c: d C8 C! @' V" R$ ?- D
- Error_Handler(); / A+ ]) f/ k4 o) o% F" M
- }
; s) v) z% x4 c -
3 ~6 a! H3 R. w5 j% k/ s - PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1; 0 Q5 n- P- v5 E5 D
- PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1; ( H' T8 y7 E2 W2 D1 i
- if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
) u% e! s& }5 x - { / o1 @; S: ?% b7 P* T
- Error_Handler();
7 i7 J5 w7 O7 M/ G( G: m. @1 h - }
( q5 m' A" _# s, n - ( O) G6 C; _ [
- /* Configure the Systick interrupt time */ " p% j: C) p' \9 S4 F5 K
- HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
7 ]/ k: g5 y% X; [$ g - . k; K+ @$ n9 @% S5 ^) P
- /* Configure the Systick */
( \" H8 W( m' g - HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
* w5 R! u4 S& ~ - ) |$ O0 y: F w) V- U5 R
- /* SysTick_IRQn interrupt configuration */
/ ]* J* Y) u! K - HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
; L4 |+ P U; \' w' V - }
: x% }3 p; {% _ B' M+ u - & W0 b# p7 q" v: I6 C4 s
- void Bsp_GPIO_Init(void) ! @) }7 D* p2 W( ?% c. Y8 P
- { * n3 u/ t) r0 J$ x+ _4 S5 O
- GPIO_InitTypeDef GPIO_InitStruct; % _* Y* _' f1 [/ }
- , D6 t. F/ n1 t ^
- /* GPIO Ports Clock Enable */
8 w, n4 y* Z8 f6 x8 k: G - __HAL_RCC_GPIOC_CLK_ENABLE();
. K; t9 w2 O" x C/ C- _: J - __HAL_RCC_GPIOA_CLK_ENABLE(); ) G, j) r9 k) O$ D% j* V
- __HAL_RCC_GPIOB_CLK_ENABLE();
. t! C' Q7 R$ m" ?- X -
. x; q( a# D% P1 T - /*Configure GPIO pin Output Level */
9 U9 {* w, s8 V7 [$ s8 y3 f - HAL_GPIO_WritePin(CH375_D0_GPIO_Port, CH375_D0_Pin, GPIO_PIN_SET);
& b* L: q, Z6 J; y% k/ z - HAL_GPIO_WritePin(CH375_D1_GPIO_Port, CH375_D1_Pin, GPIO_PIN_SET);
- B1 Z* L+ E4 ~; p6 y1 R - HAL_GPIO_WritePin(CH375_D2_GPIO_Port, CH375_D2_Pin, GPIO_PIN_SET);
* V4 F0 F- C/ V - HAL_GPIO_WritePin(CH375_D3_GPIO_Port, CH375_D3_Pin, GPIO_PIN_SET); 9 S- G6 a9 R$ W! `! s" T3 J
- HAL_GPIO_WritePin(CH375_D4_GPIO_Port, CH375_D4_Pin, GPIO_PIN_SET); & S9 D+ w, J! l( C- Z6 n2 J: f2 x
- HAL_GPIO_WritePin(CH375_D5_GPIO_Port, CH375_D5_Pin, GPIO_PIN_SET); - R7 H( I* d# _
- HAL_GPIO_WritePin(CH375_D6_GPIO_Port, CH375_D6_Pin, GPIO_PIN_SET);
; I( F5 O! U. t5 K" s - HAL_GPIO_WritePin(CH375_D7_GPIO_Port, CH375_D7_Pin, GPIO_PIN_SET); ! l' C+ ?; X% ^ a. D- E. O) u
- /*Configure GPIO pin Output Level */
9 K5 C$ m3 K; l: s - HAL_GPIO_WritePin(CH375_WR_GPIO_Port, CH375_WR_Pin, GPIO_PIN_SET); $ O, l7 H1 |6 j1 j
- HAL_GPIO_WritePin(CH375_RD_GPIO_Port, CH375_RD_Pin, GPIO_PIN_SET);
, Q) \: n1 |7 T; V# {2 ~+ r! c - HAL_GPIO_WritePin(CH375_CS_GPIO_Port, CH375_CS_Pin, GPIO_PIN_SET); 5 @* ^$ u- |0 N
- HAL_GPIO_WritePin(CH375_A0_GPIO_Port, CH375_A0_Pin, GPIO_PIN_SET); f: C8 K: b) Q& w3 m
-
9 `) W& A3 z: t& @$ e - /*Configure GPIO pin : CH375_INT_Pin */ ( n( _, a5 ^8 l3 D
- GPIO_InitStruct.Pin = CH375_INT_Pin;
/ Q# u/ A0 m. v/ E7 D$ A - GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; 7 [8 G7 w( ?, D& x4 Y0 X6 z% k
- GPIO_InitStruct.Pull = GPIO_PULLUP; ! o/ k- {7 A. I
- HAL_GPIO_Init(CH375_INT_GPIO_Port, &GPIO_InitStruct); - t1 J- c. t* F9 a$ Z% R
- 7 R; n/ `. R8 K6 J6 J6 Z
- /*Configure GPIO pins : CH375_D0_Pin CH375_D1_Pin CH375_D2_Pin CH375_D3_Pin
! D$ z1 i+ g. t9 f- q9 Y$ ` - CH375_D4_Pin CH375_D5_Pin CH375_D6_Pin CH375_D7_Pin */ # I) e' u/ }7 h! v, h; {; [& ]
- GPIO_InitStruct.Pin = CH375_D0_Pin;
$ X9 g% N* C& T5 W3 t8 } - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
' B% S; _3 e4 N5 P9 |4 ?2 K - GPIO_InitStruct.Pull = GPIO_NOPULL; - ?) g; ^; T3 K
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; ! F% \9 ]) o$ S- F
- HAL_GPIO_Init(CH375_D0_GPIO_Port, &GPIO_InitStruct);
' T& m6 b3 Z# L2 Q -
# i3 T6 e4 K Y# I; y$ v( R - GPIO_InitStruct.Pin = CH375_D1_Pin; / P" x$ S3 \7 S
- HAL_GPIO_Init(CH375_D1_GPIO_Port, &GPIO_InitStruct); 4 _& r$ w! ~4 ^" |
- & J/ @- `% D$ `5 ?
- GPIO_InitStruct.Pin = CH375_D2_Pin; $ y1 ~1 [" Q9 X9 `7 U
- HAL_GPIO_Init(CH375_D2_GPIO_Port, &GPIO_InitStruct);
/ W' `0 |, X7 q6 n -
0 k; @* T f: [! i& X- ]8 F - GPIO_InitStruct.Pin = CH375_D3_Pin;
& l4 a2 I0 i9 n1 }1 ^2 ]) H4 R - HAL_GPIO_Init(CH375_D3_GPIO_Port, &GPIO_InitStruct); 2 I0 y3 O T& Q K9 L$ P3 _
- . ?+ f% K$ |" ]7 ]
- GPIO_InitStruct.Pin = CH375_D4_Pin;
- f7 A; T! g( f9 @ - HAL_GPIO_Init(CH375_D4_GPIO_Port, &GPIO_InitStruct); ( K2 U1 ~. [% F
- 0 ]4 v5 Z% I/ s6 c# ~0 I
- GPIO_InitStruct.Pin = CH375_D5_Pin; + j: }. C( {5 i" N% e$ v7 K
- HAL_GPIO_Init(CH375_D5_GPIO_Port, &GPIO_InitStruct); ! T- ~7 O1 \5 K5 U( w! G# ?( ^
- " z |$ Q% f! o5 G: t+ l
- GPIO_InitStruct.Pin = CH375_D6_Pin; I' f0 c/ Y P- o
- HAL_GPIO_Init(CH375_D6_GPIO_Port, &GPIO_InitStruct);
( u6 g+ z& L4 L. n' u - 3 h1 Q% u: k# G3 N4 B
- GPIO_InitStruct.Pin = CH375_D7_Pin;
- q; Q$ @! s0 g E - HAL_GPIO_Init(CH375_D7_GPIO_Port, &GPIO_InitStruct);
) h0 p! {6 y# ~ D+ g -
: L" O7 H6 H: K9 f) @! C6 ] - /*Configure GPIO pins : CH375_WR_Pin CH375_RD_Pin CH375_CS_Pin CH375_A0_Pin */ ; O# S" p7 ~) _; `, A, I j
- GPIO_InitStruct.Pin = CH375_WR_Pin;
- G/ {2 z1 j- t# V' V; d - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
3 D% ~3 h$ x, S% R% B5 ~ - GPIO_InitStruct.Pull = GPIO_NOPULL; ) c# O6 w. K* J% a( X9 V
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; 7 { f# {% f- T' W
- HAL_GPIO_Init(CH375_WR_GPIO_Port, &GPIO_InitStruct);
8 i4 C' J5 b# e, j/ | - # U0 d& k0 I% [5 w
- GPIO_InitStruct.Pin = CH375_RD_Pin;
# M+ f8 f& Y" W- T# |; } - HAL_GPIO_Init(CH375_RD_GPIO_Port, &GPIO_InitStruct);
0 s5 ]# D& |. L5 g# X. L( S& A* Z - , T) a" k5 n* \% h L, q# }
- GPIO_InitStruct.Pin = CH375_CS_Pin;
4 @6 m; e/ v) h6 y6 d# ]! {, a - HAL_GPIO_Init(CH375_CS_GPIO_Port, &GPIO_InitStruct);
! v q! ?7 m; h1 Y -
% I% G4 V% f, \/ s- N- g - GPIO_InitStruct.Pin = CH375_A0_Pin; 6 o$ W: E6 }, C1 z$ k$ m
- HAL_GPIO_Init(CH375_A0_GPIO_Port, &GPIO_InitStruct); 7 n: {) P% ~0 o
-
8 y5 o9 [7 @' D - HAL_NVIC_SetPriority(EXTI4_15_IRQn,0,0); 4 W# G# K/ K, b9 @% I2 A
- HAL_NVIC_DisableIRQ(EXTI4_15_IRQn); 5 L. x9 f: v' v h# q
- } . \/ p. V! r$ |
-
, G/ J/ T% B* ~, \; t* h7 e9 v0 d - void Bsp_CH375_USART_Init(void)
! `8 G/ `7 P% W: M$ d - {
) B7 C4 ]; p8 n - % J" d. ~6 T u( e% I; x7 h
- HAL_CH375_USART.Instance = USART1;
1 k: B- u' A. \5 ~0 T) M - HAL_CH375_USART.Init.BaudRate = 115200;
$ f2 n# i0 r+ `% x - HAL_CH375_USART.Init.WordLength = UART_WORDLENGTH_8B;
3 H) [% w. a* F( v" o - HAL_CH375_USART.Init.StopBits = UART_STOPBITS_1;
4 ^2 g9 n5 i2 j9 O - HAL_CH375_USART.Init.Parity = UART_PARITY_NONE;
, L+ {! J8 {9 s4 N5 c( c6 @! c5 { - HAL_CH375_USART.Init.Mode = UART_MODE_TX_RX; % a1 C2 l! x/ O, D& r6 d% \
- HAL_CH375_USART.Init.HwFlowCtl = UART_HWCONTROL_NONE;
& W' I" m" q- r/ } - HAL_CH375_USART.Init.OverSampling = UART_OVERSAMPLING_16;
1 s0 S9 X9 O; E6 a - HAL_CH375_USART.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
, O- n" F6 W# V8 `8 w$ v - HAL_CH375_USART.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; ' ]; D e' Z- r. s" _. O' m8 [2 \
- if (HAL_UART_Init(&HAL_CH375_USART) != HAL_OK) 8 }$ }9 Y% C5 {- i! t
- {
6 Q4 l) e/ @: b9 u' c* b e& ]1 ] - Error_Handler(); $ l; e& X7 Z+ c' z: ]
- } 4 o; p; R/ q1 F, E3 I+ M
- __HAL_UART_ENABLE(&HAL_CH375_USART);
6 V e" U" Y# R/ U( ~ - }
$ F- ^9 a( ~5 V - ! _' _/ {, |6 o- e0 `
- void Bsp_Peripherals_Init(void)
/ i% j* s" G# o ] - {
' r" q' H. [; S4 t/ d& Q8 h9 B - /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ ; v; p1 m9 F) I7 l9 {
- HAL_Init();
0 D, N9 s/ F3 h g' N - /* Configure the system clock */
0 B7 z- K. Y) ?, Z - Bsp_SystemClock_Init();
" {5 f0 G3 h) q7 \+ n" Z; s - Bsp_GPIO_Init();
6 `* M7 F( ^, z3 {, h8 ^5 A- E - Bsp_CH375_USART_Init();
) N9 G( |4 |/ Q+ R0 a! ]! e) x - } / A# K7 }- |$ v( ~2 `- A' ]
-
# H: R$ k' \4 o - /**. s0 ?$ q& C# V7 X0 Q( S2 h
- * @brief This function is executed in case of error occurrence.
+ t* W' p) h6 @* P) e; t& [9 i! s! ] - * @param None! J( b; u% T. r' C3 }( b) _) K
- * @retval None
. Y* i, J' M- E3 d9 U. X' L - */
8 }5 c1 C K( W3 e4 y - void Error_Handler(void) # L- n# ~& Y3 v/ W# m
- { , i; W- G# q7 `+ Q6 Y1 h
- /* USER CODE BEGIN Error_Handler */
4 q9 C- ^, o( [! A7 E* T7 O, Y8 O - /* User can add his own implementation to report the HAL error return state */ % p$ H! Q1 W) {: t
- while(1) % j. C; F8 l! Q3 F, h% Q) Q
- { 7 l8 o) l2 X# f' X: F
- } - M" U& R: e+ t' z
- /* USER CODE END Error_Handler */ 9 b3 j: O; e- S& B
- }
* \6 q( |' i- ]2 ~: S. q - . |6 f# p. o3 o; e9 |) w, J: x
- /***/
复制代码 2 v; [* y/ ~4 T6 f$ `3 s% l& n. @5 x
转载自:xqhrs232
- t4 W7 U. _+ C6 } `
$ G& `, T. ]3 o# \
- b M0 X6 {" Y k' y |