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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
STM32的时钟树
" x3 u" @9 d" `' w, M# Y$ D         对于广大初次接触STM32的读者朋友(甚至是初次接触ARM器件的读者朋友)来说,在熟悉了开发环境的使用之后,往往“栽倒”在同一个问题上。这问题有个关键字叫:时钟树。. T/ K* d/ q- p; v; r
   众所周知,微控制器(处理器)的运行必须要依赖周期性的时钟脉冲来驱动——往往由一个外部晶体振荡器提供时钟输入为始,最终转换为多个外部设备的周期性运 作为末,这种时钟“能量”扩散流动的路径,犹如大树的养分通过主干流向各个分支,因此常称之为“时钟树”。在一些传统的低端8位单片机诸如 51,AVR,PIC等单片机,其也具备自身的一个时钟树系统,但其中的绝大部分是不受用户控制的,亦即在单片机上电后,时钟树就固定在某种不可更改的状 态(假设单片机处于正常工作的状态)。比如51单片机使用典型的12MHz晶振作为时钟源,则外设如IO口、定时器、串口等设备的驱动时钟速率便已经是固 定的,用户无法将此时钟速率更改,除非更换晶振。
5 y3 j2 j. R+ V5 ^' e* l/ k! t         而STM32微控制器的时钟树则是可配置的,其时钟输入源与最终达到外设处的时钟速率不再有固定的关系,本文将来详细解析STM32微控制器的时钟树。图1是STM32微控制器的时钟树,表1是图中各个标号所表示的部件。9 Y2 `- D. y  D  K" ?) C; k
标号            图1标号释义' g- c- i- d3 K
1     内部低速振荡器(LSI,40Khz)( G- K+ S9 z" N
2     外部低速振荡器(LSE,32.768Khz)! X8 Z1 {8 m# e1 l2 a; o& b! X( q; z
3    外部高速振荡器(HSE,3-25MHz)
5 L) l4 H3 U6 x( U5 |" W8 \4    内部高速振荡器(HIS,8MHz)) k6 }: E% X/ f# I, ~3 z7 L/ {
5    PLL输入选择位8 }2 n! F9 K" ]" D. g+ L6 U; I  e) _" o8 S
6    RTC时钟选择位6 ]; P0 `. {5 O0 n
7    PLL1分频数寄存器1 g. V5 j3 |+ Z
8    PLL1倍频寄存器
, V% g0 e1 v  r  d: P' D9    系统时钟选择位% `' n0 ]0 |4 \. B: @
10            USB分频寄存器
# o$ K; m3 C$ T/ _# |6 `11            AHB分频寄存器. \0 m1 `! y7 y; P+ b7 r: Q  v
12            APB1分频寄存器
4 @& N2 G* f1 T( l7 K: l13            AHB总线# Z' \: G9 [  s# f- L- G/ n" Z
14            APB1外设总线
& f5 ^$ f5 ^, f15            APB2分频寄存器9 V3 v$ m/ U* b. ^7 z9 Y
16       APB2外设总线
# {( I9 I' X* b+ e17            ADC预分频寄存器: T1 _7 o% A* F
18            ADC外设
  k* V9 ?- k6 m2 T4 e( \" {9 ]19            PLL2分频数寄存器
' L/ Z: g  b" }' s( ~5 s20            PLL2倍频寄存器
- K7 g0 N3 f+ _+ G( ~1 z' z21            PLL时钟源选择寄存器% U5 U# j" O- Y9 ^" o7 M( A
22            独立看门狗设备9 w+ D* n* c' `8 j2 t
23       RTC设备
8 U* v; Y2 x$ w- m, CSTM32时钟树.jpg
2 [$ j: P  v- j2 J6 o图1  STM32的时钟树
8 Z) X0 E5 z# e, e   在认识这颗时钟树之前,首先要明确“主干”和最终的“分支”。假设使用外部8MHz晶振作为STM32的时钟输入源(这也是最常见的一种做法),则这个 8MHz便是“主干”,而“分支”很显然是最终的外部设备比如通用输入输出设备(GPIO)。这样可以轻易找出第一条时钟的“脉络”:: w( D& d' \" s7 O0 G: |* ~
3——5——7——21——8——9——11——13' S4 a; E$ |# ]9 A4 \$ a' G
对此条时钟路径做如下解析:
" f) B6 E; G( o$ l. b1 n对于3,首先是外部的3-25MHz(前文已假设为8MHz)输入;
6 Z; P3 W/ l% L+ c: D对于5,通过PLL选择位预先选择后续PLL分支的输入时钟(假设选择外部晶振);
0 m6 {" B( h% m对于7,设置外部晶振的分频数(假设1分频);" P4 S' j. k2 M$ _+ v
对于21,选择PLL倍频的时钟源(假设选择经过分频后的外部晶振时钟);
1 l2 }' f6 E2 v6 h# S对于8,设置PLL倍频数(假设9倍频);
* u5 T+ P! }  I- E对于9,选择系统时钟源(假设选择经过PLL倍频所输出的时钟);2 G0 M3 I$ N9 p( i' A7 G
对于11,设置AHB总线分频数(假设1分频);, |) H$ T6 v: u
对于13,时钟到达AHB总线;
9 w& q6 u8 f1 \9 s: u! m$ w6 J在上一章节中所介绍的GPIO外设属于APB2设备,即GPIO的时钟来源于APB2总线,同样在图1中也可以寻获GPIO外设的时钟轨迹:' E1 J+ p2 ^3 }2 A
3——5——7——21——8——9——11——15——16
- I$ h0 F6 A& [对于3,首先是外部的3-25MHz(前文已假设为8MHz)输入;
6 H1 H' |% C' i$ ^) I) Z( R对于5, 通过PLL选择位预先选择后续PLL分支的输入时钟(假设选择外部晶振);- g, L# u3 ~6 w+ C
对于7,设置外部晶振的分频数(假设1分频);
: S6 k$ ~8 I6 J$ J' E5 r: |对于21,选择PLL倍频的时钟源(假设选择经过分频后的外部晶振时钟);$ ?3 B5 l8 v0 e
对于8,设置PLL倍频数(假设9倍频);
. b5 X( T: o# S0 |7 i7 K对于9,选择系统时钟源(假设选择经过PLL倍频所输出的时钟);
. w. Y$ u3 W/ @8 D0 O对于11,设置AHB总线分频数(假设1分频);, U3 x2 M* m3 f
对于15,设置APB2总线分频数(假设1分频);
) U' R6 |2 E( A对于16,时钟到达APB2总线;
* Q8 H9 g) r& a现在来计算一下GPIO设备的最大驱动时钟速率(各个条件已在上述要点中假设):" w' @, O' }5 |, ?
1)   由3所知晶振输入为8MHz,由5——21知PLL的时钟源为经过分频后的外部晶振时钟,并且此分频数为1分频,因此首先得出PLL的时钟源为:8MHz / 1 = 8MHz。; Y8 Q5 D2 s( ]
2)   由8、9知PLL倍频数为9,且将PLL倍频后的时钟输出选择为系统时钟,则得出系统时钟为 8MHz * 9 = 72MHz。( c% B) {+ ], _+ w4 G$ P0 v1 a* W
3)   时钟到达AHB预分频器,由11知时钟经过AHB预分频器之后的速率仍为72MHz。$ T7 v9 n7 p* F# a1 s3 w/ d
4)   时钟到达APB2预分频器,由15经过APB2预分频器后速率仍为72MHz。6 _" a$ A; t5 P8 i  J
5)   时钟到达APB2总线外设。# @9 C# e: X6 {0 Q
因此STM32的APB2总线外设,所能达到的最大速率为72MHz。依据以上方法读者可以搜寻出APB1总线外设时钟、RTC外设时钟、独立看门狗等外设时钟的来龙去脉。接下来从程序的角度分析时钟树的设置,程序清单如下:
- r9 Y% m7 H* xvoid RCC_Configuration(void)
& c0 R- M& T; M1 g7 q. z0 w{  m, [, U/ g' _" t4 _
        ErrorStatus HSEStartUpStatus;                                                                                                     (1)
: Z1 r  T- s: r! [' t        RCC_DeInit();                                                             (2)5 O7 ?2 u/ D1 b
        RCC_HSEConfig(RCC_HSE_ON);                                                                                                   (3)" ^8 X; T) {0 d+ o
        HSEStartUpStatus = RCC_WaitForHSEStartUp();                                                                     (4)
( O! |+ _' u( N$ n/ ]5 z+ l( l        if(HSEStartUpStatus == SUCCESS)                                                                                                (5)$ d, g. b; G* M2 Y, C
        {; ^7 d8 }" O3 H$ p8 s. w" z
                   RCC_HCLKConfig(RCC_SYSCLK_Div1);                                                                              (6)( I( f; z' X- x2 V* Z
                     RCC_PCLK2Config(RCC_HCLK_Div1);                                                                               (7)
+ K. @. a% V) ?. ~3 w                     RCC_PCLK1Config(RCC_HCLK_Div2);                                                                                (8)
+ q1 ?0 e& G; J4 R                    FLASH_SetLatency(FLASH_Latency_2);                                                                             (9)
; H' q+ z4 I  e$ S; N# b( K                    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);                                      (10)
1 C- l/ \* ^8 @8 D6 M1 S$ e9 r                  RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);                                         (11)
9 V5 l8 `9 l+ l* S                  RCC_PLLCmd(ENABLE);                                      (12)) p9 B( L0 A: q0 |& {
                  while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);                                                       (13)
. F% Z. W3 a% s, N5 [  ~  Y                  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);                                                               (14)
+ h% @7 a2 J# k: F4 B6 O                  while(RCC_GetSYSCLKSource() != 0x08);                                                                               (15)* {; T* ^* ]& v) I  G$ I
        }$ Y& X0 E( V$ b6 U% [: U2 A

该用户从未签到

2#
发表于 2016-6-4 15:48 | 只看该作者
学习中,谢谢分享
8 N1 l: R/ H) c, e! |8 y. d  @
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-21 17:45 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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