STM32H7时钟配置问题9 v9 F" g2 u5 {, ]& R; W* z
设备:stm32h735VGxxx
; x4 j3 Z, h% s3 c" t) T/ K' y7 {' A$ m8 h; ?9 J
问题:STM32时钟配置不正确,一直没法启动。 d( y7 y* H$ v
5 @, s! ]0 w p; \$ Z解决:原因是配置时钟的一些参数超出的范围,所以配置导致不成功。: A& |$ ~8 U; |) L0 k9 ]5 K! a
! N- w8 C, g! {' j. k. F( p6 z/ f4 M下面是H735的时钟的一些解释,其中 Fvco 是有范围的,这边从文档上面查到,FVCO的最大配置值为836M,所以配置的时候一定要注意。
8 ?* K& [- ?' ?并且plln, pllm,pllp,pllq,这些都是有范围限制的,如果配置错误,那么芯片将不会正常运行8 e4 C3 g; B. d' P/ ] w% ?+ p
; G; `8 c( @5 C3 j, l9 U' A- /*
4 a8 X$ g8 |# J' y/ h! J - * 时钟设置函数3 G& A% m1 S# r& a8 X( T7 E* `- g
- * Fvco: VCO 频率
6 Y7 ]! ]% W. D0 v4 J. | - * Fsys: 系统时钟频率,也是 PLL1 的 p 分频输出时钟频率
* ~1 e2 m# Z# Y7 @7 \ - * Fq: PLL1 的 q 分频输出时钟频率
c. f# V# M# o" `7 @ j( b4 [+ P - * Fs: PLL 输入时钟频率,可以是 HSI,CSI,HSE 等. 1 Z v! r4 q' o( V; A
- * Fvco = Fs * (plln/pllm) = (Fs/DIVM)*DIVN;0 p$ S+ v8 z& q* |
- * Fsys = Fvco/pllp = Fs * (plln/(pllm * pllp));2 I3 u4 Z" L4 w
- * Fq = Fvco/pllq = Fs * (plln/(pllm * pllq));; t9 z( [: d5 E
- *
1 j, b( W8 v6 ]8 n* M6 {9 I - * ' r# ^# `- y- R1 X: L6 E
- * plln: PLL1 倍频系数(PLL 倍频),取值范围:4~512.
G. y& C! Y# w- N0 y - * pllm: PLL1 预分频系数(进 PLL 之前的分频),取值范围:2~56.6 `2 o* u4 \! L8 l! h
- * pllp: PLL1 的 p 分频系数(PLL 之后的分频),分频后作为系统时钟,取值范围:2~128
l1 }. ~. s8 w: S8 w) r - * pllq: PLL1 的 q 分频系数(PLL 之后的分频),取值范围:1~128.: Z$ x, j( n4 Y& Q2 X: Y% g, b# h
- * CPU 频率(rcc_c_ck) = sys_d1cpre_ck = 400Mhz
) z$ N# i' O, w, i& s - * rcc_aclk = rcc_hclk3 = 200Mhz
2 f4 T- |+ X( d: c - * AHB1/2/3/4(rcc_hclk1/2/3/4) = 200Mhz
8 Z' O! W! z$ S2 B; y" v5 x$ s - * APB1/2/3/4(rcc_pclk1/2/3/4) = 100Mhz / C, O& Z9 @4 D0 t
- * FMC 时钟频率 =pll2_r_ck=((25/25) * 512/2) = 256Mhz
' E" k5 j3 j$ p* r8 @ - *
2 O1 I4 [5 _9 l$ J! x' _( Q. ] - * Example:$ Y6 D$ b6 M9 x* c6 s* N* e+ O6 o
- * 外部晶振为 25M 的时候,推荐值:plln = 160, pllm = 5, pllp = 2, pllq = 4.
, f" }) R5 n! e: l9 d/ f9 c - * 得到:Fvco = 25 * (160/5) = 800Mhz z; \3 |% N& D. S( |! d2 f; H
- * Fsys = 800/2 = 400Mhz
' d' H* H0 t" i4 Q; n - * Fq = 800/4 = 200Mhz5 D4 v! d+ F2 E* n
- */
# F& h: e7 M2 m& P, A - 4 _3 \) ~5 E1 @- n) O' Z6 w) h8 `5 ^
- #define PLL_N 160- H( s! E- @. o$ u8 h7 p
- #define PLL_M 57 F( p( U; \/ N8 m, a8 |: O6 ^
- #define PLL_P 22 ~8 d- d8 e" d& U7 G
- #define PLL_Q 4
/ C6 I5 w# p' Y7 E* Z - 2 t+ p$ E) n5 `5 B n% u
- // 时钟设置函数
R x- ~ V' U8 B, A0 e9 e - static void SystemClock_Config(void). ] L- Y6 |- E( F. D" W; B5 T+ A3 H
- {6 u( U; C& U" a( v r* C; F# S
- RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/ Z4 y3 A! B- f& ?% }! \ - RCC_OscInitTypeDef RCC_OscInitStruct = {0};0 V5 x5 v/ [3 }. w5 q
- HAL_StatusTypeDef ret = HAL_OK;7 W1 Z, }0 x0 M/ |% _ G4 S
' N) Q; j$ ]: D9 I1 k. h- /*!< Supply configuration update enable */6 i; Q( V7 Z; T# z9 J" C
- HAL_PWREx_ConfigSupply(PWR_DIRECT_SMPS_SUPPLY);$ O1 J% {1 ?1 f1 J
8 X: c' ]% c' y( R6 j$ \- /* The voltage scaling allows optimizing the power consumption when the device is
( y5 ]& b7 o, a5 d7 X - clocked below the maximum system frequency, to update the voltage scaling value
: G6 [" z! q0 H; S5 J - regarding system frequency refer to product datasheet. */
, C; S1 B9 m$ O; H2 c - __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);
- P- ^+ F, o+ P - ' u5 c( \, @2 W: ]7 C: g% W2 U S, b
- while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}" ?. g8 J0 e, y$ E- R, h# q+ s% X
- ' Z- Q8 j a; \1 W; N" G6 [
- /* Enable HSE Oscillator and activate PLL with HSE as source */
: [; ?3 C& x4 w4 B4 O3 L& E- e) h7 s - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
7 m; p5 l8 H' M4 r4 A+ j6 c+ y8 e - RCC_OscInitStruct.HSEState = RCC_HSE_ON;
5 y* h2 U+ f* y' G% i - RCC_OscInitStruct.HSIState = RCC_HSI_OFF;1 M& k# a. t6 z1 B' u
- RCC_OscInitStruct.CSIState = RCC_CSI_OFF;
! c$ k: m1 ]1 ?& n/ ^) {% | - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;1 Z! x/ H- m+ C( J! A6 ]
- RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;+ B$ w' ?+ T, ^+ a1 P; l$ ^
' ?; D/ S6 i0 l- RCC_OscInitStruct.PLL.PLLM = PLL_M;' f7 T! Q% G. E8 V# h& l+ g
- RCC_OscInitStruct.PLL.PLLN = PLL_N;/ K9 T- T4 o7 b5 c' X$ v1 ?1 s
- RCC_OscInitStruct.PLL.PLLFRACN = 0;7 T0 V/ a" T5 j* h: N9 @
- RCC_OscInitStruct.PLL.PLLP = PLL_P;+ B) j; X0 N. P5 B
- RCC_OscInitStruct.PLL.PLLR = 2;
; H# K P* |+ I, v4 J; @ - RCC_OscInitStruct.PLL.PLLQ = PLL_Q;
. E5 v d8 J" x+ C
/ l, p* R! h0 N1 k* y. y. r- RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;9 k7 Z; l3 n* L8 _, d2 n$ b
- RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
0 l) b! v- A+ w3 [ - ret = HAL_RCC_OscConfig(&RCC_OscInitStruct);$ M7 i, q0 `) C" N8 P7 B4 I
- if(ret != HAL_OK)/ d4 b! s, q3 J# e
- {
, P- g& z g6 t6 S' T6 F; ? - while(1) {};( a3 O2 D$ k6 V
- }
: }, o$ G) n& \' y& _ - 0 \) E" g, }) H
- /* Select PLL as system clock source and configure bus clocks dividers */ g, |& U8 U6 G' e0 t7 w
- RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_D1PCLK1 | RCC_CLOCKTYPE_PCLK1 | \- I+ ?. {9 P/ [2 j+ {
- RCC_CLOCKTYPE_PCLK2 | RCC_CLOCKTYPE_D3PCLK1);9 S" s+ B9 T. w
- % A1 F8 B( m* @
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;0 i9 e: K/ H8 B* b3 m3 j1 c% a3 G# A
- RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
7 |+ L: z: I2 `. B$ K9 _ - RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;) v. G: S8 a8 w4 H% z: e
- RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
2 D; D, @3 v& R - RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
O0 M! Z- I3 F8 R7 H' N9 t - RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;3 Q1 K( q3 a2 C2 T- I. R8 C- F
- RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;: D5 m/ w7 S$ F4 W8 p2 x) Z
- ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3);
, o& [4 A) }" F+ T6 o - if(ret != HAL_OK)" R$ ^( O4 i V: ~- b0 U
- {- M+ i% Z' ~$ S: o6 b# M8 e9 u
- while(1) {};
! t9 g3 V4 j5 b% E3 d+ h4 t - }% E. Q* O: c, @8 Q
- 5 ~" p/ i; C" m G% F) d2 P
- }$ a3 m5 Q+ u1 d# b7 B3 d8 ^7 M
复制代码
3 S: p$ H) u: G
* L; I. v3 f# |8 Z8 @+ g1 n |