STM32H7时钟配置问题
* C% o+ f+ x9 f* s; d设备:stm32h735VGxxx8 Q# R! w8 G9 a2 `4 C/ r: g0 P
. Z) g4 E, i5 a+ }
问题:STM32时钟配置不正确,一直没法启动。
, c, c/ C# |3 h( e, [# P4 R7 b. P5 |, i' Q; J$ k
解决:原因是配置时钟的一些参数超出的范围,所以配置导致不成功。; X6 `; n4 ~ r
. E4 _9 z& u% Y8 b6 A下面是H735的时钟的一些解释,其中 Fvco 是有范围的,这边从文档上面查到,FVCO的最大配置值为836M,所以配置的时候一定要注意。
- V" i" O% \3 K' G0 T并且plln, pllm,pllp,pllq,这些都是有范围限制的,如果配置错误,那么芯片将不会正常运行
' o+ V! l+ B+ \6 P
$ y2 C7 b' S; ]+ o- /*
E6 |" ~1 a. \/ J1 B- ? - * 时钟设置函数
! r+ g2 W% g3 e a - * Fvco: VCO 频率2 e& W t% }9 k6 L. S9 {' s
- * Fsys: 系统时钟频率,也是 PLL1 的 p 分频输出时钟频率
_! _# v" e4 I% |6 g - * Fq: PLL1 的 q 分频输出时钟频率$ h6 e! ~- R9 ?3 G
- * Fs: PLL 输入时钟频率,可以是 HSI,CSI,HSE 等. 6 ^ Y6 \/ U- s/ g! @
- * Fvco = Fs * (plln/pllm) = (Fs/DIVM)*DIVN;2 o# {% ~* i5 i) a# u
- * Fsys = Fvco/pllp = Fs * (plln/(pllm * pllp));7 B1 l( S4 w9 A% \- c
- * Fq = Fvco/pllq = Fs * (plln/(pllm * pllq));
5 J. \5 @0 V2 F' `" L, j: q4 W - * 8 ~# y. W3 S; ?
- * - d8 H4 ]/ T C- R. f& Q1 k
- * plln: PLL1 倍频系数(PLL 倍频),取值范围:4~512.
7 h' h6 ?' O2 T1 L- H J - * pllm: PLL1 预分频系数(进 PLL 之前的分频),取值范围:2~56.
9 z. @0 o& A; I# m8 Y# l: X - * pllp: PLL1 的 p 分频系数(PLL 之后的分频),分频后作为系统时钟,取值范围:2~1285 b: o% e8 i# {5 | a
- * pllq: PLL1 的 q 分频系数(PLL 之后的分频),取值范围:1~128.( C' N7 K6 P$ M3 G( U
- * CPU 频率(rcc_c_ck) = sys_d1cpre_ck = 400Mhz ( R: G; T2 Q! K+ S \
- * rcc_aclk = rcc_hclk3 = 200Mhz3 C, t- D' K" p7 R% |
- * AHB1/2/3/4(rcc_hclk1/2/3/4) = 200Mhz 3 P3 P5 [+ t' ]
- * APB1/2/3/4(rcc_pclk1/2/3/4) = 100Mhz
0 A( G1 H0 ~4 s! U) Y2 `6 i - * FMC 时钟频率 =pll2_r_ck=((25/25) * 512/2) = 256Mhz
/ b4 ^2 y/ g9 ]; N - * 9 q+ e: T2 ?0 R1 M" @5 G
- * Example:9 i4 M+ \# D5 r5 h
- * 外部晶振为 25M 的时候,推荐值:plln = 160, pllm = 5, pllp = 2, pllq = 4.
! A9 m! F0 h2 u7 ~ - * 得到:Fvco = 25 * (160/5) = 800Mhz
+ g, [0 |" F8 p9 ~ - * Fsys = 800/2 = 400Mhz
$ _% e' o1 ?1 w: R6 P) C2 Q - * Fq = 800/4 = 200Mhz
+ ` i) F {8 z5 t - */% ~8 h( V3 i1 X: P& M
3 [& e6 w3 _: G3 W- #define PLL_N 160
1 N+ K( h$ y I - #define PLL_M 5
5 `1 W! C) q, R& Z! G l- a - #define PLL_P 2
$ ~5 I, ~3 c+ f- q; r - #define PLL_Q 4+ }* R+ A" z" P$ [1 V0 s4 Y
9 H6 Y( J, S' @9 [+ B1 [- // 时钟设置函数
3 W4 H" x4 `2 N* e# H - static void SystemClock_Config(void)
2 g! {( w2 X7 O' d( v1 e) i - {7 ~1 l' Q/ F, t
- RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
6 }2 p/ I w7 f - RCC_OscInitTypeDef RCC_OscInitStruct = {0}; T" @9 U& E! {* F& {" }
- HAL_StatusTypeDef ret = HAL_OK;
2 K; l: }2 U4 z3 g - 8 s* I! y8 V+ `' Z7 R
- /*!< Supply configuration update enable */: i' H* s% M0 x& b/ G: x
- HAL_PWREx_ConfigSupply(PWR_DIRECT_SMPS_SUPPLY);
9 ?. u+ V% F) d) s - 3 [: g8 A$ T( P# j1 h
- /* The voltage scaling allows optimizing the power consumption when the device is& b9 R, M3 r- s2 z
- clocked below the maximum system frequency, to update the voltage scaling value
) p7 h L" L5 X, `9 U- ]( A3 M - regarding system frequency refer to product datasheet. */
- w4 }9 Y6 K9 Z* B7 j4 } - __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);
. i& S' x" o: _1 r - 8 r5 U* _: ?4 s# }' e& A* d N4 j
- while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
4 G( o/ C/ }+ E - ( f4 V9 l( u' I" b
- /* Enable HSE Oscillator and activate PLL with HSE as source */4 [5 H3 y t2 u% x2 M7 H( g9 X
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;1 `8 E. k H2 X1 { p
- RCC_OscInitStruct.HSEState = RCC_HSE_ON;6 H& v5 F& a) x* O1 B: J5 D0 v1 q1 h
- RCC_OscInitStruct.HSIState = RCC_HSI_OFF;
+ p. ?3 N$ ^* B5 k - RCC_OscInitStruct.CSIState = RCC_CSI_OFF;* ?) u; S4 Q& j( V3 a* W
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;$ m; `9 A' S. S, T+ E4 W! U
- RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;! T. R0 D, O5 j' f
- 9 M* L; s& a+ W
- RCC_OscInitStruct.PLL.PLLM = PLL_M;
6 I' q9 k |( l/ u4 d - RCC_OscInitStruct.PLL.PLLN = PLL_N;
* e3 C g* A# a$ m2 l - RCC_OscInitStruct.PLL.PLLFRACN = 0;
& ~- d+ e# _& s9 p w5 c6 D) y/ G - RCC_OscInitStruct.PLL.PLLP = PLL_P;
2 q( I; C4 }% ?$ B( N - RCC_OscInitStruct.PLL.PLLR = 2;
) x. }% h& b9 [: \; Z3 ^9 c6 d - RCC_OscInitStruct.PLL.PLLQ = PLL_Q;6 |( y( c, \! R; N( j
9 }6 K# F: A: v& Q8 ~- RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;8 a' M* @2 u: _9 z) Q4 D7 U5 [6 R
- RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;2 g" t- g5 P! o7 n
- ret = HAL_RCC_OscConfig(&RCC_OscInitStruct);: J2 [: J* L7 D3 s6 k2 q+ \/ D
- if(ret != HAL_OK)4 X% P* @- y# R. H+ O& _
- {/ M: o% S# N! g
- while(1) {};
: @3 r- Z+ q; b* u9 t* D - }
7 B0 G( L) w8 q8 _* Q - : f; u/ ?: O; R2 F4 r# B3 F' C# s
- /* Select PLL as system clock source and configure bus clocks dividers */
4 ~- q8 W8 J6 z - RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_D1PCLK1 | RCC_CLOCKTYPE_PCLK1 | \
2 F5 Z( D, v+ A7 t6 Q - RCC_CLOCKTYPE_PCLK2 | RCC_CLOCKTYPE_D3PCLK1);
' N) L2 i+ W5 }9 U/ N1 C. X
( _( n. @: m# _- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
, t$ Q6 F. t. h+ C - RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;! F2 i2 G' h* M2 G6 }0 R- e
- RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
/ G$ m) {( }1 P! J4 d3 b* A, _* _ - RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;: @8 e2 w% V. O. O3 C
- RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;& J' b2 V0 R7 [: N
- RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
* W! }3 p. g g+ O; g: C ^ - RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
' r/ I1 \- m: l! y3 S& P, ]6 t - ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3);% e& L: j, ~1 d3 E) R! ^* c& Y+ `8 R
- if(ret != HAL_OK)5 M( Q# `; m5 C0 {5 k/ ?
- {3 u9 q. _9 X- I, u) A
- while(1) {};
- {) Z9 n$ D5 |( Q! v; W1 q - }
6 b( l+ J4 d# {& |) n! ? - ( |2 X" M5 ]% |! _6 r: p
- }
. @- i1 ?7 T" y9 ]3 n
复制代码 9 O4 Z; `' d+ i- U, R, G, _
0 u. D+ t. W4 f
|