stm32f7 时钟

Posted qifeng1024

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stm32f7 时钟相关的知识,希望对你有一定的参考价值。

  

在 STM32F7 中,有 5 个最重要的时钟源,为 HSI、HSE、LSI、LSE、PLL。

①、LSI 是低速内部时钟,RC 振荡器,频率为 32kHz 左右。LSI 主要可以作为 IWDG 独立看门狗时钟,LPTimer 低功耗定时器时钟以及 RTC 时钟。

②、LSE 是低速外部时钟,接频率为 32.768kHz 的石英晶体。这个主要是 RTC 的时钟源。 

③、HSE 是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为 4MHz~26MHz。阿波罗 STM32F7 开发板接的是 25MHz 外部晶振。HSE 可以直接做为系统时钟或者 PLL 输入时钟,同时它经过 2~31 分频后也可以作为 RTC 时钟。 

④、HSI 是高速内部时钟,RC 振荡器,频率为 16MHz。可以直接作为系统时钟或者用作 PLL输入,同时它经过 488 分频之后也可以作为 HDMI-CEC 时钟。 

⑤、PLL 为锁相环倍频输出。STM32F7 有三个 PLL:
1) 主 PLL(PLL)由 HSE 或者 HSI 提供时钟信号,并具有两个不同的输出时钟。
  第一个输出 PLLP 用于生成高速的系统时钟(最高 216MHz)
  第二个输出 PLLQ 为 48M 时钟,用于 USB OTG FS 时钟,随机数发生器的时钟和 SDMMC
  时钟。
2) 第一个专用 PLL(PLLI2S)用于生成精确时钟,在 I2S、SAI 和 SPDIFRX 上实现高品质音频性
能。其中,N 是用于 PLLI2S vco 的倍频系数,其取值范围是:50~432;R 是 I2S 时钟的
分频系数,其取值范围是:2~7;Q 是 SAI 时钟分频系数,其取值范围是:2~15;P 没
用到。
3) 第二个专用 PLL(PLLSAI)用于为 SAI接口生成时钟,生成 LCD-TFT时钟以及可供 USB OTG FS、
SDMMC 和 RNG 选择的 48MHz 时钟。其中,N 是用于 PLLSAI vco 的倍频系数,其取值
范围是:50~432;Q 是 SAI 时钟分频系数,其取值范围是:2~15;R 是 LTDC 时钟的分
频系数,其取值范围是:2~7;P 没用到。

 

 

时钟系统配置一般步骤:

1、使能PWR时钟:调用函数__HAL_RCC_PWR_CLK_ENABLE()。

2、设置调压器输出电压级别:调用函数__HAL_PWR_VOLTAGESCALING_CONFIG()。

3、选择是否开启Over-Driver功能:调用函数HAL_PWREx_EnableOverDrive()。

4、配置时钟源相关参数:调用函数HAL_RCC_OscConfig()。

5、配置系统时钟源以及AHB,APB1和APB2的分频系数:调用函数HAL_RCC_ClockConfig()。

 

 


 

 

时钟源配置函数:

HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef  *RCC_OscInitStruct)

 他的参数:

typedef struct
{
  uint32_t OscillatorType;       /*!< The oscillators to be configured.
                                      This parameter can be a value of @ref RCC_Oscillator_Type                   */

  uint32_t HSEState;             /*!< The new state of the HSE.
                                      This parameter can be a value of @ref RCC_HSE_Config                        */

  uint32_t LSEState;             /*!< The new state of the LSE.
                                      This parameter can be a value of @ref RCC_LSE_Config                        */
                                          
  uint32_t HSIState;             /*!< The new state of the HSI.
                                      This parameter can be a value of @ref RCC_HSI_Config                        */

  uint32_t HSICalibrationValue;   /*!< The HSI calibration trimming value (default is RCC_HSICALIBRATION_DEFAULT).
                                       This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x1F */
                               
  uint32_t LSIState;             /*!< The new state of the LSI.
                                      This parameter can be a value of @ref RCC_LSI_Config                        */

  RCC_PLLInitTypeDef PLL;        /*!< PLL structure parameters                                                    */      

}RCC_OscInitTypeDef;

最后一个成员

 RCC_PLLInitTypeDef PLL  的结构体如下:
typedef struct
{
  uint32_t PLLState;   /*!< The new state of the PLL.
                            This parameter can be a value of @ref RCC_PLL_Config                      */

  uint32_t PLLSource;  /*!< RCC_PLLSource: PLL entry clock source.
                            This parameter must be a value of @ref RCC_PLL_Clock_Source               */           

  uint32_t PLLM;       /*!< PLLM: Division factor for PLL VCO input clock.
                            This parameter must be a number between Min_Data = 2 and Max_Data = 63    */        

  uint32_t PLLN;       /*!< PLLN: Multiplication factor for PLL VCO output clock.
                            This parameter must be a number between Min_Data = 50 and Max_Data = 432  */

  uint32_t PLLP;       /*!< PLLP: Division factor for main system clock (SYSCLK).
                            This parameter must be a value of @ref RCC_PLLP_Clock_Divider             */

  uint32_t PLLQ;       /*!< PLLQ: Division factor for OTG FS, SDMMC and RNG clocks.
                            This parameter must be a number between Min_Data = 2 and Max_Data = 15    */
#if defined (STM32F765xx) || defined (STM32F767xx) || defined (STM32F769xx) || defined (STM32F777xx) || defined (STM32F779xx)
  uint32_t PLLR;       /*!< PLLR: Division factor for DSI clock.
                            This parameter must be a number between Min_Data = 2 and Max_Data = 7    */
#endif /* STM32F767xx || STM32F769xx || STM32F777xx || STM32F779xx */  

}RCC_PLLInitTypeDef;   

 

HAL_RCC_OscConfig配置示例代码:(plln pllq 等都是变量,本例中是作为时钟init函数的入口参数

 RCC_OscInitStructure.OscillatorType=RCC_OSCILLATORTYPE_HSE;  //时钟源为HSE
 RCC_OscInitStructure.HSEState=RCC_HSE_ON;                      //打开HSE
 RCC_OscInitStructure.PLL.PLLState=RCC_PLL_ON;    //打开PLL
 RCC_OscInitStructure.PLL.PLLSource=RCC_PLLSOURCE_HSE; //PLL时钟源选择HSE
 RCC_OscInitStructure.PLL.PLLM=pllm;//主PLL和音频PLL分频系数(PLL之前的分频)
 RCC_OscInitStructure.PLL.PLLN=plln; //主PLL倍频系数(PLL倍频)
 RCC_OscInitStructure.PLL.PLLP=pllp; //系统时钟的主PLL分频系数(PLL之后的分频)
 RCC_OscInitStructure.PLL.PLLQ=pllq; //USB/SDIO/随机数产生器等的主PLL分频系数         
 HAL_RCC_OscConfig(&RCC_OscInitStructure);//初始化

 


 

 

 

 

时钟配置函数:

HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef  *RCC_ClkInitStruct, uint32_t FLatency)

 

入口参数结构体:

typedef struct
{
  uint32_t ClockType;             /*!< The clock to be configured.
                                       This parameter can be a value of @ref RCC_System_Clock_Type */
  
  uint32_t SYSCLKSource;          /*!< The clock source (SYSCLKS) used as system clock.
                                       This parameter can be a value of @ref RCC_System_Clock_Source    */

  uint32_t AHBCLKDivider;         /*!< The AHB clock (HCLK) divider. This clock is derived from the system clock (SYSCLK).
                                       This parameter can be a value of @ref RCC_AHB_Clock_Source       */

  uint32_t APB1CLKDivider;        /*!< The APB1 clock (PCLK1) divider. This clock is derived from the AHB clock (HCLK).
                                       This parameter can be a value of @ref RCC_APB1_APB2_Clock_Source */

  uint32_t APB2CLKDivider;        /*!< The APB2 clock (PCLK2) divider. This clock is derived from the AHB clock (HCLK).
                                       This parameter can be a value of @ref RCC_APB1_APB2_Clock_Source */

}RCC_ClkInitTypeDef;

 

 

配置示例:

    RCC_ClkInitStructure.ClockType=(RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2);
    RCC_ClkInitStructure.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK;//设置系统时钟时钟源为PLL
    RCC_ClkInitStructure.AHBCLKDivider=RCC_SYSCLK_DIV1;//AHB分频系数为1
    RCC_ClkInitStructure.APB1CLKDivider=RCC_HCLK_DIV4;//APB1分频系数为4
    RCC_ClkInitStructure.APB2CLKDivider=RCC_HCLK_DIV2;//APB2分频系数为2

 


以上是关于stm32f7 时钟的主要内容,如果未能解决你的问题,请参考以下文章

stm32f7的串口TX如何设置

如何将带有 SPL 的 STM32F3 代码移植到 STM32F7

第15章 RCC—使用HSE/HSI配置时钟

STM32 内部时钟

STM32F7 定时器触发定时器

带有 AXIM/ITCM 闪存的 STM32F7 VMA 和 LMA