找回密码
 注册
关于网站域名变更的通知
查看: 590|回复: 1
打印 上一主题 下一主题

送给新手:STM32的时钟树解析

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2015-11-12 09:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
STM32的时钟树/ [6 {5 H& J' r$ W$ z! j4 M( @9 w
         对于广大初次接触STM32的读者朋友(甚至是初次接触ARM器件的读者朋友)来说,在熟悉了开发环境的使用之后,往往“栽倒”在同一个问题上。这问题有个关键字叫:时钟树。+ Q; @( T: ?3 O) B
   众所周知,微控制器(处理器)的运行必须要依赖周期性的时钟脉冲来驱动——往往由一个外部晶体振荡器提供时钟输入为始,最终转换为多个外部设备的周期性运 作为末,这种时钟“能量”扩散流动的路径,犹如大树的养分通过主干流向各个分支,因此常称之为“时钟树”。在一些传统的低端8位单片机诸如 51,AVR,PIC等单片机,其也具备自身的一个时钟树系统,但其中的绝大部分是不受用户控制的,亦即在单片机上电后,时钟树就固定在某种不可更改的状 态(假设单片机处于正常工作的状态)。比如51单片机使用典型的12MHz晶振作为时钟源,则外设如IO口、定时器、串口等设备的驱动时钟速率便已经是固 定的,用户无法将此时钟速率更改,除非更换晶振。
" K* @) `- g% d6 T         而STM32微控制器的时钟树则是可配置的,其时钟输入源与最终达到外设处的时钟速率不再有固定的关系,本文将来详细解析STM32微控制器的时钟树。图1是STM32微控制器的时钟树,表1是图中各个标号所表示的部件。
5 @4 x/ D; W5 r; C. v/ J* F标号            图1标号释义2 a- S. Z- ?2 t: v! c$ |
1     内部低速振荡器(LSI,40Khz)' e" }* p8 e' {, y) p
2     外部低速振荡器(LSE,32.768Khz)2 s0 @. K0 g5 C8 @( w
3    外部高速振荡器(HSE,3-25MHz)
8 f; |6 ~% H7 y# T4    内部高速振荡器(HIS,8MHz)
. z; H/ L2 \# K1 B' h6 u. Q/ p5    PLL输入选择位
, T& B& s/ c9 [, U+ j6    RTC时钟选择位
5 }& t5 k7 g0 }, O  ^) P8 L  E7    PLL1分频数寄存器
6 D5 g/ T" E6 x4 p% ]* o. E8    PLL1倍频寄存器
% x' ]8 z3 Y$ P$ c9    系统时钟选择位
# M2 v  g. t, l0 n10            USB分频寄存器
* Q/ z" Q) G( h  j* R11            AHB分频寄存器
- `  [) p8 B/ X/ m  K5 I3 G12            APB1分频寄存器7 s5 x' O9 ?, Y) e, x, V2 a* F; o8 g
13            AHB总线1 M1 Z! W* e# G
14            APB1外设总线
5 T" _5 i* N% U$ i% t15            APB2分频寄存器9 S% t( R" \3 r' _  [  h& T* w
16       APB2外设总线! B' D9 w& J7 b" P' n) M. U
17            ADC预分频寄存器
. ^# U# L2 z2 x5 P+ l& e# N18            ADC外设; N- Z. _8 R, ]
19            PLL2分频数寄存器
' j' \, R& U2 L/ {20            PLL2倍频寄存器" U' ~1 I' H  k: q
21            PLL时钟源选择寄存器
- C5 i3 t4 t$ {2 {3 u9 `. p2 l" ^22            独立看门狗设备0 k5 g( G* A' w6 S( V9 C
23       RTC设备
0 b6 y$ d  T3 b  uSTM32时钟树.jpg
2 {. A! C6 X2 K, Y& b- I# g图1  STM32的时钟树- B. e* ~/ t# N
   在认识这颗时钟树之前,首先要明确“主干”和最终的“分支”。假设使用外部8MHz晶振作为STM32的时钟输入源(这也是最常见的一种做法),则这个 8MHz便是“主干”,而“分支”很显然是最终的外部设备比如通用输入输出设备(GPIO)。这样可以轻易找出第一条时钟的“脉络”:
$ @! m$ F/ |- Q3——5——7——21——8——9——11——135 f& g* o: b6 ?: {1 d
对此条时钟路径做如下解析:
- q  J- N$ ^) ?( R$ ^& b对于3,首先是外部的3-25MHz(前文已假设为8MHz)输入;
9 Q# U. L/ B4 m6 ^4 A( \+ Z对于5,通过PLL选择位预先选择后续PLL分支的输入时钟(假设选择外部晶振);
2 C1 @0 R! T& k' Q" j% I2 o对于7,设置外部晶振的分频数(假设1分频);
( n/ y' H0 J$ {! t对于21,选择PLL倍频的时钟源(假设选择经过分频后的外部晶振时钟);- R; z7 L) g7 [( s+ l3 d
对于8,设置PLL倍频数(假设9倍频);# @2 Z5 f5 `$ T/ j/ I
对于9,选择系统时钟源(假设选择经过PLL倍频所输出的时钟);3 m9 _- ]# D/ u% V0 g" i, k
对于11,设置AHB总线分频数(假设1分频);5 C- S4 G8 I6 R5 L1 T* p3 ~
对于13,时钟到达AHB总线;" M; s* `8 [' q, ?' f) _
在上一章节中所介绍的GPIO外设属于APB2设备,即GPIO的时钟来源于APB2总线,同样在图1中也可以寻获GPIO外设的时钟轨迹:; L/ X: a0 q3 c$ \* ~
3——5——7——21——8——9——11——15——16, h4 T. [. {' ^# c# H+ F
对于3,首先是外部的3-25MHz(前文已假设为8MHz)输入;
, {% L) ^! s0 |/ C# `对于5, 通过PLL选择位预先选择后续PLL分支的输入时钟(假设选择外部晶振);6 r' {) e2 J0 t/ k
对于7,设置外部晶振的分频数(假设1分频);4 d2 V$ s# y/ S9 ]& B. \
对于21,选择PLL倍频的时钟源(假设选择经过分频后的外部晶振时钟);, T7 r; P' R- ^  L
对于8,设置PLL倍频数(假设9倍频);' r+ A# o! z  z; v1 i  h3 B7 F
对于9,选择系统时钟源(假设选择经过PLL倍频所输出的时钟);
% g# B7 C' w, t" _对于11,设置AHB总线分频数(假设1分频);
$ k5 H  D% j7 [/ \' O" _对于15,设置APB2总线分频数(假设1分频);
  d1 \% c% L3 p/ D0 h' C对于16,时钟到达APB2总线;
7 p: K) f; ^3 X& ~! m2 R现在来计算一下GPIO设备的最大驱动时钟速率(各个条件已在上述要点中假设):
% u7 C6 y9 N1 u1 i" y% x- r+ w1)   由3所知晶振输入为8MHz,由5——21知PLL的时钟源为经过分频后的外部晶振时钟,并且此分频数为1分频,因此首先得出PLL的时钟源为:8MHz / 1 = 8MHz。" L. i" G  M4 _( q; j( d' o; x2 j
2)   由8、9知PLL倍频数为9,且将PLL倍频后的时钟输出选择为系统时钟,则得出系统时钟为 8MHz * 9 = 72MHz。
) W$ n6 l1 K/ }, |' M3)   时钟到达AHB预分频器,由11知时钟经过AHB预分频器之后的速率仍为72MHz。: k$ o; P+ o* n7 M0 |* q7 V* f
4)   时钟到达APB2预分频器,由15经过APB2预分频器后速率仍为72MHz。" V) R. T  I) i0 L8 ^/ \
5)   时钟到达APB2总线外设。9 p! C8 q, i1 |2 a
因此STM32的APB2总线外设,所能达到的最大速率为72MHz。依据以上方法读者可以搜寻出APB1总线外设时钟、RTC外设时钟、独立看门狗等外设时钟的来龙去脉。接下来从程序的角度分析时钟树的设置,程序清单如下:9 E5 x) [/ m" ~( e7 p
void RCC_Configuration(void)# ~: @3 {- t% f9 \3 ~( w3 [* w
{9 N& _( s+ `& z! v/ {+ h
        ErrorStatus HSEStartUpStatus;                                                                                                     (1)
6 ]1 p1 b" Q0 ?3 w        RCC_DeInit();                                                             (2)
: j! A0 }+ t& ?( f9 o! Q        RCC_HSEConfig(RCC_HSE_ON);                                                                                                   (3)
  Y8 C8 I9 D. n2 Z        HSEStartUpStatus = RCC_WaitForHSEStartUp();                                                                     (4)
( j3 ?$ b! p% i& T, F3 b5 D        if(HSEStartUpStatus == SUCCESS)                                                                                                (5)
  N! x1 H7 e- ~" t$ `        {
* \# X9 e1 ?+ Z9 _5 I( Z                   RCC_HCLKConfig(RCC_SYSCLK_Div1);                                                                              (6)
+ T3 _, R& S" o8 O                     RCC_PCLK2Config(RCC_HCLK_Div1);                                                                               (7)+ g5 W+ W- Z+ y! G
                     RCC_PCLK1Config(RCC_HCLK_Div2);                                                                                (8)& ^, Y, c, w) j8 n# w
                    FLASH_SetLatency(FLASH_Latency_2);                                                                             (9)* e! H; f2 F( V
                    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);                                      (10)
* @! k+ {4 m4 w1 q: q% Z6 D+ S                  RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);                                         (11)& m: y3 f! f6 p6 b
                  RCC_PLLCmd(ENABLE);                                      (12)$ `. g. a1 T5 C3 J. N7 |: d
                  while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);                                                       (13)/ o0 g% Y5 G! d6 V, f- e
                  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);                                                               (14)7 f1 O, Z' M5 F3 b9 [) K
                  while(RCC_GetSYSCLKSource() != 0x08);                                                                               (15), D& j5 w- }0 G$ K" ^( `) W
        }
0 O' S% h$ E. \1 ^

该用户从未签到

2#
发表于 2016-6-4 15:48 | 只看该作者
学习中,谢谢分享
- I9 V! S% ?* ?$ c2 O
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-23 21:02 , Processed in 0.156250 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表