STM32H7时钟配置问题5 L5 q8 B2 h$ S$ r7 }, c
设备:stm32h735VGxxx
% D8 L- f3 Z" A7 t5 z; x2 k
( W" D1 m6 [% w8 c& }问题:STM32时钟配置不正确,一直没法启动。6 K( y; A- l! p: ]8 Q' X
+ n* p8 E3 I0 B+ c7 K
解决:原因是配置时钟的一些参数超出的范围,所以配置导致不成功。
4 L1 \4 \5 W* @. \$ K& I- U* }' T2 {# Z3 L
下面是H735的时钟的一些解释,其中 Fvco 是有范围的,这边从文档上面查到,FVCO的最大配置值为836M,所以配置的时候一定要注意。
# \7 _3 F; n2 n1 b并且plln, pllm,pllp,pllq,这些都是有范围限制的,如果配置错误,那么芯片将不会正常运行5 H4 J* I+ B1 u, w. c+ y
9 i. o) ?4 w9 N/ }% r4 z- /*+ p& ^- s" \$ j8 v3 Y
- * 时钟设置函数6 n' g0 u- U& [! o4 y
- * Fvco: VCO 频率
3 X- ^) @/ S0 h7 `& g% L+ X - * Fsys: 系统时钟频率,也是 PLL1 的 p 分频输出时钟频率: N+ {/ l" t5 W- w
- * Fq: PLL1 的 q 分频输出时钟频率
& L' M! h3 L% b9 o% v. S5 G, d - * Fs: PLL 输入时钟频率,可以是 HSI,CSI,HSE 等.
, @! M# d& |" w/ d8 F* b, |, K - * Fvco = Fs * (plln/pllm) = (Fs/DIVM)*DIVN;
; o2 w+ O$ V2 Y! b7 d7 A9 k - * Fsys = Fvco/pllp = Fs * (plln/(pllm * pllp));
6 A& ^# C9 ]1 M0 L E+ P7 i% Q - * Fq = Fvco/pllq = Fs * (plln/(pllm * pllq));
5 Z' q% q, P% D. F$ s# f/ z/ t O - * / w1 f* c* f: q3 O2 i2 L
- * + S7 _( V) X& h, E% ?( n% c
- * plln: PLL1 倍频系数(PLL 倍频),取值范围:4~512.
: a" ~6 D( \9 }9 n8 h - * pllm: PLL1 预分频系数(进 PLL 之前的分频),取值范围:2~56. ?0 B2 `* \6 v; N3 a% f
- * pllp: PLL1 的 p 分频系数(PLL 之后的分频),分频后作为系统时钟,取值范围:2~128
$ y" e! U0 s0 v& e - * pllq: PLL1 的 q 分频系数(PLL 之后的分频),取值范围:1~128.
! t9 \5 j% L4 H& x7 |" l - * CPU 频率(rcc_c_ck) = sys_d1cpre_ck = 400Mhz & V8 F: F; T9 Z: @5 g
- * rcc_aclk = rcc_hclk3 = 200Mhz( i4 ]8 I4 k" E* D1 x2 G! ^
- * AHB1/2/3/4(rcc_hclk1/2/3/4) = 200Mhz
8 }" K- t% a3 z! Z: x, x! U$ V% g% ` - * APB1/2/3/4(rcc_pclk1/2/3/4) = 100Mhz % Q3 Y m, T9 E/ K6 s
- * FMC 时钟频率 =pll2_r_ck=((25/25) * 512/2) = 256Mhz$ G" _6 w/ d; O) x. A: h
- * " e k; B! I+ Y8 @ H9 T, w
- * Example:
: D' h0 y$ c! n" a% A3 }* l) d+ j; x - * 外部晶振为 25M 的时候,推荐值:plln = 160, pllm = 5, pllp = 2, pllq = 4.
$ m! T- G8 m! H7 L - * 得到:Fvco = 25 * (160/5) = 800Mhz
3 _1 U. x! W3 T: K$ c; p - * Fsys = 800/2 = 400Mhz9 B& n" O% m1 `1 r" P; C6 q
- * Fq = 800/4 = 200Mhz# _" R3 L v) z, y& R- x4 g: u) z1 `' _
- */
) Q p+ a' C1 X _5 t
( y- {4 E; U9 l2 T, w! C- {: I- #define PLL_N 160
! l/ l3 Y- W( W - #define PLL_M 54 S" I/ b4 k5 q! ]. e
- #define PLL_P 2
( Y2 `! i, F/ V! } - #define PLL_Q 47 ~+ L) d1 q |, Y
- ! d1 D( N) ?+ C
- // 时钟设置函数
$ K7 e. ^4 D' R; m6 `; J. q - static void SystemClock_Config(void)# |* S6 z; \6 }# Y ?
- {$ ^/ ^' C! z, w+ w
- RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};. D7 d, P! f# }. g# ^7 [% \8 Y/ U
- RCC_OscInitTypeDef RCC_OscInitStruct = {0};4 @; C" w9 k' r
- HAL_StatusTypeDef ret = HAL_OK;
2 c" k, e$ ~+ P& p" g8 g' x* x - 3 D: q3 X8 \ P3 C
- /*!< Supply configuration update enable */3 d3 }4 j7 L5 w1 R6 a* U
- HAL_PWREx_ConfigSupply(PWR_DIRECT_SMPS_SUPPLY);4 f( m) M7 m# m- W6 \: }7 r6 f( z
8 S! f# [* a$ Q! P1 R" E. K7 z- y- /* The voltage scaling allows optimizing the power consumption when the device is
& X4 o" W2 _8 i% Q) a' B0 w - clocked below the maximum system frequency, to update the voltage scaling value
5 l. K F; t; C2 y4 c - regarding system frequency refer to product datasheet. */8 \ |$ K% G9 `/ `$ j) N
- __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);# l* Z; f3 ~6 N, i5 I' p1 u( n
$ L" ]( W1 M" t( _/ _) U' o" D- while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
' |1 g: J2 o6 ?. ]5 c0 T
) R0 t4 g1 E! T2 n7 G" g- /* Enable HSE Oscillator and activate PLL with HSE as source */
7 _. q& v& X- N9 Y - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;$ x- g; u8 Y9 m$ b
- RCC_OscInitStruct.HSEState = RCC_HSE_ON;
, n- O9 N& f# M - RCC_OscInitStruct.HSIState = RCC_HSI_OFF;6 E1 ^( M5 M% K0 m/ ~ ?
- RCC_OscInitStruct.CSIState = RCC_CSI_OFF;; P. d6 j# |, o/ q" x
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
0 f. d7 I$ v E9 L. V6 R" O5 B - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;8 W7 d2 O8 S5 R# p, H1 [& T+ l0 o
- " D( o, q" {7 I/ S( o I" P6 s
- RCC_OscInitStruct.PLL.PLLM = PLL_M;) G# P! ~6 C6 f
- RCC_OscInitStruct.PLL.PLLN = PLL_N;1 ]* k, C# A0 N
- RCC_OscInitStruct.PLL.PLLFRACN = 0;
1 i8 M+ C/ d0 J ~ - RCC_OscInitStruct.PLL.PLLP = PLL_P;
! y- K: }5 x4 p/ p - RCC_OscInitStruct.PLL.PLLR = 2;9 C/ i1 a! N, p, c. G+ C
- RCC_OscInitStruct.PLL.PLLQ = PLL_Q;" `, X$ n; b5 l5 y# K) n
- 3 Y2 I: x5 m7 j0 K; L+ j% Z
- RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;# z# B( b; m" E* c3 }' g7 ]
- RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
8 g3 E D) a |4 N- M. O( n1 l - ret = HAL_RCC_OscConfig(&RCC_OscInitStruct);- p2 e- M T) {
- if(ret != HAL_OK)9 m* z/ A( k" C$ @6 o/ v6 w) ?9 C
- {
$ \" |- U" g9 E$ o4 y( Y4 r - while(1) {};
! S5 m0 J) Z) w: U5 D6 _ - }
7 k+ B& c& P; [" ?* V, g" k f6 u - 2 E7 T7 G9 o( M5 s9 v6 r! z- w
- /* Select PLL as system clock source and configure bus clocks dividers */' c2 t1 ?* y. U: f4 X! ^
- RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_D1PCLK1 | RCC_CLOCKTYPE_PCLK1 | \+ ~6 a% A, j: i; d" J2 }& w( M- E
- RCC_CLOCKTYPE_PCLK2 | RCC_CLOCKTYPE_D3PCLK1);$ y& P7 B D) e: q* q9 ]
$ [& k& _7 n5 i; u- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;1 f: h3 @; H. ^' _, ^8 `
- RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
; x& q5 o, h. M* I9 `4 I - RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;9 c/ C. T% |: k
- RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;' a ~0 F# u4 ?2 {! D& K* O3 W" v
- RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;, j9 Q3 M1 v q4 ?/ R8 ^# F; ^( O8 _
- RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;, A# P4 j& G4 ?: s3 W
- RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;3 R$ I% E) V% ~1 ~2 \# n. C8 v
- ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3);3 S0 u+ w1 J! o% I3 v7 {
- if(ret != HAL_OK)8 {. Q' f0 f X8 v# Z( s7 n& A
- {
$ B$ H0 S9 N& D( Z' m - while(1) {};0 ]9 I* p% Z p; n; L9 W" b( D
- }
+ ?. F0 ?3 ^) m: W5 W8 Z+ R- m - , {5 Z* |0 ]! W; C& {) Z0 i- x7 b
- }
$ M4 z6 k) z0 T9 g
复制代码
+ D7 }. G$ u. ~" o, {
6 ~. }0 j! ~3 @( T3 ?! B1 g |