简单写一下失败经历。
. h# ^2 }* Z4 y3 I8 o 用的CubeMX版本是4.20.0如下图,用的Keil5编译代码,编译结果0 Error(s),0 Warning(s)。
8 C+ g5 O6 Q2 |
3 p$ f5 F% t$ |; m% c( U Hex文件也可以正常下载到单片机,但是LED不亮。
, f$ }) |$ Z) K2 d5 s
& y0 \ @9 D# M9 k$ Z/ I1 W, [2 H( u1 b$ i6 M' u% ~8 @
在CubeMX中配置了时钟,如下图。. r9 g% t7 [% g; w# q. V# X
u4 s( k. c- h- t( ^ CubeMX生成的main.c中Clock代码是这样的: M. R1 Z# _% i' a# ]5 ~; ?
- 7 W7 j. ~$ m, |& ]2 d! ^/ b6 X; v
- /** System Clock Configuration
# R0 }5 u3 i2 i5 s - */ B9 v f3 j* \8 {% ?5 a* s
- void SystemClock_Config(void)3 t. y9 \: ~$ ]; s" t* r' E7 w h) M. G
- {& P. ~3 @& L0 P6 h) Y. h
- + b- i, X1 b6 |1 V* ^" w/ F. C
- RCC_OscInitTypeDef RCC_OscInitStruct;) B5 _, A& J' w6 D- @; S' s
- RCC_ClkInitTypeDef RCC_ClkInitStruct;
$ o, `% ^% }' E/ U' J! m$ x& B' X) y
q# D! w( W3 |# h6 d6 s% N! {- /**Initializes the CPU, AHB and APB busses clocks ( e: [+ q% J( c6 ~1 @9 k3 P/ I
- */
# T8 ^5 Y6 O9 H3 s7 W; q0 ` - /*
* f9 ~' [/ n5 H- U' S; U - 其中,OscillatorType这里自动生成的代码有问题# I* K$ a$ J- P1 r; x' _
- */
|+ F' g: k* B- r - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE;
/ ]! [0 i# x) O+ b5 a - RCC_OscInitStruct.HSEState = RCC_HSE_ON;0 P: N8 k" s/ }7 ] Z
- RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;4 X& x6 f v# r5 w- V
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;* c* U- O7 Q, v) g$ a
- RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;* R; @+ x( G( R7 D4 ~8 B
- RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
2 e2 i3 b+ Z/ A v- Y" y - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
( E% q6 G+ g2 r" T- v - {, e7 i! e8 ~ j0 f) E
- Error_Handler();! e' ?$ Y& l- j9 J0 U, z
- }: V/ ]( I' Y+ q7 a- g7 ?
- 3 C8 \2 C! A( r% l
- /**Initializes the CPU, AHB and APB busses clocks ! j( I! L$ F6 x5 c% j W
- */" V; \' R. S4 ?# }$ K! g0 X# W N
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
+ x& Y, t5 u# N$ V) [; X - |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;. {2 G% \. L6 D* H8 N* ~3 n) O
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
|9 O9 P' N5 U* O - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
; L2 a1 k0 d% \ - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;% ^. w0 A4 _* e; o
- RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
3 K5 |8 e; ~8 V4 T8 R
0 W" b9 }% S3 [, V% y2 B; Q- if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
5 t* `; a" U$ e! P! @ - {$ q3 F- e& @7 ~. T# _
- Error_Handler();! k- X: J1 R' w! N
- } [* w' A2 E/ }. K, \
- 4 C1 [! d J4 [
- /**Configure the Systick interrupt time
& r% `! q3 \& A2 N5 R7 R - */
' n6 G. o2 X! Y8 m+ D# o% z - HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
7 u5 z3 G; p, [6 F - 1 Q3 u( x) \ g8 a5 _! x/ c# j
- /**Configure the Systick
4 M2 R. g: p7 g: P - */
& B# y' Q. O v# z4 s - HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);7 x' f& R: Z. E7 N( y
. D: r/ e8 h) h6 d) ?! v- /* SysTick_IRQn interrupt configuration */3 T* m) N" D. N" j& g: \2 ]! v% Y
- HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);4 i4 Z% A, v4 {0 K
- }
复制代码 5 L6 p6 X6 F7 e4 A& J8 L2 @' G
: h; a* P' g% X问题在哪儿呢?LED挂在PC0上,时钟路线图如下。
3 r# ?. E1 _3 @8 C2 b% c# n
* R9 f3 @. \8 c, ]" ?
第14行代码写成下面这样验证OK。8 C7 {/ a9 y" R+ s: j
! `# M5 l, p+ ?0 M5 w/ [/ c; n- <font size="3">RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;</font>
复制代码
) ^7 G* @6 N: I" f8 i& ^" s5 U7 M( q; I. L! M4 s
实际上在实验中没有用到HSI,但是在自动生成的代码中把它加上了,导致单片机无法正常工作。看来排查Bug时,时钟这一块需要重点关注一下。5 |" b! |$ `$ S3 y0 r
# c8 E' \; u+ R+ ?. m7 t! K
, z. b% N' b8 i0 C% z i. D" j
1 S, E- n. E6 X0 j- c% K$ B/ { U8 z% x
|