简单写一下失败经历。6 p ~: y3 F5 G7 F
用的CubeMX版本是4.20.0如下图,用的Keil5编译代码,编译结果0 Error(s),0 Warning(s)。
& y- F/ X, h9 z! x4 I8 s1 i
; u/ D4 @1 E F- ~ Hex文件也可以正常下载到单片机,但是LED不亮。2 l+ y4 s( A% ?, [; ~% B
+ X% R, K5 K; H' h5 Q' K( P
F: Y p0 l& { 在CubeMX中配置了时钟,如下图。
g% _. A2 E, D+ m* g3 Y# P
, b5 e0 j/ X8 z5 C3 L
CubeMX生成的main.c中Clock代码是这样的:
7 U! t/ G9 K; `) [% r- ) v% S; z& T! J) ~
- /** System Clock Configuration' U* k4 { E, k' A" _
- */, [& f5 E0 {7 {# Y% N
- void SystemClock_Config(void)! x7 f7 X$ Y9 `% O
- {3 k s' u" f, ?+ m: ?# ^0 B: u9 t p
# k' a0 R5 D' \1 W9 u" w- RCC_OscInitTypeDef RCC_OscInitStruct;# @9 h9 ^/ W& S: h4 j8 ^9 J0 s
- RCC_ClkInitTypeDef RCC_ClkInitStruct;/ P+ Y" u7 i6 w
- ' y7 d" P) \; T/ x
- /**Initializes the CPU, AHB and APB busses clocks
* {+ p. T4 d& |0 @ - */
: [1 T# G/ u# O! y - /*3 N6 u! ]& ~4 U/ }6 U1 O" D' O8 f% l
- 其中,OscillatorType这里自动生成的代码有问题
/ Q0 o& E: C z c1 a4 K ]2 o - */
& w5 i: S* e6 V0 V$ ~; N - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE;
6 b) h4 c2 R; H - RCC_OscInitStruct.HSEState = RCC_HSE_ON;1 n0 t7 y) _, s' a4 b! i% p8 @
- RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;0 k- X1 A. F* k5 |
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
5 Z2 W! j0 @ S0 V( G - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;# ]" E/ ~2 X: o$ x% w
- RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;) [0 U* N$ L! h* j$ U$ O* @
- if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)4 C% ^* n! {4 V0 u$ l/ X* ^
- {
: X9 {2 e4 S0 M* F - Error_Handler();6 o) e1 o+ l# F2 y
- }
# d+ e2 F T8 Q6 e - * s9 ^) f8 o8 }+ g
- /**Initializes the CPU, AHB and APB busses clocks : b0 m! ?+ e/ o z5 t
- */. M: O- o6 r( r3 w1 u
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
4 y; A+ t3 l# E, l+ J, s/ ? - |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;% M/ f7 a) U6 Q% H
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;) a( D1 [# d: i! j7 I$ f
- RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
; p' O2 n: s& ?* V0 H" v - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;6 A/ r6 W; N+ M, d, C4 D4 P
- RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;1 R1 y% y# c7 x I, ?+ v6 V$ s+ |3 v
- ( A% g7 ~$ q* s* T' F* Y7 ^" s
- if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)% A( d% B+ h! z- k
- {
1 H& N7 h0 V' X; A2 ~4 s& y - Error_Handler();5 ?1 ]+ b- E5 M- D( ~
- }, A0 P' `6 _) C3 p! i) O# W
- 6 b2 k1 @: G% c' B: R
- /**Configure the Systick interrupt time ; z% B" U) q9 p& x9 ^' Z8 f( Y `
- */) @6 J( p& H. t8 v
- HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);8 K) i& B0 z4 L- [( d0 n' A
: R1 {+ [" H6 ~) b3 r* E% z- /**Configure the Systick
5 a! B/ a: R0 c2 W0 O - */
# h6 Y( t/ ?; G8 O* U) y - HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
( K+ ]: k5 d$ {: C& Q$ e2 N5 u" K - & y5 n" [% A# L* o& I( }* S! m# i
- /* SysTick_IRQn interrupt configuration */% a8 u8 F3 O+ P$ F
- HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
; U U4 T+ G4 c8 C8 T( { - }
复制代码 4 Z( _, [. s O6 q
# V! B: {2 T1 A% L3 t
问题在哪儿呢?LED挂在PC0上,时钟路线图如下。
+ D5 A. a( E1 s+ M2 a
/ m4 i7 n8 i/ v* a2 T* X. G 第14行代码写成下面这样验证OK。5 b8 T, k: U/ G0 Z" D8 J' g7 F7 i8 n
) Y- U0 x- w: R( y( C- <font size="3">RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;</font>
复制代码
" e% K, O/ I" A% l& j
4 U! ~/ \+ Z$ w4 Q/ Y! s 实际上在实验中没有用到HSI,但是在自动生成的代码中把它加上了,导致单片机无法正常工作。看来排查Bug时,时钟这一块需要重点关注一下。1 ~& _) }3 }0 W1 s$ D" z# S1 M
1 ?2 i' G# A; \3 Q9 e0 B P7 R" K6 L5 e
8 r/ w9 s6 x/ D/ g
2 i! d7 e( R2 q- J7 r |