STM32F429的系统时钟

1、 RCC 主要作用

  设置系统时钟 SYSCLK、设置 AHB 分频因子(决定 HCLK 等于多少) 、 设置 APB2 分频因子(决定 PCLK2 等于多少)、设置 APB1 分频因子(决定 PCLK1 等于多少)、设置各个外设的分频因子;

  控制 AHB、 APB2 和 APB1 这三条总线时钟的开启、控制每个外设的时钟的开启。

  对于 SYSCLK、 HCLK、 PCLK2、 PCLK1 这四个时钟的配置一般是:SYSCLK= HCLK =PLLCLK = 180M, PCLK1=HCLK/2 = 90M, PCLK1=HCLK/4 = 45M。这个时钟配置也是库函数的标准配置,我们用的最多的就是这个。

2、RCC 框图剖析—时钟树

  时钟树单纯讲理论的话会比较枯燥,如果选取一条主线,并辅以代码,先主后次讲解的话会很容易,而且记忆还更深刻。我们这里选取库函数时钟系统时钟函数:SetSysClock(); 以这个函数的编写流程来讲解时钟树,这个函数也是我们用库的时候默认的系统时钟设置函数。该函数的功能是利用 HSE 把时钟设置为: HCLK = SYSCLK=PLLCLK= 180M, PCLK1=HCLK/2 = 90M, PCLK1=HCLK/4 = 45M 下面我们就以这个代码的流程为主线, 来分析时钟树,对应的是图中的黄色部分,代码流程在时钟树中以数字的大小顺序标识。

 

 

 

 

  (1)HSE 高速外部时钟信号

  HSE 是高速的外部时钟信号,可以由有源晶振或者无源晶振提供,频率从 4-26MHZ不等。当使用有源晶振时,时钟从 OSC_IN 引脚进入, OSC_OUT 引脚悬空当选用无源晶振时,时钟从 OSC_IN 和 OSC_OUT 进入,并且要配谐振电容

  HSE 我们使用 25M 的无源晶振。 如果我们使用 HSE 或者 HSE 经过 PLL 倍频之后的时钟作为系统时钟 SYSCLK,当 HSE 故障时候,不仅 HSE 会被关闭, PLL 也会被关闭,此时高速的内部时钟时钟信号HSI 会作为备用的系统时钟,直到 HSE 恢复正常, HSI=16M。

  (2)锁相环 PLL

  PLL 的主要作用是对时钟进行倍频,然后把时钟输出到各个功能部件。 PLL 有两个,一个是主 PLL,另外一个是专用的 PLLI2S,他们均由 HSE 或者 HSI 提供时钟输入信号。

  主 PLL 有两路的时钟输出,第一个输出时钟 PLLCLK 用于系统时钟, F429 里面最高是 180M,第二个输出用于 USB OTG FS 的时钟( 48M)、 RNG 和 SDIO 时钟( <=48M)。

  专用的 PLLI2S 用于生成精确时钟,给 I2S 提供时钟。

  HSE 或者 HSI 经过 PLL 时钟输入分频因子 M( 2~63)分频后,成为 VCO 的时钟输入,VCO 的时钟必须在 1~2M 之间, 我们选择 HSE=25M 作为 PLL 的时钟输入, M 设置为 25那么 VCO 输入时钟就等于 1M。VCO 输入时钟经过 VCO 倍频因子 N 倍频之后,成为 VCO 时钟输出, VCO 时钟必须在 192~432M 之间。我们配置 N 为 360,则 VCO 的输出时钟等于 360M。如果要把系统时钟超频,就得在 VCO 倍频系数 N 这里做手脚。 PLLCLK_OUTMAX =VCOCLK_OUTMAX/P_MIN = 432/2=216M,即 F429 最高可超频到 216M。

  VCO 输出时钟之后有三个分频因子: PLLCLK 分频因子 P, USB OTG FS/RNG/SDIO时钟分频因子 Q,分频因子 R( F446 才有, F429 没有)。P可以取值 2、 4、 6、 8,我们配置为 2,则得到 PLLCLK=180M。 Q 可以取值 4~15,但是 USB OTG FS 必须使用 48M,Q=VCO 输出时钟 360/48=7.5,出现了小数这明显是错误,权衡之策是是重新配置 VCO 的倍频因子 N=336,VCOCLK=1M*336=336M, PLLCLK=VCOCLK/2=168M, USBCLK=336/7=48M,细心的读者应该发现了,在使用 USB 的时候, PLLCLK 被降低到了 168M,不能使用 180M,这实乃 ST 的一个奇葩设计。有关 PLL 的配置有一个专门的RCC PLL 配置寄存器 RCC_PLLCFGR,具体描述看手册即可。

  PLL 的时钟配置经过,稍微整理下可由如下公式表达:

    VCOCLK_IN = PLLCLK_IN / M = HSE / 25 = 1M
    VCOCLK_OUT = VCOCLK_IN * N = 1M * 360 = 360M
    PLLCLK_OUT=VCOCLK_OUT/P=360/2=180M
    USBCLK = VCOCLK_OUT/Q=360/7=51.7。

  暂时这样配置,到真正使用 USB 的时候会重新配置。

  (3)系统时钟 SYSCLK

  系统时钟来源可以是: HSI、 PLLCLK、 HSE,具体的由时钟配置寄存器 RCC_CFGR的 SW 位配置。我们这里设置系统时钟: SYSCLK = PLLCLK = 180M。 如果系统时钟是由HSE 经过 PLL 倍频之后的 PLLCLK 得到,当 HSE 出现故障的时候,系统时钟会切换为HSI=16M,直到 HSE 恢复正常为止。

  (4)AHB 总线时钟 HCLK

  系统时钟 SYSCLK 经过 AHB 预分频器分频之后得到时钟叫 APB 总线时钟,即 HCLK,分频因子可以是:[1,2,4, 8, 16, 64, 128, 256, 512],具体的由时钟配置寄存器RCC_CFGR 的 HPRE 位设置。片上大部分外设的时钟都是经过 HCLK 分频得到,至于 AHB总线上的外设的时钟设置为多少,得等到我们使用该外设的时候才设置,我们这里只需粗线条的设置好 APB 的时钟即可。 我们这里设置为 1 分频,即 HCLK=SYSCLK=180M。

  (5)APB2 总线时钟 HCLK2

  APB2 总线时钟 PCLK2 由 HCLK 经过高速 APB2 预分频器得到,分频因子可以是:[1,2,4, 8, 16],具体由时钟配置寄存器 RCC_CFGR 的 PPRE2 位设置。 HCLK2 属于高速的总线时钟,片上高速的外设就挂载到这条总线上,比如全部的 GPIO、 USART1、 SPI1等。至于 APB2 总线上的外设的时钟设置为多少,得等到我们使用该外设的时候才设置,我们这里只需粗线条的设置好 APB2 的时钟即可。我们这里设置为 2 分频,即 PCLK2 =HCLK /2= 90M。

  (6)APB1 总线时钟 HCLK1

  APB1 总线时钟 PCLK1 由 HCLK 经过低速 APB 预分频器得到,分频因子可以是:[1,2,4,8, 16],具体由时钟配置寄存器 RCC_CFGR 的 PPRE1 位设置。HCLK1 属于低速的总线时钟,最高为 45M,片上低速的外设就挂载到这条总线上,比如USART2/3/4/5、 SPI2/3, I2C1/2 等。至于 APB1 总线上的外设的时钟设置为多少,得等到我们使用该外设的时候才设置,我们这里只需粗线条的设置好 APB1 的时钟即可。我们这里设置为 4 分频,即 PCLK1 = HCLK/4 = 45M。

 

 

posted @ 2022-06-20 22:50  孤情剑客  阅读(1263)  评论(0编辑  收藏  举报