STM32F40x系统时钟自我学习笔记

  • 时钟源简介

  • 时钟树解析
  • ①HSE 高速外部时钟信号
  • ②锁相环PLL
  • ③系统时钟SYSCLK
  • ④AHB 总线时钟HCLK
  • ⑤APB2 总线时钟HCLK2
  • ⑥APB1 总线时钟HCLK1
  • A、RTC 时钟
  • B、独立看门狗时钟
  • C、I2S 时钟
  • D、PHY以太网时钟
  • E、USB PHY 时钟
  • F、MCO 时钟输出
  • KEIL内的时钟计算
  • 主时钟计算
  • 其他外设时钟计算


时钟源简介

在 STM32F4 中,有 5 个重要的时钟源,分别为 HSI、HSE、LSI、LSE、PLL。其中 PLL 又分为主 PLL 和专用 PLL。上述时钟根据英文缩写可以判断时钟的高低频和内外部时钟。

时钟树解析

ESP32 实现STM32G431 Bootloader_系统时钟

①HSE 高速外部时钟信号

  • 当使用有源晶振时,时钟从OSC_IN 引脚进入,OSC_OUT 引脚悬空;
  • 当选用无源晶振时,时钟从OSC_IN 和OSC_OUT 进入,并且要配谐振电容。
  • 当HSE 故障时,高速的内部时钟信号HSI会作为备用的系统时钟,直到HSE恢复正常,HSI=16M。

②锁相环PLL

  • HSE 或者HSI 经过PLL 时钟输入分频因子PPLM(2-63)分频后,成为VCO 的时钟输入,VCO 的时钟必须在1~2M 。
  • PLL的配置经过根据公式可得:
  • VCOCLK_IN = PLLCLK_IN / M = HSE / PLLM
  • VCOCLK_OUT = VCOCLK_IN * N = HSE/PLLM*PLLN
  • PLLCLK_OUT=VCOCLK_OUT/PLLP = HSE*PLLN/(PLLM * PLLP)
  • 如果使能了PLL,则PLLCLK即为我们需要的时钟。

③系统时钟SYSCLK

  • 系统时钟来源可以是:HSI、PLLCLK、HSE,具体的由时钟配置寄存器RCC_CFGR的SW位配置。
    可以在system_stm32f4xx.c文件中配置
#define  RCC_CFGR_SW_HSI                     ((uint32_t)0x00000000)        /*!< HSI selected as system clock */
#define  RCC_CFGR_SW_HSE                     ((uint32_t)0x00000001)        /*!< HSE selected as system clock */
#define  RCC_CFGR_SW_PLL                     ((uint32_t)0x00000002)        /*!< PLL selected as system clock */
/* Select the main PLL as system clock source */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= RCC_CFGR_SW_PLL;

    /* Wait till the main PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);
    {
    }

上图即配置时钟来源为PLLCLK。

④AHB 总线时钟HCLK

  • 系统时钟SYSCLK经过AHB预分频器分频之后得到时钟叫APB总线时钟,片上的大部分时钟都是由HCLK分频得到的。
  • 根据上面讲述的PLLCLK的配置,可知这里的HCLK即为PLLCLK。我们也可以通过选择RCC_CFGR_SWS_HSI或RCC_CFGR_SWS_HSE来更换系统时钟来源。

⑤APB2 总线时钟HCLK2

  • APB2的时钟频率由HCLK分频得来,分频可设。高频时钟,以F405为例,最大允许84M。

⑥APB1 总线时钟HCLK1

  • APB1的时钟频率由HCLK分频得来,分频可设。低频时钟,以F405为例,最大允许42M
  • AHB、APB1、APB2在system_stm32f4xx.c文件的配置详情见下面的代码块。
/* HCLK = SYSCLK / 1*/
    RCC->CFGR |= RCC_CFGR_HPRE_DIV1;//AHB

#if defined (STM32F40_41xxx) || defined (STM32F427_437xx) || defined (STM32F429_439xx)      
    /* PCLK2 = HCLK / 2*/
    RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;//APB2
    
    /* PCLK1 = HCLK / 4*/
    RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;//APB1

A、RTC 时钟

  • RTCCLK 时钟源可以是 HSE 1 MHz、 LSE 或者 LSI时钟。
  • 通常的做法是由LSE 给RTC 提供时钟,大小为32.768KHZ。
  • LSE由外接的晶体谐振器产生,所配的谐振电容精度要求高,不然很容易不起震。

B、独立看门狗时钟

-由内部的低速时钟LSI提供,大小为32KHZ。

C、I2S 时钟

  • I2S时钟可由外部的时钟引脚I2S_CKIN输入,也可由专用的PLLI2SCLK提供。

D、PHY以太网时钟

  • F429要想实现以太网功能,除了有本身内置的MAC之外,还需要外接一个PHY芯片。
  • 当使用RMII接口时,PHY芯片只需输出一路时钟给MCU即可。
  • 如果是MII接口,PHY芯片则需要提供两路时钟给MCU。

E、USB PHY 时钟

  • 当外接USB PHY芯片时,PHY芯片需要给MCU提供一个时钟。
  • 如果当前芯片内部没有集成PHY芯片,则需要外接一个PHY芯片。

F、MCO 时钟输出

  • MCO是microcontroller clock output的缩写,是微控制器时钟输出引脚,主要作用是可以对外提供时钟,相当于一个有源晶振。

KEIL内的时钟计算

主时钟计算

  • 此处我们只计算时钟来源为PLLCLK,即系统时钟由PLL倍频而来的情况。
  • 那么SYSCLK = PLLCLK = HSE*PLLN/(PLLM * PLLP)

其他外设时钟计算

  • HCLK = SYSCLK = PLLCLK
  • HCLK1 = PLLCLK / 4
  • HCLK2 = PLLCLK / 2
  • 这个分频比一般都不会变,但是在发现按照这个默认值计算的时钟不对时,要及时的检查配置并计算实际的时钟情况。
  • APB1上的外设包括:
  • DACEN
  • CANEN(1、2)
  • I2CEN(1、2、3)
  • UART(4、5)
  • USARTEN(2、3)
  • SPIEN(2、3)
  • WWDGEN(窗口看门狗)
  • TIMEN(2、3、4、5、6、7、12、13、14)
  • APB2上的外设包括:
    -TIMEN(1、8、9、10、11)
  • SYSCFGEN
  • SPIEN(1)
  • SDIOEN(安全数字输入输出接口)
  • ADCEN(1、2、3)
  • USARTEN(1、6)

总结一句,用于记忆,即:
APB2负责AD,I/O,高级TIM,串口1、6。
APB1负责DA,USB,SPI,I2C,CAN,串口2345,普通TIM
但这句总结不够严谨,我们可以根据上图面的记录看出,APB1并不负责所有的SPI,但可以用于记录大部分的内容,开发就是如此,既要通过这种口诀记忆一般芯片的通性,又要根据手册去对比验证,这样能确保万无一失。

此文档由学习了“小峰学长生活大爆炸”的文章而来,叙述部分肯定有一些相似之处,但也有我的理解和补充,本意是为了再次加深印象和供以后查阅,如有冒犯,可联系本人。谢谢。