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

STM32F10x 时钟系统初学总结

[复制链接]
STMCU-管管 发布时间:2020-11-10 15:21
STM32F10x 时钟系统初学总结
1
时钟系统

7 a- l, ^5 |0 F" ]1 g- N6 _9 G: Z
1.概述) p: q# n# a% T/ e  w
  用通俗的话来说,时钟是单片机的“脉搏”,是单片机的驱动源,使用单片机中的任何一个外设都必须打开此外设相应的时钟。这样的好处是,在不使用某个外设的时候,关闭此时钟外设,从而可以降低系统的总功耗,进而节能,以实现低功耗的效果。
8 X* M5 s: O2 L! q  x  衡量“脉搏”强度的量为xx次/分钟,在单片机中衡量时钟强度的量叫做时钟频率,即 xx 周期/秒,就是我们常说的赫兹 Hz;脉搏(心跳)每跳动一次,就会将血液能量送往全身以供使用,脉搏越快,每分钟输送能量越大,耗能越快;相对应的时钟每发送一个时钟信号,单片机处理一条指令(或一条指令的一部分),频率越高,每秒钟处理指令越多,耗能相应越快。
+ O- G9 u( C. S9 v# }. o

4 k, S- {2 I+ W& a# J' m% c8 v( T2.原理
: q* x- e) }8 V9 ?% i  由时钟源(晶体振荡器等)产生时钟信号,该时钟信号经过分频/倍频后作为系统时钟,系统时钟经分频/倍频后作为各个外设的频率;在时钟信号发出后,单片机内部各部分收到了来自时钟的信号,执行指令(类似于触发器,由电平高低触发)。系统时钟,是处理器运行时间基准(每一条机器指令一个时钟周期)。这样每个时钟 tick 系统都会处理一步指令,这样使得工作一步一步,不会出现紊乱。所以频率越高,每秒钟处理指令数越多,速度越快。(此处为理想情况,不考虑其他外接设备造成的“木桶效应”)( V+ V3 z+ t( Q- q( \
  时钟是单片机运行的基础,时钟信号推动单片机内各个部分执行指令。以 Pentium 4 2.0 为例,它的工作主频为 2.0GHz,具体来说,2.0GHz 意味着每秒钟它会产生 20 亿个时钟脉冲信号,每个时钟信号周期为 0.5 纳秒。而 Pentium 4 CPU 有 4 条流水线运算单元,如果负载均匀的话,CPU 在 1 个时钟周期内可以进行 4 个二进制加法运算。这就意味着该 Pentium 4 CPU 每秒钟可以执行 80 亿条二进制加法运算。
  A5 I* A( }. |$ h9 ~' |

( P. s$ H. K7 J9 j3.STM32时钟概述
+ f: r$ w" m0 _! [4 x7 l; r% H  STM32 本身十分复杂,外设非常多,但是在我们实际使用的过程中往往不会用到所有的外设,如果将全部外设都开启,就会造成浪费,加大耗能;所以在实际情况下,STM32 的外设时钟是独立的,可以控制使能或除能,即“打开”需要用到的外设,不用的外设是默认“关闭”的。
/ N& u% p) }: h2 X  Q; E  使用任何外设都需要时钟才能启动,但是不同的外设所需要的时钟频率不同,都是用低速无法满足需求,都是用高速又会造成浪费。一个单片机内提供多个不同的系统时钟,可以适应更多的应用场合。不同的功能模块会有不同的时钟上限,因此提供不同的时钟,也能在一个单片机内放置更多的功能模块。对不同模块的时钟增加开启和关闭功能,可以降低单片机的功耗。并且,同一个电路,时钟越快功耗越快,同时抗电磁干扰能力也就越弱,所以较为复杂的 MCU 都是采用多时钟源的方法来解决这些问题。所以便有了 STM32 复杂的时钟系统和时钟树。主要的目的就是给相对独立的外设模块提供时钟,也是为了降低整个芯片的耗能。
" s& U& G3 z+ o# {
3 l/ b& }: p. M& ?9 @' A- {
2
STM32系统框图
11.png
: |( }. k1 r0 r% _图 1-stm32f10x 系统时钟框架图
12.png
     图 2-stm32f10x 系统时钟框架图-官方数据手册版

! b/ ]4 {. u; K- Z! t/ B1.时钟源
. M; @# G# W' l+ j   stm32f10x 时钟系统总共有四个时钟源:HSE、LSE、HSI、LSI 和 PLL,其中 PLL 是由时钟信号输入再进行倍频,间接产生时钟信号,另外四个时钟源为石英晶振或 RC 振荡器,直接产生时钟信号;芯片内的其他时钟都是通过以上五个时钟源分频或倍频得来;图 1 中为蓝色方块。1 }1 W1 l* ]7 I* [" r1 Q: T  ?
(1)HSE(External high-speed clock)
2 {2 [) l( c: _- t  HSE Osc,高速外部时钟信号,可接晶体/陶瓷谐振器,或者接外部时钟源,频率范围为 4MHz-16MZh;通常选用 8MHz 的晶振;" {' S; k* f% q* i. s6 V$ ~
(2)LSE(External low-speed clock)
  h! U8 @8 C" t4 r! R  LSE Osc,低速外部时钟,接频率为 32.768MHz 的石英晶体,为实时时钟或其他定时器时钟提供一个低功耗且准确的时钟源;
& P9 T" g% `: Y- i: g8 K
(3)HSI(Internal high-speed clock)
  A2 i, o- `  S& }7 k! j  HSI RC,高速内部时钟,RC 振荡器,频率为 8MHz,精度较于晶体/陶瓷谐振器较低。
. r# K- d* Q1 G* {, G' v4 r- Z
(4)LSI(Internal low-speed clock)
$ y3 _6 d0 {+ T$ [  LSI RC,低速内部时钟,RC 振荡器,频率为 40KHz,可以在停机和待机模式下保持运行。
7 c6 W* Z% z, i- I
(5)PLL(Phase Locked Loop)6 O" G: V5 e# x1 \
  PLL,锁相环倍频输出,时钟输入源可选择为 HSI/2、HSE 或者 HSE/2;可选择 16 种倍频 1-16;输出为锁相环倍频输出时钟(PLLCLK,最大 72MHz)。
3 {. \8 s1 Y2 a. T
2.选择器
) j* y( r. q( z3 l  stm32f10x 芯片时钟系统中,共有 5 个频率选择器:PLLXTPRE、PLLSRC、SW、MCO、RTCSEL,功能为从多个输入时钟源中选择一个作为选择器输出;图 1 中为灰色梯形
7 a( Y4 f* b. U; Z- E(1)PLLXTPRE(HSE divider for PLL entry)5 ~% v( i: H8 S- E( |3 ]5 b( T2 U8 c- H
   PLLXTPRE,HSE 分频器作为 PLL 输入;选择 HSE 不分频或 HSE 二分频输出到 PLLSRC。

; o/ [! X0 a2 @: ~  S7 L$ @(2)PLLSRC(PLL entry clock source)
" v  y& f5 n1 ]; k6 B   PLLSRC,PLL 输入时钟源,选择 HSI 经二分频或者 PLLXTPRE 输出时钟作为输出时钟到 PLL;
) p" b  r4 m# y  S
(3)SW(System clock switch)/ D' o7 @+ P8 `
   SW,系统时钟切换,选择 HSI 或 HSE 或 PLL 输出作为系统时钟;

( b2 z4 [* p3 k0 a- |4 c(4)MCO(Microcontroller clock output)
8 {  H7 t+ v2 e& [) l- z   MCO,微控制器时钟输出,选择不输出、系统时钟(SYSCLK)输出、内部 RC 振荡器时钟(HSI)输出、外部振荡器时钟(HSE)输出或 PLL 时钟 2 分频后输出。

: ?( i2 y* T; g! H# H# x+ F(5)RTCSEL(RTC clock source selection)
1 `* m; ^, e; z  v1 u# Y% m   RTCSEL,RTC 时钟源选择,无时钟、LSE 振荡器作为 RTC 时钟、LSI 振荡器作为 RTC 时钟、HSE 振荡器在 128 分频后作为 RTC 时钟。

# z8 a% p, Q$ [' S" I+ N& @' M3.(预)分频器/"倍频器"
1 H7 X" Z2 @$ D. ~9 o- B% B( O stm32f10x 芯片时钟系统中,可供设置选择分频系数的共有 5 个预分频器和 2 个倍频器;5 个预分频器:AHB prescaler、APB1 prescaler、APB2 prescaler、ADC prescaler、USB prescaler;2 个倍频器:TIM2,3,4 Multiplier、TIM1 Multiplier;功能是将输出时钟频率倍频或分频后输出;图 1 中为绿色方形。7 N3 b, J* N& j) d: [* _7 U
(1)AHB prescaler
- t1 ~; K& c! G   AHB prescaler,AHB 预分频,系统时钟(SYSCLK)作为输入经过分频后输出,输出作为 AHB 总线时钟(HCLK,最大 72MHz);分频因子为 1、2、4、8、16、32、64、128、256、512。
! q- O& b# b, ?1 q2 i% ?1 `# `
(2)APB1 prescaler(APB low-speed prescaler)$ f. Z& N3 @: t4 a
   APB1 prescaler,低速 APB 预分频,AHB 总线时钟(HCLK)作为输入经过分频后输出,输出作为低速外设总线时钟(PCLK1,最大 36MHz);分频因子为:1、2、4、8、16。
. X) H8 h4 U1 f+ r. E/ I
(3)APB2 prescaler(APB high-speed prescaler)+ r) f. @, H) m" W5 ?  e
   APB2 prescaler,高速 APB 预分频,AHB 总线时钟(HCLK)作为输入经过分频后输出,输出作为高速外设总线时钟(PCLK2,最大 72MHz);分频因子为:1、2、4、8、16。

0 V+ Y, t8 k) s. l(4)ADC prescaler
) F7 r' E  y/ `- {/ j   ADC prescaler,ADC 预分频,高速外设总线时钟(PCLK2)作为输入经过分频后输出,输出作为 ADC 时钟(ADCCLK);分频因子为:2、4、6、8。
. r+ X8 h2 C( t. E* [, H
(5)USB prescaler
( k7 w. `: T2 b' i  n   USB prescaler,USB 预分频,锁相环输出时钟(PLLCLK,48MHz 或 72MHz)作为输入经过分频后输出,输出作为 USB 时钟(USBCLK,固定为 48MHz);分频因子为:1、1.5;若 PLLCLK 为 48MHz 则分频因子选择 1,否则选择 1.5,保证分频后输出为 48MHz。

4 V; O( Q  I! _1 {2 E2 d) k6 @(6)TIM2,3,4 Multiplier8 R7 Z0 y% S( N5 q4 R
   TIM2,3,4 Multiplier,TIM2,3,4 倍频器,低速外设总线时钟(PCLK1)作为输出经过倍频后输出,输出作为通用定时器时钟(TIMxCLK);根据 APB1 预分频系数进行倍频,预分频系数为 1 则倍频系数为 1,否则为 2;
" a& g' g& G" K
(7)TIM1 Multiplier- F+ j# w# T( p1 z
   TIM2,3,4 Multiplier,TIM1 倍频器,高速外设总线时钟(PCLK2)作为输出经过倍频后输出,输出作为 TIM1 时钟(TIM1CLK);根据 APB2 预分频系数进行倍频,预分频系数为 1 则倍频系数为 1,否则为 2;

, v) d; O& r% G/ V附: S6 O1 z3 {9 c7 B5 ?
时钟安全系统

; e% Z6 ]3 D) P2 d stm32f10x 芯片时钟系统中,CSS 作为时钟安全系统,使用时钟监测器监测 HSE 时钟,如果 HSE 时钟发生故障,HSE 时钟将会被自动关闭,失效时间会被送入高级定时器并产生时钟安全中断 CSSI,同时时钟故障将导致系统时钟自动切换到 HSI 振荡器;CSS 作用就是监测 HSE 振荡器的正常运行,能够在 HSE 出故障时,及时调整系统时钟源保证系统正常运作;图 1 中为黄色方形。
% f6 G& C- S- t0 C/ L4 a+ ]

+ l8 K4 s& W7 d8 q" @* P3
STM32F10X时钟控制

8 U; q9 e, x8 G; z1.控制概述7 W! i. B( ^" K% i
  STM32F10x 芯片的时钟控制主要包括以下几个方面知识;系统时钟源的选择、系统时钟频率的配置、总线时钟的配置、总线设备时钟的使能/除能;
$ x4 y% Q% ?# ~5 q7 w4 j
  (1)系统时钟源的选择:系统时钟源为 SYSCLK,由 SW(系统时钟切换)选择时钟源来作为系统时钟 SYSCLK,可供选择的输入时钟有 HSE、HSI、PLLCLK(PLL 输出);
1 i% P6 g1 e$ Z) l+ p2 g4 t  (2)系统时钟频率的配置:选择 SW(系统时钟切换)的 3 个输入时钟源的其中一个的时钟频率作为系统频率;HSI 则是 HSI RC 的频率,通常为 8MHzLLCLK 作为系统时钟频率时,需要根据 PLLXTPRE 和 PLLSRC 两个选择器的输出经 PLL 倍频后作为系统时钟频率,通常为 8MHz;HSE 直接作为系统时钟频率使用相对较少;+ ?, o! e* l# I5 x# {. Y
和 SW 三个选择器和 PLL 倍频器来控制,输入时钟源经 PLL 倍频后输出作为 SW(系统时钟切换)的其中一项输入,再经过 SW 选择后作为 SYSCLK(系统时钟);

3 m0 k% D: Q4 ~4 b2 v   (3)总线时钟的配置:AHB 总线,输入时钟源 SYSCLK 经 AHB 预分频器分频后输出,输出为 HCLK,高性能总线供给时钟;APB1 低速外设总线,输入时钟源 HCLK 经 APB1 分频器预分频后输出,输出为 PCLK1,低速外设总线时钟;APB2 高速外设总线,输入时钟源 HCLK 经 APB2 分频器预分频后输出,输出为 PCLK2,高速外设总线时钟;
( N/ B( @* L( j, h6 ^+ @6 L   (4)总线设备时钟的使能/除能:主要是外设总线 APB1 和 APB2 的使能/不使能,时钟初始化默认是不使能,如果要使用外设,则需要打开外设对应的时钟;) t! q: T7 {- p9 D
   即在使用STM32F10x之前需要先进行时钟系统的相关配置,也就是时钟初始化,在工程文件中会在启动时进行一个默认的初始化SystemInit(),使用者在初始化完成后在进行所需的个性配置;默认配置是在启动时系统操作寄存器来进行配置,寄存器配置相对麻烦,所以在使用者进行个性化设置时,是使用库函数直接配置。
; P& ~7 [3 y+ H, b/ L2.时钟初始化
2 V& N5 A" H7 ]1 A* T+ o* c) b  初始化时钟系统时,在工程文件 system_stm32f10x.c 中通过 SystemInit()和 SetSysClock()两个函数进行初始化,使用的是寄存器操作的方法来初始化时钟系统;因为是直接操作寄存器,所以初始化过程非常复杂,以下是这两个函数的解析,仅供学习、参考用(以 STM32F103C8T6 为例);可跳过,直接看如何通过库函数配置即可。

' m5 i  R6 ~8 d% i$ V$ A   SystemInit(),启动芯片,将系统频率设置为8MHz,关闭所有外设;具体操作为:启动内部时钟源 HSI RC(8MHz)作为系统时钟、配置总线时钟预分频器和外设总线时钟预分频器、配置 ADC 预分频器和定时器预分频器/倍频器、微控制器时钟不输出、关闭 HSE Osc、关闭 CSS 时钟监视系统、PLL 不使能、配置 PLLXTPRE、PLLSRC、PLL 输出、USB 预分频、关闭时钟中断使能(LSI、LSE、HSE、HSI、PL 就绪中断使能)、清除中断标志位(LSI、LSE、HSE、HSI、PLL就绪)、清除安全系统时钟中断.
9 M0 `; z: S7 L. m3 e, ]7 x( q9 U' |+ ?4 ~; \3 r5 r+ y- I
总结

/ I* H" K/ I, |& C7 _# U# z! a

6 _; R0 Z* c2 Y8 `" k5 ^, V$ |+ T
01
常用寄存器
   AHBENR寄存器:DMA,SDIO等时钟使能;3 Q3 {6 E, ~6 C. q: @3 d
   APB1ENR寄存器:APB1总线上外设时钟使能;
: z; e8 s' [, K- v5 M   APB2ENR寄存器:APB2总线上外设时钟使能;# c: p* T5 G0 K3 J- J  [8 K
   CR寄存器:HSI,HSE,CSS,PLL等的使能和就绪标志位,因为有些时钟源刚使能完不一定能马上稳定,需要等一段时间,当稳定之后就会在该寄存器相应的位置位,通过查看寄存器的值就可以知道该时钟源是否已经稳定;/ |" U0 N0 P  ?2 K9 C% ?: x
   CFGR寄存器:时钟源的选择和分频系数的设定。2 S5 p" L# d4 t; _% o, k
* {/ a  ~& N- W3 ^- ]
02
常用库函数
  时钟使能配置函数:& m( E+ H; G$ n/ C7 G4 W$ ]( |% D
RCC_LSEConfig()、RCC_HSEConfig()、RCC_HSICmd()、RCC_LSICmd()、RCC_PLLCmd()
/ p) J- x5 V6 `# |. c
  时钟源相关配置函数:* h; c2 n5 P1 ]# N6 J; z
RCC_PLLConfig ()、RCC_SYSCLKConfig()、RCC_RTCCLKConfig()
) y; r& p. t/ o8 [- W# C
  分频系数选择配置函数:
  a! f/ y5 I+ f3 Y9 qRCC_HCLKConfig()、RCC_PCLK1Config()、RCC_PCLK2Config()

0 v! |& t8 F& H  外设时钟使能函数:
, ]4 q3 W4 m4 s# p3 n6 WRCC_APB1PeriphClockCmd()、RCC_APB2PeriphClockCmd()、RCC_AHBPeriphClockCmd();
3 F" H1 O- W7 A+ `
  其他外设时钟配置:" [' T4 h0 o* X8 u9 J
RCC_ADCCLKConfig ()、 RCC_RTCCLKConfig();
! y# S, g; z2 K5 J+ F! \, L, d
  状态参数获取参数:7 J7 u; @7 K$ {) s
RCC_GetClocksFreq()、RCC_GetSYSCLKSource()、RCC_GetFlagStatus()

: y$ r- {8 B+ Y  RCC中断相关函数 :+ P' I5 U3 c! X6 L, j# r& ]
RCC_ITConfig()、RCC_GetITStatus()、RCC_ClearITPendingBit()
9 y- R  X' {. M0 ^. p$ ]
. _( `2 }6 W4 M  [; |% e
5 o; j, E! f) Y6 e
9 ?; @1 F0 ]  I0 b! J( R  T" N7 s
写在最后
STM32的时钟系统确实是很复杂,不仅有倍频,分频,还有一系列的外设时钟开关。倍频是考虑到了电磁兼容性,如果外部直接提供一个72MHz的晶振,太高的震荡频率会给电路板的制作带来一定的难度。分频则是因为STM32既有高速外设,也有低速外设,各外设的工作频率不相同,需要分开来管理。最后,每个外设时钟还有自己独立的开关(在图上可以看到,在外设时钟之前需要经过一个与门,这就是它们的开关)在我们不使用该外设时,需要把时钟关闭以减少STM32的功耗。3 i4 L! P5 T. X2 ^& {3 c
  STM32为了实现低功耗,将所有的外设时钟都默认设置为不使能(disable),用到什么外设,只要打开对应外设的时钟就可以,其他的没用到的可以还是不使能(disable),这样耗能就会减少,这就是为什么不管你配置什么功能都需要先打开对应的时钟的原因。1 c/ q& x, D% l( |0 b  I5 [: _0 o4 y
2 k1 U0 A; V; O2 ^( |
文章出处:AI Robot Studio
6 x, t: p6 A$ c* d' f8 A5 D& U) A" D  H9 d. S) q( s; C
. v$ G1 R& Q' C5 E: B2 D2 b) n+ {
赞 收藏 评论0 发布时间:2020-11-10 15:21

举报

0个回答

所属标签

相似技术帖

官网相关资源

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