14. RCC

您所在的位置:网站首页 时钟输出 14. RCC

14. RCC

2024-07-10 18:09| 来源: 网络整理| 查看: 265

14.2. RCC框图剖析—时钟树¶

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

图 15‑1 STM32F767时钟树1

图 15‑2 STM32F767时钟树2

14.2.1. 系统时钟¶ 14.2.1.1. ①HSE高速外部时钟信号¶

HSE是高速的外部时钟信号,可以由有源晶振或者无源晶振提供,H767系列频率从4-26MHZ不等,其余H7系列可达到频率从4-48MHz不等。 当使用有源晶振时,时钟从OSC_IN引脚进入,OSC_OUT引脚悬空,当选用无源晶振时,时钟从OSC_IN和OSC_OUT进入,并且要配谐振电容。 HSE我们使用25M的无源晶振。如果我们使用HSE或者HSE经过PLL倍频之后的时钟作为系统时钟SYSCLK,当HSE故障时候,不仅HSE会被关闭, PLL也会被关闭,此时高速的内部时钟时钟信号HSI会作为备用的系统时钟,直到HSE恢复正常,HSI可选择8,16,32或者64MHz,取决于 HSIDIV分频因子。

14.2.1.2. ②锁相环PLL¶

PLL的主要作用是对时钟进行倍频,然后把时钟输出到各个功能部件。F767的PLL则有两个,一个是主PLL,另外一个是专用的PLLI2S,其余H7系列 PLL有三个,分别是主PLL1、PLL2、PLL3,他们均由HSE或者HSI提供时钟输入信号。

主PLL有两路的时钟输出,第一个输出时钟PLLCLK用于系统时钟,F767里面最高是216M,F743挑战者则最高400M,其余F7系列最高为480M, 第二和第三个输出用于提供其他一些外设的时钟。PLL2和PLL3主要用于提供外设的内核时钟。

HSE或者HSI经过PLL时钟输入分频因子M(1~63)分频后,成为VCO的时钟输入,VCO的时钟必须在1~2M之间,我们选择HSE=25M作为PLL的时钟输入,M设置为25,那么VCO输入时钟就等于1M。

F767的VCO输入时钟经过VCO倍频因子N倍频之后,成为VCO时钟输出,VCO时钟必须在192~432M之间。我们配置N为432,则VCO的输出时钟等于432M。 F743_v跟F750_v系列的VCO时钟必须在192~836 MHz之间,配置N为192,VCO的输出时钟等于960 MHz。 F743_挑战者的VCO时钟必须在192~836 MHz之间,配置N为160,VCO的输出时钟等于800 MHz。

VCO输出时钟之后有三个分频因子:PLLCLK分频因子p,USB OTG FS/RNG/SDMMC时钟分频因子Q, 分频因子R(F769才有,F767没有)产生DSI时钟驱动屏幕。 p可以取值2、4、6、8,我们配置为2,则得到PLLCLK=216 MHz。Q可以取值4~15, 但是USB OTG FS必须使用48M,Q=VCO输出时钟432/48=9。 有关PLL的配置有一个专门的RCC PLL配置寄存器RCC_PLLCFGR,具体描述看手册即可。

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

VCOCLK_IN = PLLCLK_IN / M = HSE / 25 = 1M

VCOCLK_OUT = VCOCLK_IN * N = 1M * 432 = 432M

PLLCLK_OUT=VCOCLK_OUT/P=432/2=216M

USBCLK = VCOCLK_OUT/Q=432/9=48。暂时这样配置,到真正使用USB的时候会重新配置。

14.2.1.3. ③系统时钟SYSCLK¶

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

14.2.1.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=216M。

14.2.1.5. ⑤APB1总线时钟PCLK1¶

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

14.2.1.6. ⑥APB2总线时钟PCLK2¶

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

14.2.1.7. 设置系统时钟库函数¶

上面的6个步骤对应的设置系统时钟库函数如下,为了方便阅读,已经把跟767不相关的代码删掉,把英文注释翻译成了中文。该函数是直接填写相应的结构体,最后调用HAL_RCC_OscConfig函数和HAL_RCC_ClockConfig函数就可以初始化时钟,这里需要注意的是,由于在 PLL 使能后主 PLL 配置参数便不可更改,所以建议先对 PLL 进行配置,然后再使能(选择 HSI 或 HSE 振荡器作为 PLL 时钟源,并配置分频系数 M、 N、 P 和 Q)。

代码 15‑1代码 2 设置系统时钟库函数

/** * @brief System Clock 配置 * system Clock 配置如下 : * System Clock source = PLL (HSE) * SYSCLK(Hz) = 216000000 * HCLK(Hz) = 216000000 * AHB Prescaler = 1 * APB1 Prescaler = 4 * APB2 Prescaler = 2 * HSE Frequency(Hz) = 25000000 * PLL_M = 25 * PLL_N = 432 * PLL_P = 2 * PLL_Q = 9 * VDD(V) = 3.3 * Main regulator output voltage = Scale1 mode * Flash Latency(WS) = 7 * @param 无 * @retval 无 */ void SystemClock_Config(void) { RCC_ClkInitTypeDef RCC_ClkInitStruct; RCC_OscInitTypeDef RCC_OscInitStruct; HAL_StatusTypeDef ret = HAL_OK; /* 使能HSE,配置HSE为PLL的时钟源,配置PLL的各种分频 因子M N P Q * PLLCLK = HSE/M*N/P = 25M / 25 *432 / 2 = 216M */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 25; RCC_OscInitStruct.PLL.PLLN = 432; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 9; ret = HAL_RCC_OscConfig(&RCC_OscInitStruct); if (ret != HAL_OK) { while (1) { ; } } /* 激活 OverDrive 模式以达到216M频率 */ ret = HAL_PWREx_EnableOverDrive(); if (ret != HAL_OK) { while (1) { ; } } /* 选择PLLCLK作为SYSCLK,并配置 HCLK, PCLK1 and PCLK2 的时钟分频因子 * SYSCLK = PLLCLK = 216M * HCLK = SYSCLK / 1 = 216M * PCLK2 = SYSCLK / 2 = 108M * PCLK1 = SYSCLK / 4 = 54M */ RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_7); if (ret != HAL_OK) { while (1) { ; } } } 14.2.2. 其他时钟¶

通过对系统时钟设置的讲解,整个时钟树我们已经把握的有六七成,剩下的时钟部分我们讲解几个重要的。

14.2.2.1. RTC时钟¶

STM32F767 RTC和IWDG时钟

RTCCLK 时钟源可以是 HSE 1 MHz( HSE 由一个可编程的预分频器分频)、 LSE 或者 LSI时钟。选择方式是编程 RCC 备份域控制寄存器 (RCC_BDCR) 中的 RTCSEL[1:0] 位和 RCC时钟配置寄存器 (RCC_CFGR) 中的 RTCPRE[4:0] 位。所做的选择只能通过复位备份域的方式修改。我们通常的做法是由LSE给RTC提供时钟,大小为32.768KHZ。LSE由外接的晶体谐振器产生,所配的谐振电容精度要求高,不然很容易不起振。

14.2.2.2. 独立看门狗时钟¶

独立看门狗时钟由内部的低速时钟LSI提供,大小为32KHZ。

14.2.2.3. I2S时钟¶

I2S时钟可由外部的时钟引脚I2S_CKIN输入,也可由专用的PLLI2SCLK提供,具体的由RCC 时钟配置寄存器 (RCC_CFGR)的I2SSCR位配置。我们在使用I2S外设驱动W8978的时候,使用的时钟是PLLI2SCLK,这样就可以省掉一个有源晶振。

14.2.2.4. PHY以太网时钟¶

F767要想实现以太网功能,除了有本身内置的MAC之外,还需要外接一个PHY芯片,常见的PHY芯片有DP83848和LAN8720,其中DP83848支持MII和RMII接口,LAN8720只支持RMII接口。野火F767开发板用的是RMII接口,选择的PHY芯片是LAN8720。使用RMII接口的好处是使用的IO减少了一半,速度还是跟MII接口一样。当使用RMII接口时,PHY芯片只需输出一路时钟给MCU即可,如果是MII接口,PHY芯片则需要提供两路时钟给MCU。

14.2.2.5. USB PHY 时钟¶

F767的USB没有集成PHY,要想实现USB高速传输的话,必须外置USB PHY芯片,常用的芯片是USB3300。当外接USB PHY芯片时,PHY芯片需要给MCU提供一个时钟。

外扩USB3300会占用非常多的IO,跟SDRAM和RGB888的IO会复用的很厉害,鉴于USB高速传输用的比较少,野火767就没有外扩这个芯片。

14.2.2.6. MCO时钟输出¶

STM32F767 MCO时钟

MCO是microcontroller clock output的缩写,是微控制器时钟输出引脚,主要作用是可以对外提供时钟,相当于一个有源晶振。F767中有两个MCO,由PA8/PC9复用所得。MCO1所需的时钟源通过 RCC 时钟配置寄存器 (RCC_CFGR) 中的 MCO1PRE[2:0] 和 MCO1[1:0]位选择。MCO2所需的时钟源通过 RCC 时钟配置寄存器 (RCC_CFGR) 中的 MCO2PRE[2:0] 和 MCO2位选择。有关MCO的IO、时钟选择和输出速率的具体信息如下表所示:

时钟输出

IO

时钟来源

最大输出速率

MCO1

PA8

HSI、LSE、HSE、PLLCLK

108MHz

MCO2

PC9

HSE、PLLCLK、SYSCLK、PLLI2SCLK

108MHz



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3