简单写一下失败经历。3 X4 k7 G; l. _, _
用的CubeMX版本是4.20.0如下图,用的Keil5编译代码,编译结果0 Error(s),0 Warning(s)。
2 S/ M0 M R' f- ^ N, ]1 a
( A/ B2 r0 S: {/ q) ?& B0 M
Hex文件也可以正常下载到单片机,但是LED不亮。) P# F* C& t- u1 [. |
5 Q: T$ j* t! V4 u" K$ e5 |# t
4 F! h$ ]& C* T8 k M. P; |1 U 在CubeMX中配置了时钟,如下图。
3 r/ b5 Y( a5 |- [
1 v+ b' g$ W1 a- n A; H- D CubeMX生成的main.c中Clock代码是这样的:
: P j Q3 @+ {; d- 2 Z- q4 F0 x0 X% Z# O# K; o, e
- /** System Clock Configuration5 G4 I6 m2 n- d& E6 ~
- */
. E x- D- C7 k( D( T& H. Y# Y - void SystemClock_Config(void)6 S3 h7 H* |0 k# m; X: X
- {
" `' }* s: h4 I! {
; D. R/ W9 u% L$ q/ `7 Y. \ _8 u- RCC_OscInitTypeDef RCC_OscInitStruct;* i3 ?) d% {, f; O% [2 H% j' i
- RCC_ClkInitTypeDef RCC_ClkInitStruct;6 @" E- F2 ^8 n7 a5 r& v
- 5 k; ] v6 Q4 p; G6 W& @5 @
- /**Initializes the CPU, AHB and APB busses clocks
1 }0 X4 J# \% h# u( J$ b - */9 @9 H# C8 ^* K
- /*
8 Y) Q+ e) K2 T1 P - 其中,OscillatorType这里自动生成的代码有问题
4 D5 O: m6 R/ y( n5 y7 M - */) v" N7 v1 C2 x/ m$ T: H
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE;
/ g6 ^3 u8 `4 _! g - RCC_OscInitStruct.HSEState = RCC_HSE_ON;7 K, G, j8 e" i- _# u: O
- RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;; r( T9 K3 U7 n# a: z. P: e
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;, S }# q+ y6 R' h( [+ l4 v9 t8 i
- RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;) |! A3 |9 B2 y) n, g
- RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
$ e8 \& ? |. s: Y+ ` - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)4 A# L2 q1 a4 H: v
- {1 r+ |) C4 |, z- T2 w
- Error_Handler();
! H1 i, l7 g0 @1 `7 }* J - }
2 Q0 A* f3 o5 C: s6 q - ! y, M" _ i/ ~
- /**Initializes the CPU, AHB and APB busses clocks
0 B( y! T0 U" A% ^# }6 ? - */
7 n: \3 H9 D# e ^4 Q/ L0 T6 [ - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
9 j: `" @/ B% {( O6 U6 h, K* O2 b - |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;4 x0 r5 ~# I# @& y( P
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;+ e' P: T* _% T8 v4 ~: o/ _
- RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;" l5 o* Z j2 s+ v( W
- RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
9 n6 z4 |2 S9 V/ ^, {6 f* }$ J - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;& s; Z7 h5 b* i; B w: Q
- ) e7 n. S! I8 i p3 ?4 y
- if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
. z( `- a a0 K - {
5 p' e, B, l6 g - Error_Handler();
/ h& j- P7 u/ ^+ u3 ~6 d! O - }" j6 b4 X1 t! e0 T' @& r4 I2 Q
4 n0 b5 {5 }8 G0 ~1 S8 ]7 c* @- /**Configure the Systick interrupt time " U1 D& S& B7 u5 [
- */- N" D- N; g7 Q
- HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);* E( P7 c q: x$ }' z `. j b5 o) g; n2 F6 \
) Q5 O7 E( K( }5 n$ v1 a; }- /**Configure the Systick
- s1 g3 K+ B- i% K - */
6 v y8 g u7 x# A% ]4 n' {9 Q - HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);0 ^( m6 F: H6 u1 {" e
2 K5 {7 |' r& {' l Z- /* SysTick_IRQn interrupt configuration */
) _- Q5 {6 Y) m& |4 g' P5 _$ z - HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);3 `) I1 q- r1 `9 f4 q# Y4 ?4 a
- }
复制代码 D+ L0 { ~. h2 F- `
5 B- E* S8 T3 @# c( c
问题在哪儿呢?LED挂在PC0上,时钟路线图如下。
/ D1 [+ T3 ]1 v5 @* }+ h) y
* T- M! f6 g) Y" u 第14行代码写成下面这样验证OK。# T }, V( ^, v0 [% p
* f5 s+ X) g/ x$ l- <font size="3">RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;</font>
复制代码
8 x* B$ @( S/ t( H% G4 q- o0 N: P& P9 z( e4 d
实际上在实验中没有用到HSI,但是在自动生成的代码中把它加上了,导致单片机无法正常工作。看来排查Bug时,时钟这一块需要重点关注一下。
+ r+ b! T4 v" x* e# }( d( n5 l% C
4 Y0 R/ U/ x, W" J0 k
" Z2 B. V# ]5 n& p( w" D
( c( a$ @/ L1 S$ c& ]8 q
/ i( A1 z$ F% B |