STM32学习笔记02—时钟树架构 # [6 e, x$ g; ?% O2.1 时钟树结构图% _% {0 Y. f% ~ Z$ W STM32属于Cortex-M3内核的单片机,时钟结构比之前的51单片机较复杂的多,根据数据手册,STM32F103的时钟结构如下图所示。 ( P0 R; H9 A% k( U t- C STM32F103系列内部具有2条外设时钟总线,APB1和APB2,其中APB2的时钟最高可达72MHz,APB1的时钟最高可达36MHz,通过配置对应的寄存器,就可以将CPU内核时钟提高到最大速度。 7 F5 c D" ?" @* B- ] 9 n+ a1 j0 a' J, J 通过最小系统可以看到,我们使用外部高速晶体振荡器接口,外接8MHz晶振,RTC则是使用32.768kHz晶振,现在我们来通过数据手册来配置对应的寄存器位来配置APB2时钟达到72MHz,APB1时钟达到36MHz。" a: k9 z2 \; Y2 z 2.2 时钟配置 2.2.1 时钟配置流程 (1)开启HSE时钟接口,这个接口用于使能晶体振荡器输入端;9 l$ [) m$ q, U8 O (2)设置PLL倍频系数为9,因为外接8MHz时钟,所以设置系数为9就可以轻松达到8×9=72MHz的时钟频率;3 Z3 r/ I6 d# [6 }, `( V# E3 i; ] 3 W: v( x8 j4 m" v (3)设置时钟源为PLLCLK,因为HSE使用的时候可以发现最终的输出就是PLL时钟脉冲;+ R+ _7 N% T- l4 S n3 f+ S % x3 g. R3 J( j N1 x3 u5 q (4)设置APB1时钟总线的分频系数为2,因为APB1时钟总线最高频率只有36MHz;; E4 r! E1 \0 v5 F6 r# U# W : ^; t, n: |9 j- M5 c (5)设置APB2时钟总线的分频系数为1。 ' n* D/ w9 y) f0 v& A: I7 c' ] 2.2.2 相关寄存器8 }; P `1 ]4 K3 S" I* e (1)时钟控制寄存器:RCC_CR 7 C/ d5 ~( a* [0 X( a+ | 0:PLL解锁 . N5 b- {' Y7 d+ X% h4 y 9 z( C: y3 P, m0 v- Z 1:PLL锁定: x% |% L A5 ?$ W; [3 G+ B " a. d: T! c' I2 b9 X 2 [) G& q+ ~7 N Bit 24:PLL使能: P- R; j# I1 v! d Y G: V7 j ) U: O" i0 j6 q 5 G1 s& f6 Q5 c# v 0:PLL关闭 1:PLL打开 8 L6 j4 W7 u: f7 U7 W6 { Bit 19:时钟安全系统开关' Y3 J$ f' H2 O5 }8 [1 A * v7 Z3 K, e, x 0:时钟保护关闭9 |4 Y( o- A+ Y- d8 W4 g& a3 _ 1:时钟保护打开$ O' W4 b* T& N. c b1 g 5 c% y1 r# |- H2 e & `/ n, g* C7 ~1 ?$ ~ | _; A/ Z Bit 18:HSE旁路(禁用HSE振荡器时才能写入) . \5 D: H/ _2 |- [$ P 0:HSE禁止旁路; x, C& L# }- Q% @4 m+ x Z! E t 1:HSE打开旁路( X+ y) g% \- w / i2 E& K. F7 ~$ Y& K- Y Bit 17:HSE准备状态 0:HSE未准备好' ?% _# a L D5 ` 1:HSE准备完毕 Bit 16:HSE时钟使能 0 o4 D/ x8 a2 [4 v# z# Z6 c2 N 0:HSE时钟关闭* A! W( ]. c$ F1 b 1:HSE时钟打开& f, |" k8 S+ G4 Q6 _' P ! M2 B3 W, h; J/ U3 r" S Bit 15~ Bit 8:HSI校准值(这个值在启动的时候自动初始化) L& k! y. X; p4 J$ y! |$ [ - y" ?- N* M, o Bit 7~ Bit 3:HSI微调(对其进行编程以适应电压和温度的变化影响内部HSI的频率。初始值16,步长约为40kHz)( A0 A' B+ y: Z/ E2 V3 H. \" w" I Bit 1:HSI准备状态 1 V0 s* s- Q5 G) `. y6 p" J" f0 [ 0:HIS未准备好 1:HSI准备完毕 }. ?, B0 ^; R1 D9 o - f3 ^+ q( ]: [! B9 f) y% K 2 N- }) P3 K6 ^ Bit 0:HSI时钟使能 1 o9 [5 e ~( z1 l+ }5 w6 z 0:HIS时钟关闭4 G4 a& {' z y 1:HSI时钟开启' ?: d, r& F: b C) I# E 3 z; J. Y1 C9 W3 a/ T (2)时钟配置寄存器:RCC_CFGR" |/ M# x2 _6 t3 ]2 f2 s 6 j+ M, M. a6 w3 o( v' A" x/ { + X0 s! g& ~* ^5 q- v$ F( a 0xx:禁止输出 100:选择系统时钟SYSCLK 101:选择HSI时钟: W& P! R& f" P0 E9 e$ t2 Z 110:选择HSE时钟" }% I4 M U* [ h& w D 111:选择PLL分频输出(2分频)3 w( v- Y0 b9 Z) @) B% E, ~ Bit 22:USB时钟分频系数 " X+ p" O- r: e( O a 0:PLL时钟1.5分频作为USB时钟 1:PLL时钟不分频作为USB时钟) z9 b! D7 T5 i" c" I& ^' R! | " w; m. J( h6 H6 Q Bit 21~Bit 18:PLL倍频系数& k. S) F6 A, l t* h4 f # h- i' u; ^: b' Z . n( ^! L }. U3 b. X/ Y 0000:2倍频 0001:3倍频 0010:4倍频0 {4 ^3 I# I3 i. k 0011:5倍频! a+ N, F9 v5 M& ~8 Q8 [( @ 0100:6倍频$ h0 @/ D/ r! D; S9 q3 ^5 O 0101:7倍频 0110:8倍频# F2 V' c! d# W 0111:9倍频 1000:10倍频 1001:11倍频 1010:12倍频 1011:13倍频5 J( L2 Y O+ b8 j* ` 1100:14倍频 1101:15倍频 1110:16倍频7 C2 V O0 s# C2 ~: g 1111:16倍频 - A d5 s# C& @4 A: Y! F6 ` } - s9 e" {0 _; ^; v/ c Bit 17:HSE输入分频器 " w1 p4 n8 C* J& F2 B+ k 0:HSE输入不分频 1:HSE输入2分频 : [; E# K% P b1 }/ z. E$ N ) C$ C- O/ b5 ^6 j' J' c# h Bit 16:PLL时钟选择(PLL处于禁止模式才能写入)6 ?9 e% m2 \/ r3 i: b4 U8 j + Z* s! o1 L6 r* m' g2 a1 h$ B9 N + M# ^8 B& l* V* F1 h. B2 X8 ~ 0:HSI时钟2分频作为PLL时钟输入6 M) t5 _+ Q& C2 A7 s 1:HSE作为PLL时钟输入6 x/ [' M* ~+ K: _ ' N1 A' s. ?/ K' y % _! t9 |/ s" J5 p Bit 15~Bit 14:ADC分频系数' {6 ~) ~) z1 _$ w) T3 e / z1 M- W+ I4 F+ @0 c' H - ]& y: d' F0 Z/ Z5 U4 ?. u 00:PCLK2分频系数为2: @& U# t; k+ `! C 01:PCLK2分频系数为4 10:PCLK2分频系数为6# D3 }) Z$ q( `9 R4 \& B9 @! t 11:PCLK2分频系数为88 F0 F2 p' z4 j8 r r' F& ^ # o* X& w6 k' @: W( z, s/ U5 u" I: Z 1 ^- q+ Y' _( i' Q& ]# C Bit 13~Bit 11:APB2分频系数(最高可达72MHz) : N T+ H9 q& C- X7 k % B# _5 g; G1 D( j& Q 0xx:HCLK不分频 100:HCLK分频系数为25 F5 G& O$ h4 n1 [# i 101:HCLK分频系数为49 P3 u! s: ~( T/ s T 110:HCLK分频系数为8. l; J' q+ ~4 u 111:HCLK分频系数为16 ( B, [% Q* |4 r1 u Q) }& C5 n Bit 10~Bit 8:APB1分频系数(最高只能达到36MHz) n3 t+ J2 B+ y8 s( d 0xx:HCLK不分频 100:HCLK分频系数为2; z4 A: X {. ] 101:HCLK分频系数为4 110:HCLK分频系数为8' H4 y0 M4 |" K8 D _7 y5 \ 111:HCLK分频系数为16 $ A/ `4 w/ {! h Bit 7~Bit 4:AHB总线预分频系数! G V. Y$ u. G. L& p- G$ ^$ { 0xxx:SYSCLK不分频 1000:SYSCLK分频系数为2" _' |: Y6 c5 e3 e6 r 1001:SYSCLK分频系数为4 1010:SYSCLK分频系数为8( A( b3 W" T0 s/ r7 F 1011:SYSCLK分频系数为167 d* a& T3 h! T1 N 1100:SYSCLK分频系数为64 1101:SYSCLK分频系数为128 1110:SYSCLK分频系数为256 1111:SYSCLK分频系数为512" M, ~* g8 |. F; u' ` : {: e6 Q0 p& @+ g# A$ D! T Bit 3~Bit 2:系统时钟选择状态 00:HSI作为系统时钟" X$ W& c9 H( v- d( v) }; S( p 01:HSE作为系统时钟 10:PLL作为系统时钟4 s9 f* M8 a; T% b( ?+ o" f* Q+ U 11:保留 Bit 1~Bit 0:系统时钟选择9 Q7 r" n" J) w' u) `( X7 p5 F' [ ; H1 T( [* C( [" X1 @/ h 00:选择HSI作为系统时钟 01:选择HSE作为系统时钟6 h+ V) d. c' L. S7 \: U1 B 10:选择PLL作为系统时钟 11:保留 & C4 Z! m g5 i6 X% M0 b7 | 0 r5 y3 U( H0 k4 ]: N2 w4 e: B 2.3 设置例程0 R7 y4 L+ u3 S$ J/ K5 I: o & q1 l9 B6 P/ G4 w, M/ R 配置STM32的时钟需要创建几个文件,这几个文件如下表所示。 (3)sys.h输入以下内容 5 q$ u0 f$ i; Q0 n$ z2 J0 \+ } ; [4 n$ T4 g, y( G (3)sys.c文件输入以下内容
这个文件的函数就是真正配置时钟的过程,可以对照之前描述的配置时钟的过程来看这段代码。) v4 x9 ^# u7 e5 o 上一篇: STM32学习笔记01—STM32F103环境搭建>>* r. ?+ ^, a+ [9 Y# }8 r 4 u7 J! k D3 D. y- | " t+ V- T, r4 g5 K1 T( w9 z 7 d0 N r2 f' Q, u# [. |) L |
( h9 D+ Y5 u9 w: @1 K |