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

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

[复制链接]
STMCU-管管 发布时间:2020-10-27 13:51
STM32学习笔记02—时钟树架构

1 k" N3 J: r) r3 ]( K4 O2.1 时钟树结构图+ K/ H9 i$ f6 s  y& j
       STM32属于Cortex-M3内核的单片机,时钟结构比之前的51单片机较复杂的多,根据数据手册,STM32F103的时钟结构如下图所示。
0 \; l) Q  F7 E3 X, T9 ~& L
1.png
    根据上图可以看到,STM32F103系列单片机具有4个时钟源,内部的8MHz时钟发生器,外部的晶体振荡器接口,最高支持16MHz,外部的32.768kHz晶体振荡器接口和内部的40kHz时钟发生器,其中32.768kHz和40kHz主要用于内部RTC时钟脉冲,8MHz的晶振通过PLL时钟倍乘器,将系统总线时钟提高为72MHz。
" X) x6 [& L- c. [5 T. ?* `  m  J8 e1 A/ o2 j9 {" ]; e. O

/ |1 c- N6 O4 i6 [. b       STM32F103系列内部具有2条外设时钟总线,APB1和APB2,其中APB2的时钟最高可达72MHz,APB1的时钟最高可达36MHz,通过配置对应的寄存器,就可以将CPU内核时钟提高到最大速度。
+ _8 v/ g) v/ G2 z- y2 f0 B5 M/ F$ w7 C; g! r! ?6 }% z# n, h
1 p3 L; z8 H1 v/ v
       通过最小系统可以看到,我们使用外部高速晶体振荡器接口,外接8MHz晶振,RTC则是使用32.768kHz晶振,现在我们来通过数据手册来配置对应的寄存器位来配置APB2时钟达到72MHz,APB1时钟达到36MHz。
" n" P0 C! z; {: x" ]0 R# S: 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.png
       上图是ST公司推出的一款软件,这款软件可以自动生成寄存器代码,但是我们在这里只用到其中提供的时钟配置功能,通过上面的时钟结构,我们可以得到配置时钟的大概流程。
; d" I3 W- m$ _+ b
/ v) y2 D" P  u4 Z3 H' ~& r* Z8 N

9 p  u  _6 P) G% b) g* C2 D2.2.1 时钟配置流程
3 w2 D) z4 D2 v(1)开启HSE时钟接口,这个接口用于使能晶体振荡器输入端;
  G4 Z4 I- U! Q4 }- P
: q& o) E8 X6 e- b) n$ t! _: e0 ?( H

! }% M2 I0 s8 o* C9 \(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

# R4 \+ K- }# `+ G# L& r
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( {

7 ?$ p+ C( N4 E(5)设置APB2时钟总线的分频系数为1。
# P/ q' k' q5 r7 G# p2 O* z3 M' ?6 \0 Y; I

- H7 x. j$ [. G) ^) T0 D: y7 I2.2.2 相关寄存器- X) p& H1 e0 F2 d" v9 \! |
(1)时钟控制寄存器:RCC_CR8 \, q. y  n" Y% Z
3.png
Bit 25:PLL准备状态( Z- k7 Q6 \0 Q- h! j+ |

2 g% v9 }0 ^, ]* R' P

: t9 k/ W5 \* V& |5 d$ H$ ?1 \; X              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

& c7 T! `* Y. ~8 V
( 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

/ r5 ]" v! O5 i              0:PLL关闭
& H7 @* k# k# @1 J- J              1:PLL打开
' n# U, j/ y4 M8 Z
, B( R! k# s* |5 M1 S- N, H
8 \! X. n4 L$ U# Q/ G2 ^3 l/ x
Bit 19:时钟安全系统开关
  c7 B' w8 i) R: ~4 Q( V, O( H; J+ F0 }; U$ A. \- s

' D! F. E& Q! ]3 g1 ?! w: X              0:时钟保护关闭; w. \8 `! {6 }8 Z
              1:时钟保护打开
  a8 j. L' L. z# U/ a% L
% L- K" I0 ^+ i8 m

- |1 F1 H; |( A3 g: x7 p7 D( ?Bit 18:HSE旁路(禁用HSE振荡器时才能写入)
+ Y3 D0 H" X; E9 M0 i0 ]
! Z$ _' }8 F: }5 m
5 ^" r; ]+ k- K9 |
              0:HSE禁止旁路3 [6 ?; R  ^( i& X! ]
              1:HSE打开旁路
8 C- T; Y/ T& Z4 E4 [8 W' @. O  ~6 r, y

% U2 O$ @! Q1 L6 {6 n( pBit 17:HSE准备状态
' a2 I6 h% m8 V) b3 r2 N
4 Q4 V" B5 i) ?9 Y
5 J% n- q' d6 N
              0:HSE未准备好
' ~) {; e3 f; ]6 E* R: P( f! S, u              1:HSE准备完毕
* ]6 R/ _/ v8 C6 W0 A
3 G5 R" k# s6 \* f+ C$ _9 h1 P  Q

9 ^8 W8 p" m8 m8 O/ E  r: VBit 16:HSE时钟使能. d+ ^  |' |  ]# L0 G
+ X4 y6 q; Y  E% K5 M+ D8 ~

4 _7 Q1 A2 f2 |5 B. }              0:HSE时钟关闭
6 e- M0 U  c$ P! L; h              1:HSE时钟打开
% L! H7 P! |6 s9 y/ r9 X1 {- v- a. }/ s% G, K3 G
) o* s) y1 u, J  K  x' R, T
Bit 15~ Bit 8:HSI校准值(这个值在启动的时候自动初始化)
7 }4 H/ j5 H0 C! O1 q( j- ]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

: F' q: B: E8 b  }- H

& r; k7 M% v* u8 a2 {7 yBit 1:HSI准备状态. f( R9 Y% i( S

/ t0 V  ]5 }8 ^( a
+ x% B2 N$ @/ y
              0:HIS未准备好
3 L. u' t9 ~0 n              1:HSI准备完毕
2 K* ~; \7 W3 [  C4 e' j. n7 G1 W2 u4 n. z3 F, n

- [. ?" S9 R' b. A& gBit 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
/ N5 w5 q1 u9 v" G: l8 R9 O
4.png
Bit 26~Bit 24:芯片时钟输出
  p9 {% p& V$ X  r9 `- Y+ X) S4 w9 C1 ?( V# D8 x( Z% i6 T4 {8 \4 K
3 ?  A' O( X$ ^% W! {$ W5 r0 g
              0xx:禁止输出
& ]  ]# G8 M) ~: g' p2 l; m              100:选择系统时钟SYSCLK
) s" s0 F+ y1 r1 R/ O              101:选择HSI时钟( u3 z  G, I, @1 q4 J
              110:选择HSE时钟
' m1 G) C$ @, y# ?  ]              111:选择PLL分频输出(2分频)6 N# P# u( m5 k8 f

; q, g  t; Q, y* A8 b3 v9 S1 i
3 F+ z/ s: t; G5 i0 j9 t
Bit 22:USB时钟分频系数: f" W; |4 e3 e
3 |) Y) [- v( Q+ o9 T; P

' j) @& @9 s" x              0:PLL时钟1.5分频作为USB时钟
2 t0 X$ e" F" |! H! c; L# t  ~' ?              1:PLL时钟不分频作为USB时钟7 J$ r) n, J. Z

. J5 `, |; T2 _7 B+ R- g" |
  v0 q1 ~  |4 y+ ^
Bit 21~Bit 18:PLL倍频系数
4 R' Z5 q6 t4 M
$ n0 U2 C$ I; c1 t

# c- z1 j, Y5 w  [0 U/ c              0000:2倍频
, s7 y, d2 p; |4 a6 c8 q0 G. ~              0001:3倍频
( }6 V( z0 J" ~: d0 u6 d: A6 }              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倍频
0 `9 C+ a& t5 H- H: b# v: \              0110:8倍频
. @. r8 p5 u$ S* U. j) S              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倍频
# B3 g4 F8 z: x8 f# f              1110:16倍频! N. O8 o# [7 e4 U  r& U
              1111:16倍频8 ?$ f) Q# V0 `* s3 K

* N  D7 {3 l; D' l6 z
" ^3 }) Q1 K- T6 H
Bit 17:HSE输入分频器0 K* A/ k" D' u

9 l' q8 w& F5 T3 W; z/ M1 Z

9 C, @: @3 s7 @3 x5 e, z  a% d* m              0:HSE输入不分频
( W1 K" B7 @, Z* t, ~) @              1:HSE输入2分频; U! |/ o+ K& t5 ?' ]
, J( N; E5 J0 `. R4 I
3 d9 [; A1 ^+ F1 b" d, g2 ~
Bit 16:PLL时钟选择(PLL处于禁止模式才能写入)
8 p8 I& d) x3 f) U) v7 T; r' h; C- t. ^" U9 a/ b- T$ Z1 ~4 x) r
) G& o' f2 Y9 B, o( s
              0:HSI时钟2分频作为PLL时钟输入
# N/ ~. ]' Q) h5 r              1:HSE作为PLL时钟输入
- g) B$ {0 p* }& E0 _6 D; 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
6 Q/ b( l! X( R% i6 l7 A! I              10:PCLK2分频系数为6, z, `& e9 }& ?2 a
              11:PCLK2分频系数为8
8 C5 E. M9 r; ^; z3 E  F
, K- {: ~' {) A  g/ I& d
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

+ P* ?, {+ n( x/ [. |0 ]8 ]              0xx:HCLK不分频, w. C  J7 Q; G' h! [" U
              100:HCLK分频系数为2
7 h6 X: {0 P  f              101:HCLK分频系数为4  L: G) I1 b# e9 F( _
              110:HCLK分频系数为82 p" M+ F0 X! |) _
              111:HCLK分频系数为16
1 B- u4 X7 x: v# A  B, 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不分频
  e% i( a* q- V              100:HCLK分频系数为2
+ d( D9 X4 Q% ~, L: B              101:HCLK分频系数为4
% ~4 l! F1 t5 |6 t4 e9 s              110:HCLK分频系数为8
9 O3 T8 Y) a# ?/ k              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

9 F* ?# }8 d8 K3 G5 S9 J( X              0xxx:SYSCLK不分频
8 ^' F9 J4 f6 v! W              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

7 {2 J' |5 w/ D4 \Bit 3~Bit 2:系统时钟选择状态
/ U) m; M: b8 K* B2 ^9 e
( J! B6 B4 g3 l- B
7 b2 [( F7 I9 K& Z6 ]2 u8 B1 @
              00:HSI作为系统时钟' x, J: M: r9 B
              01:HSE作为系统时钟
' r% k0 C( Q1 }/ D0 Q# u0 T$ q              10:PLL作为系统时钟
$ z4 f% n0 y/ Y5 a7 Y5 c5 L              11:保留
' V' R/ Q/ M( A/ e, G$ M( c. N! R1 G( |- T% Q" w: C, V2 V1 ^! E
. [" C! q+ _. T  Z4 q
Bit 1~Bit 0:系统时钟选择
7 j4 h( x6 `5 P3 P, v- v3 B4 Z7 [6 w- _# }  D, Q9 w* N

0 H& L  p) W' u              00:选择HSI作为系统时钟& e0 d! I: x; W" A! q: [8 M7 ]
              01:选择HSE作为系统时钟
: f6 l( Z/ v: V6 L/ L/ {1 ^& L  s              10:选择PLL作为系统时钟
& C) r' |9 E# Q& W3 E              11:保留- W2 Q* g: w( h* |
) d; F+ A0 z$ u4 g  D3 q# H! Y2 U
" @) l' ]* P) r# J8 H
2.3 设置例程
1 ^) m6 x4 n2 D5 C. e# }) G* _: Z( ~$ K* T  g( _) m
配置STM32的时钟需要创建几个文件,这几个文件如下表所示。
/ U' l6 u4 k# h( z
5.png
(1)创建上述三个文件,其中c文件添加进工程中,h文件包含进程序中,如下图所示。0 K7 h1 }2 I2 ~! {
6.png
7.png
(2)stm32f103x.h文件输入以下内容:
7 \2 e; U8 o& v7 |
8.png
    这个文件用于定义程序用到的所有寄存器的地址和结构体,是整个STM32程序的最基础的文件。
0 W) C3 ?5 m; e: i" o" `8 ]  N
- m2 V8 Y6 ^4 M/ T' x( J
' k, `' D- Q4 F2 |; o
(3)sys.h输入以下内容
$ d( l) i( I0 ?6 Z: {- l: @
9.png
    sys.h文件用于定义STM32的时钟配置和中断配置,以及后面的端口位操作模式。
' @9 t. R9 w$ [6 S* U  ]/ o/ {- y# [4 }# E

7 q# g+ L7 x- u. |9 X
2 v7 d2 a0 }% ?1 q# C4 R+ C& K2 ^(3)sys.c文件输入以下内容5 H: K! u- }0 u& W$ s
  1. void STM32_Clock_Init( u8 PLL )+ x  U) p* Z0 a3 U
  2. {
    ) z, h/ ?( g0 {
  3.    RCC->CR |= 0x00010000 ;              //外部高速时钟使能HSEON
    # D5 o! C5 t/ C; U# c6 i
  4.   while( !( RCC->CR>>17 ) ) ;              //等待外部时钟就绪. u5 Q2 g) s" f
  5.   RCC->CFGR = 0x00000400 ;            //APB1=DIV2;APB2=DIV1;AHB=DIV1;
      A' M! A9 \& F% [4 m0 t
  6.   PLL -= 2 ;                    //抵消2个单位(因为是从2开始的,设置0就是2)
    9 b$ P: Z9 e$ }
  7.   RCC->CFGR |= ( u32 )PLL<<18 ;            //设置PLL值 2~16
    ( o- A3 x3 p% J* Y
  8.   RCC->CFGR |= 1<<16 ;              //PLLSRC ON
    , `6 q5 P4 G! z  T
  9.   FLASH->ACR |= 0x32 ;                //FLASH 2个延时周期
    8 c3 t' Y6 a( P$ \4 d" x8 S; Q& V3 S$ Y
  10.   RCC->CR |= 1<<24 ;                //PLLON
    8 n$ B9 @# d  j( T7 o. [
  11.   while( ( RCC->CR&0x02000000 )!=0x02000000 ) ;    //等待PLL锁定
    4 L; I4 r0 c* p: K* e! y
  12.   RCC->CFGR |= 0x00000002 ;            //PLL作为系统时钟
    1 k# X- y& s/ I
  13.   while( ( RCC->CFGR&0x0000000C )!=0x00000008 ) ;  //等待PLL作为系统时钟设置成功
      K2 ?  m- A. `5 u
  14. }
复制代码

6 a8 x, @0 R- `1 a: X' |  F   这个文件的函数就是真正配置时钟的过程,可以对照之前描述的配置时钟的过程来看这段代码。
2 i' o, ?* A- X0 ~6 m上一篇:
+ y0 F5 _  I! T$ o/ K3 oSTM32学习笔记01—STM32F103环境搭建>>' |' `+ d* [/ u1 f+ a1 Z0 v. ?
  ?+ M3 I! t5 Q# X& L: U
6 I. q; h- k3 c! B/ l( W$ {

# {3 i( U- @5 x# {

) k  S" ]; r9 V/ s. [: o7 e4 D
5 k8 N: O, i6 G9 A7 _! N+ ]
赞 收藏 评论1 发布时间:2020-10-27 13:51

举报

1个回答
开发者 回答时间:2020-10-28 16:58:11
' u' a7 a5 }7 r$ Z
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版