STM32H7时钟配置问题3 E% S. g/ ^; _; ~+ _, t
设备:stm32h735VGxxx
* y2 q4 Z3 x7 b* L: m# v5 S8 o' Y# @9 p4 N5 @; w
问题:STM32时钟配置不正确,一直没法启动。5 |( d6 _: Y5 d! J; S7 b1 l
# L, H' x0 Z. w- |: V' Z: r解决:原因是配置时钟的一些参数超出的范围,所以配置导致不成功。
?$ X3 f' [) t9 {3 K- J# q
- K/ v1 ^& Q( c8 S# u8 {" v下面是H735的时钟的一些解释,其中 Fvco 是有范围的,这边从文档上面查到,FVCO的最大配置值为836M,所以配置的时候一定要注意。) b7 h$ [ i1 o& }! `
并且plln, pllm,pllp,pllq,这些都是有范围限制的,如果配置错误,那么芯片将不会正常运行# x# |" \! y0 ^' P
$ F/ V$ |$ F, @9 w8 i4 l
- /*
. F( v U* ^" \% v9 P - * 时钟设置函数
% _* m1 M# t! |' | - * Fvco: VCO 频率
2 D9 E9 k% R. y& ^ - * Fsys: 系统时钟频率,也是 PLL1 的 p 分频输出时钟频率: V C7 }7 b( V) C
- * Fq: PLL1 的 q 分频输出时钟频率
$ \0 O7 I, w# \8 L - * Fs: PLL 输入时钟频率,可以是 HSI,CSI,HSE 等.
* m8 v) q# J3 Z) U - * Fvco = Fs * (plln/pllm) = (Fs/DIVM)*DIVN;
6 n. g k# ?; X - * Fsys = Fvco/pllp = Fs * (plln/(pllm * pllp));
$ `1 R, s7 p/ w1 Y - * Fq = Fvco/pllq = Fs * (plln/(pllm * pllq));% Z- [5 w+ j- q, B4 l
- *
* O5 L$ e. _$ ?: R% m4 R) Y - *
/ e$ w" A2 o6 U) @ - * plln: PLL1 倍频系数(PLL 倍频),取值范围:4~512.
/ x) r) l3 T1 `; ?6 e - * pllm: PLL1 预分频系数(进 PLL 之前的分频),取值范围:2~56.! x! M5 N+ E6 g$ S' `% y
- * pllp: PLL1 的 p 分频系数(PLL 之后的分频),分频后作为系统时钟,取值范围:2~128
9 d4 ^- E0 m8 G! Z - * pllq: PLL1 的 q 分频系数(PLL 之后的分频),取值范围:1~128.) ^$ U% _6 n* o7 P/ H
- * CPU 频率(rcc_c_ck) = sys_d1cpre_ck = 400Mhz * B4 T; |% J% E" A9 _
- * rcc_aclk = rcc_hclk3 = 200Mhz
$ v$ p' C8 B6 h+ l$ V a: {; b - * AHB1/2/3/4(rcc_hclk1/2/3/4) = 200Mhz + @( M! N" C. D; c- J
- * APB1/2/3/4(rcc_pclk1/2/3/4) = 100Mhz 5 ?+ e; r$ R; P7 Z/ E8 c) |
- * FMC 时钟频率 =pll2_r_ck=((25/25) * 512/2) = 256Mhz
' s) S/ M& p* q - * - R* K( \: X' B( R( }- u9 k0 x
- * Example:
+ H+ y1 ^7 s) T. R } - * 外部晶振为 25M 的时候,推荐值:plln = 160, pllm = 5, pllp = 2, pllq = 4.5 B3 }. ]9 m: I5 r3 c
- * 得到:Fvco = 25 * (160/5) = 800Mhz0 ]6 @; \9 A7 H. S. w6 z2 `' g
- * Fsys = 800/2 = 400Mhz$ {) o) c( b' @( q
- * Fq = 800/4 = 200Mhz
' P4 |- b/ T; N# u) ? - */4 y6 w7 H7 U D+ ]
- 2 w' W; c) N5 _- L3 j9 g8 N
- #define PLL_N 160' ?8 H4 O$ C: Q
- #define PLL_M 5
9 z* b; [( K2 `. o. h0 X - #define PLL_P 22 G" U' [: @" n$ N i$ f
- #define PLL_Q 4: c5 }4 N% S8 n6 L5 u, ^/ {0 j
- - C( H9 k2 _* r8 F4 X8 k5 M' B
- // 时钟设置函数
9 h8 u5 }. A" z. R; K - static void SystemClock_Config(void)
9 o6 I8 @8 U; V8 S' J - {, h9 E) [8 L+ ]$ L- p
- RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
; x1 c! z- j Q - RCC_OscInitTypeDef RCC_OscInitStruct = {0};: G$ d+ o$ @+ Z3 e
- HAL_StatusTypeDef ret = HAL_OK;0 p- d6 h3 S$ o4 I O4 V. n- X
- 4 w- l" C0 x8 a
- /*!< Supply configuration update enable */
2 \2 ?; p5 R7 S7 x - HAL_PWREx_ConfigSupply(PWR_DIRECT_SMPS_SUPPLY);/ p. Y! |# g& m
- 0 k+ _: `4 B+ ]& X; g% X5 Y0 j I
- /* The voltage scaling allows optimizing the power consumption when the device is
, x* ~( v7 F4 ?. z* h, X7 D - clocked below the maximum system frequency, to update the voltage scaling value
1 j# \6 ^; X) j8 B - regarding system frequency refer to product datasheet. */
4 a+ e9 ^3 z4 r6 ^ - __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);. N! S" x6 j5 r N+ R- W
- : L1 |# v6 v9 O; S0 E8 P
- while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}3 t4 |/ N( W1 L( i: t& I. W
- # z3 Y9 e( [. C% q' Q
- /* Enable HSE Oscillator and activate PLL with HSE as source */
, _4 s8 u- {8 [) [; r! |1 D( {- I - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;( o( g8 x+ J5 g
- RCC_OscInitStruct.HSEState = RCC_HSE_ON;- g- X2 M8 l, \3 m* \/ Z( Q
- RCC_OscInitStruct.HSIState = RCC_HSI_OFF;
, O1 [7 ?5 {; A; g - RCC_OscInitStruct.CSIState = RCC_CSI_OFF;
( k0 ~3 a1 l9 U$ }4 ] - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
: X7 r% y9 }$ y _- Q0 ]; J* F0 b; l - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
) w7 x( F5 V8 w! ] - ) s& ]+ ]9 f2 q, e2 c
- RCC_OscInitStruct.PLL.PLLM = PLL_M;8 d8 v2 z& t& }5 {9 o0 P
- RCC_OscInitStruct.PLL.PLLN = PLL_N;
+ E' A+ z) P: g8 V$ g- P - RCC_OscInitStruct.PLL.PLLFRACN = 0;
1 O# }5 s5 G! j" t9 G - RCC_OscInitStruct.PLL.PLLP = PLL_P;0 E4 Q8 l- F F& s4 @" x, R" y
- RCC_OscInitStruct.PLL.PLLR = 2;% `# n z8 e# Z
- RCC_OscInitStruct.PLL.PLLQ = PLL_Q;; f! Q4 @, W- Z+ v2 g
3 v+ X% f) N7 H* n+ C- RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
/ q4 T9 R6 o1 c - RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;- T5 S$ F; s" i" Y
- ret = HAL_RCC_OscConfig(&RCC_OscInitStruct);
4 y$ F/ ^: s' w$ B - if(ret != HAL_OK); r/ O% c( D/ A6 q4 c& c2 G b f
- {# O4 {9 a/ A& y/ ?* N" |* h
- while(1) {};0 R; B9 u0 N0 w& d9 u. m4 u
- }
" n9 ~, c( w! ~5 [ - 3 L% Z; P+ `" r# \
- /* Select PLL as system clock source and configure bus clocks dividers *// e5 H0 X9 z/ y2 x: e' ?
- RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_D1PCLK1 | RCC_CLOCKTYPE_PCLK1 | \
8 q' E* ~: `! N2 D - RCC_CLOCKTYPE_PCLK2 | RCC_CLOCKTYPE_D3PCLK1);
7 d t% h* T- j9 n+ M - / o- Q% J5 F, ?2 V- d$ n! N8 }
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
8 C: s0 P. j8 d; L; z# B - RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
0 ?+ w7 @1 F. ]% X5 d! u' ~8 `8 C - RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;' a' u. }3 T& X U# c
- RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
' p$ r( h; \; m - RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
0 O. `5 c0 v' m - RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
( z+ `, v7 h9 T0 w2 O# w; p: T - RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;8 o! e& j3 D2 G7 \
- ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3);
2 h; y% A5 D6 ~ - if(ret != HAL_OK)0 e2 ?" \6 q% A9 ?% o
- {) F! }# v- V1 r. {1 B# A
- while(1) {};, Z& a- Q0 n J1 [' N) p# l
- }: s! F3 a, N1 ~ c V1 E
- 1 s: c7 {# z& M# k; I( q( P9 k
- }
* k ^% R4 R( I% ]) v7 [
复制代码 ; F. J/ D4 l% o7 N' `3 ~5 Q% Q5 k" O
/ a. u2 L) B$ y; g7 V1 ]5 v7 X |