一、STM32 有5个时钟源:HSI、HSE、LSI、LSE、PLL。4 U* B* b. Q; G9 p' E
①HSI振荡器(RC振荡器)时钟是高速内部时钟,一般很少使用,因为精度没有外部高速时钟(晶振)那么高) i$ G6 L0 T: O* ?- U
9 I1 j+ a4 Z% \- N2 G6 ]
②HSE是高速外部时钟接石英/陶瓷谐振器,或接外部时钟源,频率范围为4MHz~26MHz,M4开发板是8M
# ~/ M+ {8 u, Y( I6 H0 n( C6 R; E! r, V2 s. f
③LSI是低速内部时钟,RC振荡器,频率为32kHz提供低功耗时钟。主要供独立看门狗和自动唤醒单元使用。
+ C6 T2 M5 _# T2 J/ M5 S' {8 ~/ [1 |8 Q0 N" ^8 K( @
④LSE是低速外部时钟,接频率为32.768kHz的石英晶体。用于驱动 RTC 时钟 (RTCCLK)
, P: f( Y! S+ B, z, l
- X0 N: e1 d5 _3 U- \, Z ⑤PLL为锁相环倍频输出(倍频时钟)。STM32F4有两个PLL:! v8 b+ L1 e( }- g( e$ Y' Y7 a
9 H9 F$ S7 e- K# M: O6 d+ Q! P( m
1、主PLL(PLL)由HSE或者HSI提供时钟信号,并具有两个不同的输出时钟。, S( n4 t& a( t7 L
/ y6 X6 X9 m# W
第一个输出PLLP用于生成高速的系统时钟(最高168MHz)$ z# k: U* M0 {8 p0 T8 V
) r/ S" m6 ?4 J0 ]% `% n8 r& g, q: C) i 第二个输出PLLQ用于生成USBOTG FS的时钟(48MHz),随机数发生器的时钟和SDIO时钟。
' {3 K6 B7 u+ J3 a+ V
Z3 K; Q$ ~7 S6 N" O( b; G+ [ 2、专用PLL(PLLI2S)用于生成精确时钟,从而在I2S接口实现高品质音频性能。
" X' m7 R- a, L7 z8 E
3 L1 g$ ~+ u. g$ ^& \5 Z: x7 N二、系统时钟SYSCLK可来源于三个时钟源:
2 o; T0 s) b4 x; z3 r ①、HSI振荡器时钟7 N. F- i, g& `. {% h4 g) Y
9 C, F G, L- f% d( n
②、HSE振荡器时钟
* ?* H c* n3 l; F5 ~* b8 F1 T9 r M( T
③、PLL时钟9 m% C Y/ d" L
6 z" T; {! Z# o) P. B1 K
三、时钟树
3 w4 W) l3 l7 n% {. K. C1 f9 { J# s
3 n' i0 c+ O" S4 x4 r7 ~
" @' q: @$ _* {* i
) H1 _# H$ q$ n) J( ?& W4 k# l
! I0 M) g _/ @- ^$ f. N: S0 \/ g
4 W, s* ]' v6 z6 n$ ?5 C
四、开发板与系统时钟频率不匹配,如何修改?
3 x9 k4 H3 w* J9 E7 K
, E( Y9 Q( s$ W. L1 V: t- //1.查看汇编文件 startup_stm32f40_41xxx.s的第177行3 n! o) P* C, i/ _; A7 U) V
$ N! C% l* } h' J- Reset_Handler PROC // 复位中断执行/ }9 u- q8 z+ i
7 b$ J, m7 H& f) |& D D) |7 X2 S- EXPORT Reset_Handler [WEAK] // 复位中断执行
O7 C. D0 B/ N3 f) Y - . o0 i( n ^. Q( h
- IMPORT SystemInit // 系统时钟初始化的入口
; [4 ]4 o4 x: Z1 g5 M
2 W% t4 B; M1 Z. w. K; z# o- IMPORT __main
" [2 U6 A3 x+ C3 ~) I/ x - LDR R0, =SystemInit // 系统时钟初始化3 C- r# Q I( W; G3 U8 Q+ D
- / j4 V4 B1 [6 ^2 s
- BLX R0
$ S( P5 K2 b! X, X, [ - & l+ G4 O7 A" h5 _+ c- |( S
- LDR R0, =__main // 启动main h& s2 ^% L( J# G/ |9 [
3 F$ A6 @) I% r* t- BX R0
. a% @. v9 ?- O! T7 a3 H
( ~0 t' S! x# z& c# @- ENDP
) U- t& O; t( X4 \* O0 f3 f
( m* b( [! ` C, z
1 o8 e% o9 i- X$ J3 `) D- //2.查看system_stm32f4xx.c的第252行开始
2 x' @7 G# A9 I: t0 _/ X - 5 i* R$ Y1 q5 ] M1 E6 O
- PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N, C n0 S9 H- \. u7 X8 l6 M
- 7 F+ E4 J" ?9 ]1 L
- PLL_VCO = (8000000 / 8) * 336
3 E6 A4 X/ \4 ]: m" A( i _) a
" J5 {/ H" |2 Y& H! Q$ x. o8 }. L- 4 i" x+ R1 P; U) x5 k
- //计算公式:SYSCLK = PLL_VCO / PLL_P = 336*1000000 / 2 == 168000000 == 168000KHz == 168MHz
复制代码
& k% g, \. v+ N0 Y% M8 u3 {+ {* g8 u
- 修改:system_stm32f4xx.c第254行1 Q1 X( s+ b y. X* O
- 1 G) S j6 v- [9 Y2 ~0 p# P
- #define PLL_M 25$ {7 u/ `8 S( |) k7 M% K
- 9 f- n5 g) b' g+ u0 E; t- j8 A
- 修改为:4 z1 Z' N) _3 c5 K7 D0 F
3 V' U- K' q7 ?2 |( A- #define PLL_M 8
% |. D, n+ w. |, o, j
0 y6 K+ w g( S- 修改 stm32f4xx.h第127行
1 |8 p* o( Y. q$ {; b8 P - ( A$ e( Q, o2 z% c
- #if !defined (HSE_VALUE)( i7 z3 T- ~1 T: A7 K# k$ u
- , A% O7 s- D6 C- u7 ?2 |& C
- #define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
3 Y# B9 ^+ N# D. |
/ ]: ^. \ K- C5 w ~$ j' c8 \% S7 ~- 修改为:9 u& f2 Q, p8 ?4 v( v
5 _& R: y! J# p3 G% ~+ v: f- #if !defined (HSE_VALUE)$ z5 G4 }+ P" R$ t6 |
- - c9 L* Q# @1 Y% }5 U0 d
- #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz *
( Y+ J$ z$ {# _+ `; A0 G* g
- M0 S5 y7 X6 v. ]1 m) m) Y- (如遇到无法修改:权限问题:)点击名字那里能看到路径,找到.h修改权限
8 z6 |: {! y: ` - & P% u- S7 a" }% M8 V# x" G
0 D$ A& t# O& P& l( w- + I8 p2 M0 Z" a9 Z+ M [
- 根据文档了解我们的开发板的总线时钟频率:# }% e$ c( s' Q y# M Y7 e7 n
- - q0 g, H2 d* c* [$ |2 t
- 系统时钟频率:标准频率为168MHz
+ E* O5 q0 E- g( g - / z! a4 N( l. u& u1 c0 u3 }" m$ g3 J
- AHB时钟频率:168MHz
8 ?+ _- C- i6 b - - b3 E$ F: H5 g; }- c/ \
- APB1时钟频率:42MHz8 y4 J; h8 D0 g0 ~% ?# D7 \, j3 t
6 _5 F" k! g6 p- APB2时钟频率:84MHz% x* @; y0 V V9 U' u, _3 K
- 5 W5 L) M4 t* |0 B2 T: L
% ]1 ]: ?6 ]2 r3 x E- C1 B
, P# w0 h3 n9 G' O) E- 超频:提高cpu运行的时钟频率。 c% R) D7 O$ f; s
- ! q8 `$ G% X; j" l% P: R G* ]7 [" G
- 调节PLL_N为432;) _9 y! {' a3 H5 `; W9 X
. O3 U4 k5 B2 c- 降频:降低CPU运行的时钟频率。
3 f0 j# \/ U7 I" W - 6 z2 b1 B% f- s, H) a1 ~/ l D
- 调节PLL_N为168;
' D- y$ l- ~+ R4 d# k; W& N
, k0 A0 k p# J7 w2 ?& D
复制代码
" {2 t7 C$ c8 N |