请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32学习笔记02—时钟树架构

[复制链接]
STMCU-管管 发布时间:2020-10-27 13:51
STM32学习笔记02—时钟树架构
# [6 e, x$ g; ?% O
2.1 时钟树结构图% _% {0 Y. f% ~  Z$ W
       STM32属于Cortex-M3内核的单片机,时钟结构比之前的51单片机较复杂的多,根据数据手册,STM32F103的时钟结构如下图所示。
' S5 j6 q% i. `/ J: ?$ H
1.png
    根据上图可以看到,STM32F103系列单片机具有4个时钟源,内部的8MHz时钟发生器,外部的晶体振荡器接口,最高支持16MHz,外部的32.768kHz晶体振荡器接口和内部的40kHz时钟发生器,其中32.768kHz和40kHz主要用于内部RTC时钟脉冲,8MHz的晶振通过PLL时钟倍乘器,将系统总线时钟提高为72MHz。8 S! {1 u! T8 ~1 B1 J

7 L0 X' @6 g9 Q1 [7 @% a
( P0 R; H9 A% k( U  t- C
       STM32F103系列内部具有2条外设时钟总线,APB1和APB2,其中APB2的时钟最高可达72MHz,APB1的时钟最高可达36MHz,通过配置对应的寄存器,就可以将CPU内核时钟提高到最大速度。
- R- x7 Y% r7 j7 F5 c  D" ?" @* B- ]
9 n+ a1 j0 a' J, J
       通过最小系统可以看到,我们使用外部高速晶体振荡器接口,外接8MHz晶振,RTC则是使用32.768kHz晶振,现在我们来通过数据手册来配置对应的寄存器位来配置APB2时钟达到72MHz,APB1时钟达到36MHz。" a: k9 z2 \; Y2 z

* B! N/ l4 B" l

- K5 d1 y+ _8 A; n! S2.2 时钟配置
* N& u& D; n& I+ n
2.png
       上图是ST公司推出的一款软件,这款软件可以自动生成寄存器代码,但是我们在这里只用到其中提供的时钟配置功能,通过上面的时钟结构,我们可以得到配置时钟的大概流程。/ B  [: b" _, Y3 H$ y

4 ?8 m0 L  _2 N2 g3 |

6 R$ Z- x2 m0 Q! f2.2.1 时钟配置流程
3 C6 P0 y1 z$ U& W(1)开启HSE时钟接口,这个接口用于使能晶体振荡器输入端;9 l$ [) m$ q, U8 O

) Q/ d) t6 a; ~( I. G

. a  F2 K# t$ M5 ^/ P(2)设置PLL倍频系数为9,因为外接8MHz时钟,所以设置系数为9就可以轻松达到8×9=72MHz的时钟频率;3 Z3 r/ I6 d# [6 }, `( V# E3 i; ]
3 W: v( x8 j4 m" v

1 L1 v& W3 _$ F5 z# r- J; D- G( J(3)设置时钟源为PLLCLK,因为HSE使用的时候可以发现最终的输出就是PLL时钟脉冲;+ R+ _7 N% T- l4 S  n3 f+ S

/ [% x0 Y* s) q) J3 a: s6 a. i% f- U
% 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

, J8 _0 H9 q5 R! R* X(5)设置APB2时钟总线的分频系数为1。
. t. T. c! s/ Q* }2 w$ q, o+ X
, U$ E1 F* T9 F4 _7 |& T" M- h
' n* D/ w9 y) f0 v& A: I7 c' ]
2.2.2 相关寄存器8 }; P  `1 ]4 K3 S" I* e
(1)时钟控制寄存器:RCC_CR
2 I# q. N- d* g/ _2 P. m5 m
3.png
Bit 25:PLL准备状态
5 p" f/ n1 P: v
! y& f3 F$ Q* V8 V
7 C/ d5 ~( a* [0 X( a+ |
              0:PLL解锁
9 x5 R# B* m2 @: ~" y  i. 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关闭
; D7 u3 M) l6 Z, w2 [" D9 L% N              1:PLL打开
2 z. }0 d- m& G: A, T/ k+ c8 L6 j4 W7 u: f7 U7 W6 {

  n  ^* t5 H6 SBit 19:时钟安全系统开关' Y3 J$ f' H2 O5 }8 [1 A

. J6 k% u/ N! o2 @, K
* 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振荡器时才能写入)
3 N: A  P3 E, A  u
& ^' X" L  t5 @) Q
. \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

( a) w+ C0 n# L0 Y& ]! B( C6 WBit 17:HSE准备状态
# u" S) R4 T4 H4 N7 f! b
8 k3 [  R+ i+ c5 g, K, t) @/ I# C

7 Z1 ]: X& u0 j9 w5 L, \5 A" U              0:HSE未准备好' ?% _# a  L  D5 `
              1:HSE准备完毕
2 ^% F& K1 ^: O0 E9 C
/ B7 j8 W" ]8 q- ^4 |

+ V; K  G; z0 U6 T9 D' s. }Bit 16:HSE时钟使能
# S2 e' ?( U5 V4 o4 A# g
! f, D8 |( @, W9 E/ C
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

5 O8 c$ F; }4 P! K( c6 l: A0 m
! M2 B3 W, h; J/ U3 r" S
Bit 15~ Bit 8:HSI校准值(这个值在启动的时候自动初始化)  L& k! y. X; p4 J$ y! |$ [

+ p! n& v1 p" w3 |) O/ v! w
- y" ?- N* M, o
Bit 7~ Bit 3:HSI微调(对其进行编程以适应电压和温度的变化影响内部HSI的频率。初始值16,步长约为40kHz)( A0 A' B+ y: Z/ E2 V3 H. \" w" I

1 v7 ^. }4 H+ w: D. j9 w

4 C5 C  T! j  d6 e9 S5 CBit 1:HSI准备状态
4 n% n0 O+ D" x
) \- f: d3 T( g# z  W% x
1 V0 s* s- Q5 G) `. y6 p" J" f0 [
              0:HIS未准备好
. l7 n5 ?4 t$ z% f0 p5 Y( z! e              1:HSI准备完毕  }. ?, B0 ^; R1 D9 o
- f3 ^+ q( ]: [! B9 f) y% K
2 N- }) P3 K6 ^
Bit 0:HSI时钟使能
% `+ I( p- B8 S7 b
4 D( Z3 S" @' `) R5 G# z6 Y
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

8 o' l1 P3 c, Q3 F, h

2 S) J- u8 n! U& I* ]3 z; J. Y1 C9 W3 a/ T
(2)时钟配置寄存器:RCC_CFGR" |/ M# x2 _6 t3 ]2 f2 s
4.png
Bit 26~Bit 24:芯片时钟输出
7 D% l: x/ m% M4 m- w6 l8 T6 j+ M, M. a6 w3 o( v' A" x/ {
+ X0 s! g& ~* ^5 q- v$ F( a
              0xx:禁止输出
" N5 p0 s2 n2 c8 g              100:选择系统时钟SYSCLK
, d  W4 ^3 n6 e" L: i/ K- k              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, ~

! \) |. i  C$ y0 M

5 Y! `& e: K  U% e- ABit 22:USB时钟分频系数
2 }. r9 u' ]# O4 P
9 x. j) {9 u' y: M+ a
" X+ p" O- r: e( O  a
              0:PLL时钟1.5分频作为USB时钟
, ~# Z% K3 A2 |4 s; X              1:PLL时钟不分频作为USB时钟) z9 b! D7 T5 i" c" I& ^' R! |

2 |( l; J8 F) o, v7 {; ~# [5 _
" 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倍频
- W; X, O3 I' I/ ?              0001:3倍频
9 M5 q4 v/ w* A              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倍频
$ h. B1 E4 `! |* ~+ _- u: Z              0110:8倍频# F2 V' c! d# W
              0111:9倍频
) W4 o0 D5 o  k7 k9 I5 J              1000:10倍频
) b) `8 a0 x+ r5 p* E6 |3 W              1001:11倍频
1 g. y2 G6 E% I) B2 {' U  D8 A) l              1010:12倍频
, U% \  u4 L8 A              1011:13倍频5 J( L2 Y  O+ b8 j* `
              1100:14倍频
# y5 ^" f9 N; B) ]              1101:15倍频
6 I: z: F. g% i" s6 q              1110:16倍频7 C2 V  O0 s# C2 ~: g
              1111:16倍频
9 z: x- _2 t# z$ ~, T* w- A  d5 s# C& @4 A: Y! F6 `  }
- s9 e" {0 _; ^; v/ c
Bit 17:HSE输入分频器
7 J: V" W& y: V0 C- K" w1 p4 n8 C* J& F2 B+ k

0 p+ K7 I8 q" D4 L. V1 l$ f              0:HSE输入不分频
8 y: d) a$ {! f" N  D% c              1:HSE输入2分频
  A) i! O. `& K  R, G& k0 y: [; 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
6 u7 R* l/ s8 I8 M% R: Y' j+ p              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)
4 O) ^7 c% W" c& h$ D: N  T+ H9 q& C- X7 k
% B# _5 g; G1 D( j& Q
              0xx:HCLK不分频
; ^* n0 R* U) Q* v# p              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
# U+ R; a. b' A* |
( K! i2 x2 f; A' k  k
( B, [% Q* |4 r1 u  Q) }& C5 n
Bit 10~Bit 8:APB1分频系数(最高只能达到36MHz)  n3 t+ J2 B+ y8 s( d

0 F! Q/ @1 g- e/ n! ?

. d+ W2 w2 [8 f4 P8 W              0xx:HCLK不分频
$ t2 Q* s/ ?5 s. c  o" n              100:HCLK分频系数为2; z4 A: X  {. ]
              101:HCLK分频系数为4
1 `  I& i* ~4 V) Y7 t3 N              110:HCLK分频系数为8' H4 y0 M4 |" K8 D  _7 y5 \
              111:HCLK分频系数为16
8 m4 z6 _% h1 G* s# V
) E7 R3 \; ~- M, m) Y
$ A/ `4 w/ {! h
Bit 7~Bit 4:AHB总线预分频系数! G  V. Y$ u. G. L& p- G$ ^$ {

$ ^+ u, b4 b. F0 F$ V

3 H- I- C. [/ m- [& G              0xxx:SYSCLK不分频
" c$ @3 t8 \% w: |' g              1000:SYSCLK分频系数为2" _' |: Y6 c5 e3 e6 r
              1001:SYSCLK分频系数为4
9 n, X* C" a) R/ I6 [9 E              1010:SYSCLK分频系数为8( A( b3 W" T0 s/ r7 F
              1011:SYSCLK分频系数为167 d* a& T3 h! T1 N
              1100:SYSCLK分频系数为64
' |  ~% I, m$ ~. B$ L5 V/ T, D% ^, a              1101:SYSCLK分频系数为128
* V  g! @& Y0 n: h1 q! v1 ?              1110:SYSCLK分频系数为256
- H' ^$ p% K! n  P$ J              1111:SYSCLK分频系数为512" M, ~* g8 |. F; u' `

9 |3 Z3 F3 u/ E, {3 E' K! m5 n
: {: e6 Q0 p& @+ g# A$ D! T
Bit 3~Bit 2:系统时钟选择状态
9 A5 `2 N) b8 G0 I; v
1 @# F  Q' K% n% L: [

! \9 d4 A/ W* j1 j' e              00:HSI作为系统时钟" X$ W& c9 H( v- d( v) }; S( p
              01:HSE作为系统时钟
* \- c  {/ I: H6 m- r              10:PLL作为系统时钟4 s9 f* M8 a; T% b( ?+ o" f* Q+ U
              11:保留
' n' k" m' d" E+ v( y
- ~+ `2 _; _; Q: z1 t

( ~# w1 G, D5 v( U: @Bit 1~Bit 0:系统时钟选择9 Q7 r" n" J) w' u) `( X7 p5 F' [

! R3 O( C3 u1 M, X( D/ c. x
; H1 T( [* C( [" X1 @/ h
              00:选择HSI作为系统时钟
$ P  l% y- k# T8 u  q, B& W. c              01:选择HSE作为系统时钟6 h+ V) d. c' L. S7 \: U1 B
              10:选择PLL作为系统时钟
! ?5 F+ G1 [& @5 Y              11:保留
, }) J: X0 P& J" m- u& 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的时钟需要创建几个文件,这几个文件如下表所示。
$ X8 g' B8 c$ g' z8 X
5.png
(1)创建上述三个文件,其中c文件添加进工程中,h文件包含进程序中,如下图所示。  F9 i/ W5 T7 @9 L" l
6.png
7.png
(2)stm32f103x.h文件输入以下内容:9 ~/ a6 ?! D1 ?8 y4 Q! S! H
8.png
    这个文件用于定义程序用到的所有寄存器的地址和结构体,是整个STM32程序的最基础的文件。: p# x; y$ r# N* A. S8 P

! E  p7 r; E: X6 z% M8 B

# I3 B9 X; k. P( E6 ?% l* H/ U- C: q(3)sys.h输入以下内容
1 e5 h) V  ~9 C1 ]% ^; G( `3 Y
9.png
    sys.h文件用于定义STM32的时钟配置和中断配置,以及后面的端口位操作模式。- a8 q; w; i: T3 @, @- A
5 q$ u0 f$ i; Q0 n$ z2 J0 \+ }
; [4 n$ T4 g, y( G

7 z# U- S: w" X/ s" y(3)sys.c文件输入以下内容
2 M+ S2 I1 r/ m
  1. void STM32_Clock_Init( u8 PLL )8 I7 @* v1 D6 |7 Y8 L5 [/ z$ w
  2. {
    % ?! K6 y/ X* y6 m& d4 O" |
  3.    RCC->CR |= 0x00010000 ;              //外部高速时钟使能HSEON
    3 I4 S: s) z. N& ?) P* Q
  4.   while( !( RCC->CR>>17 ) ) ;              //等待外部时钟就绪
    ( k4 J# O+ n" I& ^' z8 X0 g
  5.   RCC->CFGR = 0x00000400 ;            //APB1=DIV2;APB2=DIV1;AHB=DIV1;9 T  m, k1 g: A  v  P& a: [
  6.   PLL -= 2 ;                    //抵消2个单位(因为是从2开始的,设置0就是2)
    8 N. \+ X7 a- M* p2 t* s4 m
  7.   RCC->CFGR |= ( u32 )PLL<<18 ;            //设置PLL值 2~163 U; C% A: _/ c4 s, Q8 M% P
  8.   RCC->CFGR |= 1<<16 ;              //PLLSRC ON$ x9 w0 O, {& X. Z8 d1 i
  9.   FLASH->ACR |= 0x32 ;                //FLASH 2个延时周期
    3 G5 L6 w' h. ]7 L1 @& h, G+ f
  10.   RCC->CR |= 1<<24 ;                //PLLON
    6 ]3 o5 r5 }5 Y4 L0 R. v" {% Z
  11.   while( ( RCC->CR&0x02000000 )!=0x02000000 ) ;    //等待PLL锁定( t5 p  t8 d0 |+ W/ W( ^
  12.   RCC->CFGR |= 0x00000002 ;            //PLL作为系统时钟
    5 k& u9 {7 B) G$ D4 P1 r
  13.   while( ( RCC->CFGR&0x0000000C )!=0x00000008 ) ;  //等待PLL作为系统时钟设置成功5 g' ]/ x% @! J& ^, {
  14. }
复制代码

# t& O( a) }3 o5 d: H   这个文件的函数就是真正配置时钟的过程,可以对照之前描述的配置时钟的过程来看这段代码。) v4 x9 ^# u7 e5 o
上一篇:
( Z* M  T- A( D: SSTM32学习笔记01—STM32F103环境搭建>>* r. ?+ ^, a+ [9 Y# }8 r
4 u7 J! k  D3 D. y- |
" t+ V- T, r4 g5 K1 T( w9 z

0 A  K( E2 B; G8 i
7 d0 N  r2 f' Q, u# [. |) L

9 K! ]; \2 G2 c' D( W
收藏 评论1 发布时间:2020-10-27 13:51

举报

1个回答
开发者 回答时间:2020-10-28 16:58:11
( h9 D+ Y5 u9 w: @1 K

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版