STM32H7时钟配置问题
: T2 S7 i9 k& {设备:stm32h735VGxxx
7 k2 G: C2 E5 B4 @8 V& B$ Q; `6 q4 q+ f% a& l
问题:STM32时钟配置不正确,一直没法启动。$ [" |% U+ D$ K
& @6 g% C( I/ B8 G Y( V$ G解决:原因是配置时钟的一些参数超出的范围,所以配置导致不成功。+ _$ A; z: Q% @' V0 |
& C o- u- n/ A9 I+ f6 r2 U下面是H735的时钟的一些解释,其中 Fvco 是有范围的,这边从文档上面查到,FVCO的最大配置值为836M,所以配置的时候一定要注意。
" g" [# z0 I! E8 g2 t/ h- ]/ w并且plln, pllm,pllp,pllq,这些都是有范围限制的,如果配置错误,那么芯片将不会正常运行
x { @" K6 }5 p- i1 p6 y* Z# I# O- [
- /*
9 k+ i% C. f5 P4 Q - * 时钟设置函数
6 X# [9 y" O+ C$ P8 ]9 l! v( P - * Fvco: VCO 频率& ~- n3 U$ w0 Z: B* x" j& |
- * Fsys: 系统时钟频率,也是 PLL1 的 p 分频输出时钟频率
& ~, @8 N3 ]8 k. y; n - * Fq: PLL1 的 q 分频输出时钟频率
. H! H2 k% a6 _5 L - * Fs: PLL 输入时钟频率,可以是 HSI,CSI,HSE 等.
' _$ F9 }) z, K, g+ D - * Fvco = Fs * (plln/pllm) = (Fs/DIVM)*DIVN;, N1 _ ^- s* ~, D
- * Fsys = Fvco/pllp = Fs * (plln/(pllm * pllp));% J, y+ X* j" { l: \/ n4 o
- * Fq = Fvco/pllq = Fs * (plln/(pllm * pllq));
u5 i7 s' l; ]' _, Z - *
! [$ c8 i- ?( f, Z0 A1 X - *
! L% m1 A1 v' p9 ^- X - * plln: PLL1 倍频系数(PLL 倍频),取值范围:4~512.1 S1 \+ [4 L9 S# [8 g* \8 u2 M
- * pllm: PLL1 预分频系数(进 PLL 之前的分频),取值范围:2~56.$ X+ P1 ~8 ^# ?% {# b; h
- * pllp: PLL1 的 p 分频系数(PLL 之后的分频),分频后作为系统时钟,取值范围:2~128
& D6 B! J% J* z& L8 ~ - * pllq: PLL1 的 q 分频系数(PLL 之后的分频),取值范围:1~128.
# u' a2 b5 b( C! u/ m' f+ M, v - * CPU 频率(rcc_c_ck) = sys_d1cpre_ck = 400Mhz
+ ?0 [( Q5 ?/ F( K- H - * rcc_aclk = rcc_hclk3 = 200Mhz
{# T6 Z- h' _3 `6 \ - * AHB1/2/3/4(rcc_hclk1/2/3/4) = 200Mhz 0 H5 i& |# Z0 @) U) V: o
- * APB1/2/3/4(rcc_pclk1/2/3/4) = 100Mhz 2 Y- m' F% ]" L& |) p' J# V9 D+ }
- * FMC 时钟频率 =pll2_r_ck=((25/25) * 512/2) = 256Mhz' c4 j$ t: _; L$ n6 B( r
- * ! Z; e I! W c3 V
- * Example:
0 m; ~3 ^) Z- Q$ f1 i - * 外部晶振为 25M 的时候,推荐值:plln = 160, pllm = 5, pllp = 2, pllq = 4.* X* w B u4 r z. f& i
- * 得到:Fvco = 25 * (160/5) = 800Mhz& R, ?5 t, E% I
- * Fsys = 800/2 = 400Mhz
7 y+ a M2 ^0 s1 g( ? - * Fq = 800/4 = 200Mhz
" y& D; z7 K8 P% _9 ~; ] - */
7 p0 a( S: `; i - 4 {+ x+ I* i3 v
- #define PLL_N 160
* V/ ~7 i5 S4 \& j; }1 x - #define PLL_M 5
9 h* Y4 K4 b% r) v# U - #define PLL_P 2
3 Z$ i; H! M. }- T7 L1 i7 F, n- X - #define PLL_Q 4
6 K5 F, m4 A- K3 _+ V: Z
8 r/ A' R( d3 {0 Y- // 时钟设置函数
/ D" |$ u" u3 F' f# c - static void SystemClock_Config(void)
; p9 |6 t) A& ~4 y: l5 S# h - { @, p3 H0 i8 J6 Y
- RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
* C0 Z- C2 N7 q, C7 h2 m - RCC_OscInitTypeDef RCC_OscInitStruct = {0};
V2 K* |' }. W( N% b) s9 a8 r - HAL_StatusTypeDef ret = HAL_OK;% y, z2 [- M9 u! S( \) A
- 7 X4 s- ^3 ^/ H& W, s1 o
- /*!< Supply configuration update enable */
9 q9 w- ^6 ?5 T I* `/ L1 u' o - HAL_PWREx_ConfigSupply(PWR_DIRECT_SMPS_SUPPLY);5 Q. h4 s- E3 C# a
- 6 q" R3 E, o. Y8 H6 ^0 i. b+ b
- /* The voltage scaling allows optimizing the power consumption when the device is
1 |$ m2 X" d$ V/ O7 z - clocked below the maximum system frequency, to update the voltage scaling value9 O; i% s/ {3 m- V/ ?+ X. q4 N
- regarding system frequency refer to product datasheet. */
1 i+ o- `( ~! u* f: p0 h8 X - __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);
" c4 v% \: h% I - $ d7 y$ J' i8 v. Q5 |% J4 p
- while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}( |/ [9 H6 Y9 g \! M) G
! }! f& w8 ^4 h2 a. P3 ? q4 w$ J- /* Enable HSE Oscillator and activate PLL with HSE as source */7 v8 n/ E$ x% t, B/ r
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;9 e. z8 v; U. o. w
- RCC_OscInitStruct.HSEState = RCC_HSE_ON;
8 J" _( D! J6 `9 v1 T! E. u0 h' d* I - RCC_OscInitStruct.HSIState = RCC_HSI_OFF;( s! V; ~( j6 B! |3 q- I; W
- RCC_OscInitStruct.CSIState = RCC_CSI_OFF;
+ r( g) k3 S V* y- w - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
% \' M; |/ M; ~# _% s: k+ M/ W - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
1 n) p* @$ Z* i" U
% z I( ], f5 O0 E2 y( |- RCC_OscInitStruct.PLL.PLLM = PLL_M;
8 l1 q5 q7 ^. U u) b8 d - RCC_OscInitStruct.PLL.PLLN = PLL_N;
8 s& L* m' ?! M9 O - RCC_OscInitStruct.PLL.PLLFRACN = 0;9 |7 z9 K, v# V8 n' y% l4 j
- RCC_OscInitStruct.PLL.PLLP = PLL_P;: k) y* M& } n) i+ R0 r9 _
- RCC_OscInitStruct.PLL.PLLR = 2;) m9 @' }2 h* G' Q/ Z
- RCC_OscInitStruct.PLL.PLLQ = PLL_Q;
, K# E+ |. ~; g9 A1 ]4 |# x# q I - 5 T3 F& }5 e4 e" r
- RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
6 G7 \, q* U1 C# D$ b& e; } - RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
5 H( D( ?$ z2 p2 Y1 H, ~2 A. p- p - ret = HAL_RCC_OscConfig(&RCC_OscInitStruct);- H7 V3 P2 X$ y2 t: w ^6 L. z
- if(ret != HAL_OK)
! o# {( e) G: b) G8 f6 k - {
# `/ e7 ~. O( e+ ` - while(1) {};
) E) {0 L: \ g, l m7 _ - }! l8 P% ?6 I2 y+ V) u
- 5 O7 o7 H7 U3 J2 \8 {/ a
- /* Select PLL as system clock source and configure bus clocks dividers */4 @3 r' q; M5 {
- RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_D1PCLK1 | RCC_CLOCKTYPE_PCLK1 | \
. ^+ ? [( ^# L1 `; L/ F+ g) P - RCC_CLOCKTYPE_PCLK2 | RCC_CLOCKTYPE_D3PCLK1);
- v3 h* C1 D* q% x) p' H' w! U$ e - " e1 a0 E) D: B( L
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;2 y( t0 Y8 c0 ~
- RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
) _& v# ^6 ~1 r1 U' Z5 L - RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
* X1 e0 X D# L0 Q/ P q9 J - RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
+ s @$ M0 c2 R1 o4 R( l5 { - RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;2 p% v) [. Y$ c/ K
- RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;4 X. ]* N6 b8 ~7 b7 m7 ^
- RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
/ s" g, u; T7 @ - ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3);
: K- x. N5 u& @5 Y* P/ Z. T - if(ret != HAL_OK)/ Y$ z! s# n- r. W6 f
- {
- R2 _' a/ U0 [ - while(1) {};2 C5 s w7 K' c7 P: s
- }
" n1 o' {( n7 v" [8 d4 [ - ! D' S8 d+ D) M! @7 [
- }7 v" n0 I7 L7 l# J! d
复制代码
$ J* ?; n1 M( [1 Z7 k: F1 T" h8 z9 y1 T" N- J% b
|