|
STM32学习笔记02—时钟树架构 2.1 时钟树结构图+ K/ H9 i$ f6 s y& j STM32属于Cortex-M3内核的单片机,时钟结构比之前的51单片机较复杂的多,根据数据手册,STM32F103的时钟结构如下图所示。
* ` m J8 e1 A/ o2 j9 {" ]; e. O STM32F103系列内部具有2条外设时钟总线,APB1和APB2,其中APB2的时钟最高可达72MHz,APB1的时钟最高可达36MHz,通过配置对应的寄存器,就可以将CPU内核时钟提高到最大速度。 / F$ w7 C; g! r! ?6 }% z# n, h 1 p3 L; z8 H1 v/ v 通过最小系统可以看到,我们使用外部高速晶体振荡器接口,外接8MHz晶振,RTC则是使用32.768kHz晶振,现在我们来通过数据手册来配置对应的寄存器位来配置APB2时钟达到72MHz,APB1时钟达到36MHz。 : Y. g9 h' p; a, P- m 9 g# m2 c9 }% i/ Y6 V 2.2 时钟配置' s, {/ N: i) \/ o3 G. W, K* u
2.2.1 时钟配置流程 (1)开启HSE时钟接口,这个接口用于使能晶体振荡器输入端; (2)设置PLL倍频系数为9,因为外接8MHz时钟,所以设置系数为9就可以轻松达到8×9=72MHz的时钟频率;# t( t5 j8 C% Q0 T( N # z4 |4 K, _. G S" b, R6 A 9 c, i" b# f1 v* O" T u! j (3)设置时钟源为PLLCLK,因为HSE使用的时候可以发现最终的输出就是PLL时钟脉冲;7 R& ]* x% U8 _# c) V 5 c0 Q" j5 ` J) c! _ (4)设置APB1时钟总线的分频系数为2,因为APB1时钟总线最高频率只有36MHz;& m6 X( Y0 I' b9 I# C 3 V% l6 X2 m" [+ h. ^/ S# K1 K( { (5)设置APB2时钟总线的分频系数为1。 2 O* z3 M' ?6 \0 Y; I 2.2.2 相关寄存器- X) p& H1 e0 F2 d" v9 \! | (1)时钟控制寄存器:RCC_CR8 \, q. y n" Y% Z
0:PLL解锁3 C: E6 V+ I0 d; g, o & ?4 r/ e1 }/ D- a 4 T3 }. _: V4 l1 B9 j& w 1:PLL锁定$ H; r' q* p; Z8 \) i8 A ( N7 i6 Y9 d0 v" t/ C. O' C2 c Bit 24:PLL使能1 i% C& {8 { f! ]0 q m4 W+ \$ z5 p5 h 0:PLL关闭 1:PLL打开 8 \! X. n4 L$ U# Q/ G2 ^3 l/ x Bit 19:时钟安全系统开关 ( V, O( H; J+ F0 }; U$ A. \- s 0:时钟保护关闭; w. \8 `! {6 }8 Z 1:时钟保护打开 Bit 18:HSE旁路(禁用HSE振荡器时才能写入) 5 ^" r; ]+ k- K9 | 0:HSE禁止旁路3 [6 ?; R ^( i& X! ] 1:HSE打开旁路 ' @. O ~6 r, y Bit 17:HSE准备状态 5 J% n- q' d6 N 0:HSE未准备好 1:HSE准备完毕 Bit 16:HSE时钟使能. d+ ^ |' | ]# L0 G + X4 y6 q; Y E% K5 M+ D8 ~ 0:HSE时钟关闭 1:HSE时钟打开 1 {- v- a. }/ s% G, K3 G ) o* s) y1 u, J K x' R, T Bit 15~ Bit 8:HSI校准值(这个值在启动的时候自动初始化) - ]2 G6 b1 Y8 R( Z , q) O5 c: ~; X# p Bit 7~ Bit 3:HSI微调(对其进行编程以适应电压和温度的变化影响内部HSI的频率。初始值16,步长约为40kHz)5 S3 M3 `( g9 u! p9 k Bit 1:HSI准备状态. f( R9 Y% i( S + x% B2 N$ @/ y 0:HIS未准备好 1:HSI准备完毕 . n7 G1 W2 u4 n. z3 F, n Bit 0:HSI时钟使能7 \: z" b$ x, o8 `6 Z ( t7 U- x$ P: V1 O 8 j# b1 [; F' Q% s0 @8 P& c 0:HIS时钟关闭" G, @' Y! R' S" N" f 1:HSI时钟开启9 t$ q8 Z* T# q: D! m H% c. z* Y! m8 L6 b7 I6 P / [ h) [7 i% c. ? 7 v& M; B* A/ x/ W8 z (2)时钟配置寄存器:RCC_CFGR
1 ?( V# D8 x( Z% i6 T4 {8 \4 K 3 ? A' O( X$ ^% W! {$ W5 r0 g 0xx:禁止输出 100:选择系统时钟SYSCLK 101:选择HSI时钟( u3 z G, I, @1 q4 J 110:选择HSE时钟 111:选择PLL分频输出(2分频)6 N# P# u( m5 k8 f 3 F+ z/ s: t; G5 i0 j9 t Bit 22:USB时钟分频系数: f" W; |4 e3 e 3 |) Y) [- v( Q+ o9 T; P 0:PLL时钟1.5分频作为USB时钟 1:PLL时钟不分频作为USB时钟7 J$ r) n, J. Z v0 q1 ~ |4 y+ ^ Bit 21~Bit 18:PLL倍频系数 0000:2倍频 0001:3倍频 0010:4倍频+ y6 T0 y# G* g3 H7 t 0011:5倍频4 S' \$ p) H) ~4 K: Z5 ? 0100:6倍频+ A5 G" l, x! i, C 0101:7倍频 0110:8倍频 0111:9倍频$ [" U) k$ u4 E9 w) B 1000:10倍频8 i/ c7 M& Y3 e6 D! l7 } 1001:11倍频4 S; _- t3 ]$ a3 e& H 1010:12倍频 r2 X: S8 h5 z3 U! F7 j. q 1011:13倍频) e& d9 _; j5 I9 i 1100:14倍频# x* T: e3 \1 a2 ]1 x 1101:15倍频 1110:16倍频! N. O8 o# [7 e4 U r& U 1111:16倍频8 ?$ f) Q# V0 `* s3 K " ^3 }) Q1 K- T6 H Bit 17:HSE输入分频器0 K* A/ k" D' u 0:HSE输入不分频 1:HSE输入2分频; U! |/ o+ K& t5 ?' ] , J( N; E5 J0 `. R4 I 3 d9 [; A1 ^+ F1 b" d, g2 ~ Bit 16:PLL时钟选择(PLL处于禁止模式才能写入) . ^" U9 a/ b- T$ Z1 ~4 x) r ) G& o' f2 Y9 B, o( s 0:HSI时钟2分频作为PLL时钟输入 1:HSE作为PLL时钟输入 ; R- m4 f5 w/ h; z" M+ l: T8 U, T ( z. _# x8 s1 k; i Y; r Bit 15~Bit 14:ADC分频系数; i' x3 G P2 ~1 G : ]- ~" L7 R) ?1 ` I 9 I3 k9 |& M5 [. S( _- X3 S$ K 00:PCLK2分频系数为28 \& V% d6 c) `$ ` 01:PCLK2分频系数为4 10:PCLK2分频系数为6, z, `& e9 }& ?2 a 11:PCLK2分频系数为8 5 ]3 S8 |4 i+ ^. Z# P4 t Bit 13~Bit 11:APB2分频系数(最高可达72MHz)9 E" ]2 _6 I. g, v' j# `0 t 4 u" V: d( k) t/ n' f) W0 Y 0xx:HCLK不分频, w. C J7 Q; G' h! [" U 100:HCLK分频系数为2 101:HCLK分频系数为4 L: G) I1 b# e9 F( _ 110:HCLK分频系数为82 p" M+ F0 X! |) _ 111:HCLK分频系数为16 , m+ Z# m* [5 g* u 5 A, v, L t# |2 u Bit 10~Bit 8:APB1分频系数(最高只能达到36MHz)& ^. a4 B7 n1 d: t$ L # L, w" @) r! e! M( g+ Z& v' Z& o : h' u2 ?% ]# A' t/ Z5 t$ e 0xx:HCLK不分频 100:HCLK分频系数为2 101:HCLK分频系数为4 110:HCLK分频系数为8 111:HCLK分频系数为16# q0 R3 i# j) R2 N8 W! I4 c) O( O$ ~ * @1 d5 T9 I/ M+ @+ ]+ w( Q 3 A' K3 L! ?' y! }* D- \ Bit 7~Bit 4:AHB总线预分频系数9 E# L+ ~* V+ c7 F* u% \0 \ 4 i/ A& \) f- b3 z$ T) q 0xxx:SYSCLK不分频 1000:SYSCLK分频系数为2% s+ `5 `8 G2 I. s 1001:SYSCLK分频系数为44 H9 F/ L W1 L8 \' [ 1010:SYSCLK分频系数为8- i: }2 \- _/ K2 A2 O 1011:SYSCLK分频系数为16- p/ x" U2 r, x! \7 [7 r. J 1100:SYSCLK分频系数为64& `4 z3 ~9 u2 ^% v 1101:SYSCLK分频系数为128& g+ b2 a0 T* _% q- O 1110:SYSCLK分频系数为256* E7 V! i) F" W" ^ 1111:SYSCLK分频系数为512/ n* U% T' r4 H5 [- Z * D2 j: N* @3 f: d2 E; O$ Q8 S Bit 3~Bit 2:系统时钟选择状态 7 b2 [( F7 I9 K& Z6 ]2 u8 B1 @ 00:HSI作为系统时钟' x, J: M: r9 B 01:HSE作为系统时钟 10:PLL作为系统时钟 11:保留 ! R1 G( |- T% Q" w: C, V2 V1 ^! E . [" C! q+ _. T Z4 q Bit 1~Bit 0:系统时钟选择 4 Z7 [6 w- _# } D, Q9 w* N 00:选择HSI作为系统时钟& e0 d! I: x; W" A! q: [8 M7 ] 01:选择HSE作为系统时钟 10:选择PLL作为系统时钟 11:保留- W2 Q* g: w( h* | ) d; F+ A0 z$ u4 g D3 q# H! Y2 U " @) l' ]* P) r# J8 H 2.3 设置例程 ( ~$ K* T g( _) m 配置STM32的时钟需要创建几个文件,这几个文件如下表所示。
' k, `' D- Q4 F2 |; o (3)sys.h输入以下内容
/ o/ {- y# [4 }# E (3)sys.c文件输入以下内容5 H: K! u- }0 u& W$ s
这个文件的函数就是真正配置时钟的过程,可以对照之前描述的配置时钟的过程来看这段代码。 上一篇: STM32学习笔记01—STM32F103环境搭建>>' |' `+ d* [/ u1 f+ a1 Z0 v. ? ?+ M3 I! t5 Q# X& L: U 6 I. q; h- k3 c! B/ l( W$ { |
![]() ![]() ' u' a7 a5 }7 r$ Z |
微信公众号
手机版