STM32H7时钟配置问题
+ z2 m$ B/ t# Q& T设备:stm32h735VGxxx
, ^' B% K9 d2 c N- f* a) D, m
$ }& B. g5 N. W: V4 }8 K; ]问题:STM32时钟配置不正确,一直没法启动。# k# R; Q; Q+ `) j7 n
( g. _7 o" M) B6 @/ s
解决:原因是配置时钟的一些参数超出的范围,所以配置导致不成功。4 b5 Z) }1 |3 [
3 l* `' w' s$ H7 R
下面是H735的时钟的一些解释,其中 Fvco 是有范围的,这边从文档上面查到,FVCO的最大配置值为836M,所以配置的时候一定要注意。, U; B2 S& G3 M
并且plln, pllm,pllp,pllq,这些都是有范围限制的,如果配置错误,那么芯片将不会正常运行7 _4 [6 c4 p7 b, ?3 p9 r
* B8 Z" c! I' a q$ l
- /*
- T E$ \1 w2 _4 S+ ^ - * 时钟设置函数
! z, I- Y( ]% b8 B - * Fvco: VCO 频率% d( Z( k# s( M v; N) [) M
- * Fsys: 系统时钟频率,也是 PLL1 的 p 分频输出时钟频率
# A4 W' ~3 Q3 N( m9 S( @ - * Fq: PLL1 的 q 分频输出时钟频率3 ~1 d* P2 e! J8 _- s P8 R
- * Fs: PLL 输入时钟频率,可以是 HSI,CSI,HSE 等.
8 Q% l3 n$ j f/ F6 _ - * Fvco = Fs * (plln/pllm) = (Fs/DIVM)*DIVN;) B/ q( T6 O" F/ S X* K$ y
- * Fsys = Fvco/pllp = Fs * (plln/(pllm * pllp));
3 N" {/ ?3 @3 e, P - * Fq = Fvco/pllq = Fs * (plln/(pllm * pllq));. d3 h9 B8 k, O% E9 [$ [
- * $ K5 w2 o- K; m; Z% B2 P1 V
- * $ a" C9 n3 a" K' j; j5 M
- * plln: PLL1 倍频系数(PLL 倍频),取值范围:4~512.
$ ]6 S1 i) G- I: {, `% _! S - * pllm: PLL1 预分频系数(进 PLL 之前的分频),取值范围:2~56.! [: e* x9 E/ I, j
- * pllp: PLL1 的 p 分频系数(PLL 之后的分频),分频后作为系统时钟,取值范围:2~128+ n" I+ g7 g/ n
- * pllq: PLL1 的 q 分频系数(PLL 之后的分频),取值范围:1~128.: C9 t" o) J( Q1 [, R- B. _
- * CPU 频率(rcc_c_ck) = sys_d1cpre_ck = 400Mhz 9 n) @) Z. M. N& |& i; h& n* d4 p
- * rcc_aclk = rcc_hclk3 = 200Mhz
8 g& x- J- k1 d" q. J [" x - * AHB1/2/3/4(rcc_hclk1/2/3/4) = 200Mhz
$ W& P3 h t$ m9 a# u- k- J - * APB1/2/3/4(rcc_pclk1/2/3/4) = 100Mhz 9 H7 `! z& {$ K" @9 l ]
- * FMC 时钟频率 =pll2_r_ck=((25/25) * 512/2) = 256Mhz
" G* p3 k$ q+ w( D1 o$ Z - * % A; P( y2 |; E2 O8 r
- * Example:
0 b4 G) S0 N( V7 x; t - * 外部晶振为 25M 的时候,推荐值:plln = 160, pllm = 5, pllp = 2, pllq = 4.
, g- l2 O9 U. b2 P. c - * 得到:Fvco = 25 * (160/5) = 800Mhz" [- B& _( R" Q( `) h
- * Fsys = 800/2 = 400Mhz
1 m% p d# }. M P \: h0 x, ] - * Fq = 800/4 = 200Mhz! P, [9 g6 y4 J' L! |8 R( B$ |
- */
0 V: w- O" C1 W& }) Y; }" g
3 E* ?! I2 l2 [! O7 n& I- #define PLL_N 160
8 A( m/ u1 I- \ - #define PLL_M 5
" E( S. G) I ?7 N - #define PLL_P 2% Q7 {8 X$ b: b: W3 O. P
- #define PLL_Q 4
# Q, k5 Q7 C% @, h
) m d2 I( n( `- // 时钟设置函数6 H* B% G; l# a- O9 b% H% l
- static void SystemClock_Config(void)
8 O' {7 q/ G* a7 m3 h - {* ^3 K" P0 o$ `
- RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};3 |( `* X- ~5 C2 W& {
- RCC_OscInitTypeDef RCC_OscInitStruct = {0};( R2 {: J) N0 Q% Z- k
- HAL_StatusTypeDef ret = HAL_OK;
" S* Z6 V* a8 t2 m4 `+ R" v
( `5 K8 b3 w! `' y) A- /*!< Supply configuration update enable */0 C' Q4 J7 H* y5 ?3 j4 Q
- HAL_PWREx_ConfigSupply(PWR_DIRECT_SMPS_SUPPLY);
$ Z; j9 o( v3 P6 x9 K
3 P1 q6 r4 ^+ Y6 m8 S# H: J6 S- /* The voltage scaling allows optimizing the power consumption when the device is
( j) p. S. {( }. [- v- d% e - clocked below the maximum system frequency, to update the voltage scaling value' C7 ?$ F# F; i
- regarding system frequency refer to product datasheet. */4 F" z: A9 s F% E' W% d
- __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);
' P& @, w( d/ x6 G H& G' Q
* u7 L& b; y+ g$ T- Y$ P: i$ f- while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}6 h9 ] z/ o! l+ R
2 Y4 m7 K3 @3 k- /* Enable HSE Oscillator and activate PLL with HSE as source */
6 t, y2 Q, o. |; s - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;, }- {% q$ ^5 l6 T2 D
- RCC_OscInitStruct.HSEState = RCC_HSE_ON;% G$ M% b6 r+ U5 Q1 ]" q
- RCC_OscInitStruct.HSIState = RCC_HSI_OFF;. U2 a. ~- H( t8 {2 A. @8 j
- RCC_OscInitStruct.CSIState = RCC_CSI_OFF;# i& `3 h {# g; b
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
9 G f' i) _5 [- V - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; g# D- A0 F7 y! u
$ x8 r" E8 z- }- RCC_OscInitStruct.PLL.PLLM = PLL_M;( p' b6 f9 M9 Z( b
- RCC_OscInitStruct.PLL.PLLN = PLL_N;
8 m5 q3 D8 r4 S6 K0 P4 B - RCC_OscInitStruct.PLL.PLLFRACN = 0;
$ r: ^+ R' Y. ^/ c0 R0 J9 T - RCC_OscInitStruct.PLL.PLLP = PLL_P;
u' Y K5 r h! T - RCC_OscInitStruct.PLL.PLLR = 2;
& ?$ P9 \% J% S- V( I - RCC_OscInitStruct.PLL.PLLQ = PLL_Q;
$ W Q) T% f" j- p- q - + f' t' y% C6 T# o! S+ E& X# d) \& J
- RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;) V( B$ Z; V, D9 y+ ], N% Z
- RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;) B4 |) R* g1 W" j
- ret = HAL_RCC_OscConfig(&RCC_OscInitStruct);
* I7 J& U" w0 y- D- [# W y5 {0 q7 m5 t - if(ret != HAL_OK)
' |; Q+ b0 }# l - {0 w! x2 @ x% O; p# Y0 `6 n, l
- while(1) {};! d8 X2 m) n# j
- }; a. J: p6 L) L7 O
$ i. t3 U! q( g2 t* S- /* Select PLL as system clock source and configure bus clocks dividers */( {7 [6 }7 l5 z ^, Y5 \. \
- RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_D1PCLK1 | RCC_CLOCKTYPE_PCLK1 | \' Q# ^! U. x& v
- RCC_CLOCKTYPE_PCLK2 | RCC_CLOCKTYPE_D3PCLK1);0 T& ?$ ?2 a, Q. @/ |$ q
- 8 R `2 D5 _: E/ f/ V9 s
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;. j4 ]0 u% O; n& m5 f
- RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;, G) Y( j0 m# P3 y+ Y4 \
- RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;# J3 W& P/ S* r
- RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
" G! g+ g9 ?' P; Q - RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;! H% P3 p: M' t' d6 H# m N
- RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;4 u9 ]. \) l: Y; V' Z
- RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;7 x- h, _2 L# e1 i' B; Q& S" h
- ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3);2 v& W' S$ Z/ z. G0 U d: s' T
- if(ret != HAL_OK)1 e, E9 o8 ~7 z9 o" _4 d
- {2 N" w( s) U4 N2 } X
- while(1) {};# T) z8 U$ \- {% g/ m* S8 {! Q
- }
; y3 m# Q+ g- A1 h8 w! g - $ V) X/ R+ i2 D7 G
- }
& A" E! W( W& J) C) |
复制代码
2 ?2 C$ E$ c3 T, I
& n8 i0 b8 @7 u7 C, f9 U* o( I- M/ l |