|
STM32学习笔记02—时钟树架构 2.1 时钟树结构图6 W) B7 m! C8 @ STM32属于Cortex-M3内核的单片机,时钟结构比之前的51单片机较复杂的多,根据数据手册,STM32F103的时钟结构如下图所示。' Z3 F2 Z# m) R
4 {1 k/ h' i* X; u. D1 S $ E5 }# a3 R4 A0 ?% @ STM32F103系列内部具有2条外设时钟总线,APB1和APB2,其中APB2的时钟最高可达72MHz,APB1的时钟最高可达36MHz,通过配置对应的寄存器,就可以将CPU内核时钟提高到最大速度。7 _+ S' [$ f; c* ? y7 O2 a* M1 z6 F e# U2 R 通过最小系统可以看到,我们使用外部高速晶体振荡器接口,外接8MHz晶振,RTC则是使用32.768kHz晶振,现在我们来通过数据手册来配置对应的寄存器位来配置APB2时钟达到72MHz,APB1时钟达到36MHz。 ; c$ f; A) a* P6 b 6 f7 Z! C' p" L& _2 H4 f K4 a 2.2 时钟配置- u; @6 W4 ~7 F, Q
^5 ~! v. L) G" ^8 X 2.2.1 时钟配置流程% g7 B T7 q. D8 G1 t (1)开启HSE时钟接口,这个接口用于使能晶体振荡器输入端; " v# i8 u& T' G2 q" W& A (2)设置PLL倍频系数为9,因为外接8MHz时钟,所以设置系数为9就可以轻松达到8×9=72MHz的时钟频率;7 ?5 N& t( W5 o9 f; y 0 W5 m( F, m# T, M2 y (3)设置时钟源为PLLCLK,因为HSE使用的时候可以发现最终的输出就是PLL时钟脉冲; * l# ~4 F: z! O' Y( X Y( v( F ! h }* @( a/ c) m/ A (4)设置APB1时钟总线的分频系数为2,因为APB1时钟总线最高频率只有36MHz; (5)设置APB2时钟总线的分频系数为1。 8 e; W1 C& H& g 2.2.2 相关寄存器0 Q3 I/ |0 M- o8 m5 A5 B3 p9 R (1)时钟控制寄存器:RCC_CR
4 w6 f n) I; N' L) A 0:PLL解锁 : X1 T. P4 |9 D- i6 ?' a! { - \9 P! r/ v) s4 S7 S 1:PLL锁定/ Z* r% L5 j. N; M5 c( T 9 C: v6 i' W, c; N) M Bit 24:PLL使能 / H( P! Z" Y, n 0:PLL关闭# K8 ?3 K* w. Y" Y$ K8 ~0 g 1:PLL打开( i0 K$ d* H# d Bit 19:时钟安全系统开关/ N- @% L+ b* ]9 J+ N0 Q5 ]6 C + o7 ]% D \/ y: z1 W ]6 q# H 0:时钟保护关闭 1:时钟保护打开$ a4 z. K% L% L, s$ ` Bit 18:HSE旁路(禁用HSE振荡器时才能写入) $ l9 J* Q8 D7 Q" A 0:HSE禁止旁路& S) E' [6 c& H# ~4 s 1:HSE打开旁路 Bit 17:HSE准备状态 0 R( C- h& N/ Y2 Y/ k6 h) c 0:HSE未准备好4 o( }# n3 S6 O Y1 [5 Q6 }$ h 1:HSE准备完毕! }' S B. ?' n6 v& X& L# } " X0 [/ {3 o# {- h! L% {) d2 o 2 C2 p! W6 [% F% z) F% z, f0 S Bit 16:HSE时钟使能3 E$ ], B9 m4 ^ M8 ~- G+ a4 I 4 o5 m9 p* B8 V/ l1 N! H 0:HSE时钟关闭! {, _* b6 m" i 1:HSE时钟打开7 ]- }* O& {5 n3 Q; I: x ' O4 g# N. e1 }" B9 O8 p4 h* { Bit 15~ Bit 8:HSI校准值(这个值在启动的时候自动初始化)+ k' [2 N2 e3 X2 | , ~; u5 ~ k1 z" s! e& l) ~9 b 0 J* ^' v) m: C/ n. E3 Q% Q Bit 7~ Bit 3:HSI微调(对其进行编程以适应电压和温度的变化影响内部HSI的频率。初始值16,步长约为40kHz)6 x- `6 ]6 r) f3 W3 E1 R ( h0 ]5 c% z. H/ U, [& M3 h' E ( o. Q( r' o \' k7 S ^ Bit 1:HSI准备状态) @3 ~# \- }9 b H/ q* s0 F! ? ' M9 U5 X" Y, n) @1 T- y / q `. F4 _7 K; {4 V' C 0:HIS未准备好4 k# Q; }4 h3 u- r9 X/ [* \ 1:HSI准备完毕 / K1 |, i7 N$ c# K/ ~$ m ( f8 ~5 }( |% A+ h7 A! {- q Bit 0:HSI时钟使能/ z4 c3 M2 M# {9 G f% Z$ e4 K 0:HIS时钟关闭- a. K$ ^3 U$ ]4 x 1:HSI时钟开启8 R) b" \3 A' t. i , a9 F" e0 |! _$ a$ n$ t (2)时钟配置寄存器:RCC_CFGR: g( ?" H( o& D/ F$ i4 \, V
! C' C+ B5 c' Y& Z" { 0xx:禁止输出 100:选择系统时钟SYSCLK 101:选择HSI时钟, D2 m% r/ g+ F4 M- { 110:选择HSE时钟) C( n7 l+ o8 G- V. `( X/ L 111:选择PLL分频输出(2分频) 4 s6 n7 P1 V" ?2 I Bit 22:USB时钟分频系数3 A/ V1 J& u& I& z0 l + v7 ]( J3 M+ k) m' p) d) z 0:PLL时钟1.5分频作为USB时钟 1:PLL时钟不分频作为USB时钟 - Z! t+ y8 t/ b) L7 X: ] Bit 21~Bit 18:PLL倍频系数 9 c/ ^$ i A7 G: D 8 v; J' \& S3 z5 ]: m 0000:2倍频5 \4 v# }% e U; _+ {: D+ O& | 0001:3倍频 0010:4倍频7 Y: ~/ E0 Z' ?" {; l 0011:5倍频 0100:6倍频0 }, u- ?* P Z3 j5 J 0101:7倍频3 S6 g, I; f l1 f. |* r! p# G 0110:8倍频$ _/ q5 B4 L8 s8 @+ n+ L+ |# k 0111:9倍频! o( m( l% b) b. N' d/ E+ D* l 1000:10倍频 1001:11倍频; W( {; R0 M1 E6 Z 1010:12倍频 1011:13倍频 1100:14倍频# K; w: o1 {% o4 ` 1101:15倍频4 P Y- t+ |7 I5 T: A. U! T 1110:16倍频+ k( p2 Q& T2 O7 T$ T: m3 } 1111:16倍频 Bit 17:HSE输入分频器 % U+ n0 a$ ~% P9 q 0:HSE输入不分频 1:HSE输入2分频* ?; Q6 y/ C k+ u7 ^; y$ t " B5 w% L) M1 l6 Q$ E# V Bit 16:PLL时钟选择(PLL处于禁止模式才能写入) 0:HSI时钟2分频作为PLL时钟输入, X: L2 X. ~. i/ B7 } 1:HSE作为PLL时钟输入 # J/ j/ E& |% s: ?( L Bit 15~Bit 14:ADC分频系数# y" x4 H& z/ Y- L$ N 00:PCLK2分频系数为2 01:PCLK2分频系数为4 10:PCLK2分频系数为6# O0 K% ]+ K+ e$ G6 B 11:PCLK2分频系数为8 4 E$ M5 R9 Z' \ ' Y8 r) c; y- L3 g7 F% L o Bit 13~Bit 11:APB2分频系数(最高可达72MHz) 0xx:HCLK不分频1 k2 ^5 k, ?4 ? 100:HCLK分频系数为2 101:HCLK分频系数为4 110:HCLK分频系数为84 ~ t3 w& _$ ? 111:HCLK分频系数为16! l% y( X$ x( j1 t" p 2 ]# T1 x ]. x8 j$ f 2 A) x6 l/ n6 B Bit 10~Bit 8:APB1分频系数(最高只能达到36MHz) 8 k+ J7 E0 M1 R" T E- N+ s3 x! H5 C2 b, D% k; r 0xx:HCLK不分频 100:HCLK分频系数为2/ t& Q& `3 l1 j! i8 P 101:HCLK分频系数为4 110:HCLK分频系数为86 w' H. I& z1 } R 111:HCLK分频系数为16 0 X- B1 E! E2 ?9 d Bit 7~Bit 4:AHB总线预分频系数 0xxx:SYSCLK不分频7 q+ T, i& u; c: f }9 t; Z 1000:SYSCLK分频系数为2 1001:SYSCLK分频系数为4 1010:SYSCLK分频系数为8 1011:SYSCLK分频系数为16 1100:SYSCLK分频系数为644 [, b. |" t6 N1 l A 1101:SYSCLK分频系数为128. T- P( X8 w( ~ 1110:SYSCLK分频系数为256 1111:SYSCLK分频系数为512 ' g( e0 f- Z' n8 w8 O) b9 m 5 v: h1 D; Q4 w Bit 3~Bit 2:系统时钟选择状态 0 I8 N3 {( z7 H$ E2 ] 00:HSI作为系统时钟: W/ U) }$ d. G, Z7 G1 w 01:HSE作为系统时钟+ M! ]2 U6 |6 q- n- F 10:PLL作为系统时钟. k& S: n/ O. Q/ }1 E, O; [ 11:保留$ T1 z9 Z' B0 Z6 [ # R+ N8 N4 ]: v0 F$ s3 E Bit 1~Bit 0:系统时钟选择8 y v% \- \2 e , g7 k7 S9 e. j: Z( W 00:选择HSI作为系统时钟4 }5 v1 Y3 e' n! P; L 01:选择HSE作为系统时钟3 e! n+ F( L+ [% w( A 10:选择PLL作为系统时钟 11:保留% j g5 f$ S( z G& [9 W: _' V. N7 F5 h% n! l# j 2.3 设置例程; k5 E/ I: w! C5 V J# K 配置STM32的时钟需要创建几个文件,这几个文件如下表所示。
& T! O5 [- f! N4 m) B$ A (3)sys.h输入以下内容! V1 Y6 N1 p* D7 N5 Y. P
4 {5 S) S) p/ H) g (3)sys.c文件输入以下内容+ L2 \% c- R9 }$ q+ r
这个文件的函数就是真正配置时钟的过程,可以对照之前描述的配置时钟的过程来看这段代码。* r% x( o \, {# ?" n 上一篇:1 b) R. ^1 G; M- g STM32学习笔记01—STM32F103环境搭建>>7 }+ ?9 I: V: g* V3 D6 r& C 5 B2 a e) P1 b / U% v; S1 G/ V6 N) M |
![]() ![]() 2 n. H% g; o) r; Z/ Z, F+ q- }1 V |
微信公众号
手机版