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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
STM32的时钟树6 P( Y/ {1 q. {5 ^
         对于广大初次接触STM32的读者朋友(甚至是初次接触ARM器件的读者朋友)来说,在熟悉了开发环境的使用之后,往往“栽倒”在同一个问题上。这问题有个关键字叫:时钟树。
8 h3 E# O) i4 A2 |   众所周知,微控制器(处理器)的运行必须要依赖周期性的时钟脉冲来驱动——往往由一个外部晶体振荡器提供时钟输入为始,最终转换为多个外部设备的周期性运 作为末,这种时钟“能量”扩散流动的路径,犹如大树的养分通过主干流向各个分支,因此常称之为“时钟树”。在一些传统的低端8位单片机诸如 51,AVR,PIC等单片机,其也具备自身的一个时钟树系统,但其中的绝大部分是不受用户控制的,亦即在单片机上电后,时钟树就固定在某种不可更改的状 态(假设单片机处于正常工作的状态)。比如51单片机使用典型的12MHz晶振作为时钟源,则外设如IO口、定时器、串口等设备的驱动时钟速率便已经是固 定的,用户无法将此时钟速率更改,除非更换晶振。
. z9 Y- m6 ?# S( d) u+ I         而STM32微控制器的时钟树则是可配置的,其时钟输入源与最终达到外设处的时钟速率不再有固定的关系,本文将来详细解析STM32微控制器的时钟树。图1是STM32微控制器的时钟树,表1是图中各个标号所表示的部件。
6 h5 @- a% [8 t标号            图1标号释义. ]! c3 j6 `3 E% U& T
1     内部低速振荡器(LSI,40Khz)
2 Z* p. Y- L$ C3 ~: v- L; h2     外部低速振荡器(LSE,32.768Khz). B" W5 Y4 M. c$ E/ b6 W. d
3    外部高速振荡器(HSE,3-25MHz)
9 u2 h" Z; `( d; ^6 E4    内部高速振荡器(HIS,8MHz)
0 }- y  w) i5 I9 Z0 P+ S1 d5    PLL输入选择位: |+ V+ q4 b7 \) p
6    RTC时钟选择位
1 J; u: M4 q8 T0 ^8 ?& D1 n7    PLL1分频数寄存器
( Q/ E  [7 c2 f( y8    PLL1倍频寄存器
6 w0 L' S/ B8 ~9    系统时钟选择位1 c; w7 v2 w% O9 z) Y
10            USB分频寄存器
7 l+ ~: p6 ?9 \7 w11            AHB分频寄存器0 O- l3 {/ `' |, t
12            APB1分频寄存器2 V9 o( q5 s; X$ @2 j
13            AHB总线
: w/ W  z/ `  A+ O& v9 R" t5 f14            APB1外设总线
( {$ B$ {1 P$ l8 x15            APB2分频寄存器
" M; t3 s8 Y. d; f+ `3 j5 M; V5 l16       APB2外设总线
+ W$ d3 s3 v& q+ M) M, B6 j4 w17            ADC预分频寄存器
( u" P1 K  p7 E  m3 Z* A5 D18            ADC外设: b2 r2 `% T: z5 R' R' q1 J
19            PLL2分频数寄存器$ M' ?  H0 i: S" x% Z/ n
20            PLL2倍频寄存器
8 I* p: m' l/ @7 ^5 ^: [21            PLL时钟源选择寄存器
0 \4 F! f& T( H& [6 K& L22            独立看门狗设备
# k# x5 b# D" @4 V9 Q6 T23       RTC设备
" J- S3 p) t6 I: q6 P/ [STM32时钟树.jpg$ t6 \$ g( ~  H$ w( V; K5 ^; Q( ^
图1  STM32的时钟树4 s. {' L' p  ~7 `6 N  a4 |+ F
   在认识这颗时钟树之前,首先要明确“主干”和最终的“分支”。假设使用外部8MHz晶振作为STM32的时钟输入源(这也是最常见的一种做法),则这个 8MHz便是“主干”,而“分支”很显然是最终的外部设备比如通用输入输出设备(GPIO)。这样可以轻易找出第一条时钟的“脉络”:
  n3 }( z, I+ r3——5——7——21——8——9——11——13
% U/ s/ ~6 \0 Q" j  X+ n- o对此条时钟路径做如下解析:
" w4 O* ?0 b, q对于3,首先是外部的3-25MHz(前文已假设为8MHz)输入;
, {% W/ Y' c  Z( w8 K* z  ~1 }  L- M对于5,通过PLL选择位预先选择后续PLL分支的输入时钟(假设选择外部晶振);( v' V- B7 Q( P8 }% M
对于7,设置外部晶振的分频数(假设1分频);
, |0 _1 n6 j, }# z对于21,选择PLL倍频的时钟源(假设选择经过分频后的外部晶振时钟);! s. q# P5 p( Z) b
对于8,设置PLL倍频数(假设9倍频);9 ]3 f: R3 O+ C
对于9,选择系统时钟源(假设选择经过PLL倍频所输出的时钟);+ s  O6 g+ Z' ]
对于11,设置AHB总线分频数(假设1分频);
4 A5 t9 f5 q: V; L对于13,时钟到达AHB总线;
- q) ~  X7 {; x- s3 D在上一章节中所介绍的GPIO外设属于APB2设备,即GPIO的时钟来源于APB2总线,同样在图1中也可以寻获GPIO外设的时钟轨迹:
7 a8 }4 A% ?% K8 `4 B3——5——7——21——8——9——11——15——16
3 V, z& j! O8 G0 _/ t" r( e对于3,首先是外部的3-25MHz(前文已假设为8MHz)输入;# @, W4 B; B1 w$ l- _, c  o$ \- ]
对于5, 通过PLL选择位预先选择后续PLL分支的输入时钟(假设选择外部晶振);% M8 n5 Q9 q% M/ B
对于7,设置外部晶振的分频数(假设1分频);
% x( S6 I% Y& m/ P9 D$ G" k对于21,选择PLL倍频的时钟源(假设选择经过分频后的外部晶振时钟);
) @3 [7 N) f- [8 ~' j, Z) t对于8,设置PLL倍频数(假设9倍频);9 p9 T4 W. M. V' c7 |; }
对于9,选择系统时钟源(假设选择经过PLL倍频所输出的时钟);
$ j9 {% [: }7 _8 A0 D% `" J- k, y" D对于11,设置AHB总线分频数(假设1分频);
) e6 a* o# L" D- E# Y9 {2 P7 u$ @对于15,设置APB2总线分频数(假设1分频);
5 a% @2 x6 G- p8 c8 j' s对于16,时钟到达APB2总线;
' E8 w8 \* T: z: G- a5 v现在来计算一下GPIO设备的最大驱动时钟速率(各个条件已在上述要点中假设):
; ^# g7 S. n) d! ]- Q1)   由3所知晶振输入为8MHz,由5——21知PLL的时钟源为经过分频后的外部晶振时钟,并且此分频数为1分频,因此首先得出PLL的时钟源为:8MHz / 1 = 8MHz。
6 C. R, B; V' f: Z  h- x! H2)   由8、9知PLL倍频数为9,且将PLL倍频后的时钟输出选择为系统时钟,则得出系统时钟为 8MHz * 9 = 72MHz。
/ ^! \) }- e7 O! v3)   时钟到达AHB预分频器,由11知时钟经过AHB预分频器之后的速率仍为72MHz。' }2 Q$ ?" P$ O. |: L0 e3 V
4)   时钟到达APB2预分频器,由15经过APB2预分频器后速率仍为72MHz。
! Q$ ~* f7 L. |7 [5)   时钟到达APB2总线外设。
3 v& G" o; I% X1 G& m6 \9 r+ P( o因此STM32的APB2总线外设,所能达到的最大速率为72MHz。依据以上方法读者可以搜寻出APB1总线外设时钟、RTC外设时钟、独立看门狗等外设时钟的来龙去脉。接下来从程序的角度分析时钟树的设置,程序清单如下:) _7 F" \" s+ ~
void RCC_Configuration(void)
3 D( ~$ l) E1 j4 h% q8 V{: I; w8 @2 f1 `
        ErrorStatus HSEStartUpStatus;                                                                                                     (1)! K/ m/ F5 g6 E
        RCC_DeInit();                                                             (2)
8 a6 F- Z7 q, G: v# h2 B8 |        RCC_HSEConfig(RCC_HSE_ON);                                                                                                   (3)! S9 r) E/ B. G7 i+ T' i- Z! r3 q
        HSEStartUpStatus = RCC_WaitForHSEStartUp();                                                                     (4)% p) f. S+ L& e7 F* }
        if(HSEStartUpStatus == SUCCESS)                                                                                                (5)
. }7 K6 h$ j0 U- p        {
0 _" a, h! P7 T5 G, Z% C- X( U                   RCC_HCLKConfig(RCC_SYSCLK_Div1);                                                                              (6)% z7 \9 N, {3 F6 A0 W
                     RCC_PCLK2Config(RCC_HCLK_Div1);                                                                               (7)
1 {. ~' i& l8 f) D: l) T4 f                     RCC_PCLK1Config(RCC_HCLK_Div2);                                                                                (8)5 y7 s  ^8 l' H7 M" q9 f# t
                    FLASH_SetLatency(FLASH_Latency_2);                                                                             (9)( I! U! W  G+ X* Z* c  A4 X
                    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);                                      (10)
) v( ~+ V3 L" r! d* H: \1 c+ `" t                  RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);                                         (11)5 m( N# b4 }+ z! Q
                  RCC_PLLCmd(ENABLE);                                      (12)
0 N- n. p- [+ b* Y8 k                  while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);                                                       (13)* G$ K) H. I+ M- d, {% H+ A
                  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);                                                               (14)
8 x$ {+ I$ N- h4 V                  while(RCC_GetSYSCLKSource() != 0x08);                                                                               (15)6 a: r8 f6 E6 ]: l
        }
5 }0 }6 I. h1 M& S0 I6 w; \

该用户从未签到

2#
发表于 2016-6-4 15:48 | 只看该作者
学习中,谢谢分享' F3 Y5 Q, E- P4 I/ y6 `
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-10 10:20 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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