STM32G474xx HAL用户手册
stm32g4xx_hal_rcc.c
转到此文件的文档。
00001 /**
00002   ******************************************************************************
00003   * @file    stm32g4xx_hal_rcc.c
00004   * @author  MCD Application Team
00005   * @brief   RCC HAL模块驱动程序。
00006   *          此文件提供固件功能以管理复位和时钟控制(RCC)外设的以下功能:
00007   *           + 初始化和反初始化函数
00008   *           + 外设控制函数
00009   *
00010   @verbatim
00011   ==============================================================================
00012                       ##### RCC特定功能 #####
00013   ==============================================================================
00014     [..]
00015       复位后,设备从高速内部振荡器(16 MHz)运行,Flash等待状态为0。
00017       Flash预取缓冲区、D-Cache
00017       和I-Cache被禁用,除内部
00018       SRAM、Flash和JTAG外,所有外设均关闭。
00019 
00020       (+) 高速(AHB)和低速(APB)总线没有预分频器:
00021           映射在这些总线上的所有外设都以HSI速度运行。
00022       (+) 所有外设的时钟都被关闭,SRAM和FLASH除外。
00023       (+) 所有GPIO都处于模拟模式,除用于调试目的的JTAG引脚。
00025 
00026     [..]
00027       设备从复位启动后,用户应用程序需要:
00028       (+) 配置要用作系统时钟的时钟源
00029           (如果应用程序需要更高的频率/性能)
00030       (+) 配置系统时钟频率和Flash设置
00031       (+) 配置AHB和APB总线预分频器
00032       (+) 启用要使用的外设的时钟
00033       (+) 配置不源自系统时钟的外设的时钟源(USB, RNG, USART, LPUART, FDCAN, 某些TIMERs,
00034           UCPD, I2S, I2C, LPTIM, ADC, QSPI)
00035 
00037   @endverbatim
00038   ******************************************************************************
00039   * @attention
00040   *
00041   * Copyright (c) 2019 STMicroelectronics.
00043   * All rights reserved.
00043   *
00044   * This software is licensed under terms that can be found in the LICENSE file in
00045   * the root directory of this software component.
00046   * If no LICENSE file comes with this software, it is provided AS-IS.
00047   ******************************************************************************
00048   */
00049 
00050 /* Includes ------------------------------------------------------------------*/
00051 #include "stm32g4xx_hal.h"
00052 
00053 /** @addtogroup STM32G4xx_HAL_Driver
00054   * @{
00056   */
00056 
00057 /** @defgroup RCC RCC
00058   * @brief RCC HAL模块驱动程序
00059   * @{
00060   */
00061 
00062 #ifdef HAL_RCC_MODULE_ENABLED
00063 
00064 /* Private typedef -----------------------------------------------------------*/
00065 /* Private define ------------------------------------------------------------*/
00066 /** @defgroup RCC_Private_Constants RCC私有常量
00067  * @{
00068  */
00069 */
00070 #define HSE_TIMEOUT_VALUE          HSE_STARTUP_TIMEOUT
00071 #define HSI_TIMEOUT_VALUE          2U                /* 2 ms (最小Tick + 1) */
00072 #define LSI_TIMEOUT_VALUE          2U                /* 2 ms (最小Tick + 1) */
00073 #define HSI48_TIMEOUT_VALUE        2U                /* 2 ms (最小Tick + 1) */
00074 #define PLL_TIMEOUT_VALUE          2U                /* 2 ms (最小Tick + 1) */
00075 #define CLOCKSWITCH_TIMEOUT_VALUE  5000U             /* 5秒 */
00076 /**
00077   * @}
00078   */
00079 
00080 /* Private macro -------------------------------------------------------------*/
00081 /** @defgroup RCC_Private_Macros RCC私有宏
00082   * @{
00083   */
00084 00084 #define RCC_GET_MCO_GPIO_PIN(__RCC_MCOx__)   ((__RCC_MCOx__) & GPIO_PIN_MASK)
00085 
00086 00086 #define RCC_GET_MCO_GPIO_AF(__RCC_MCOx__)    (((__RCC_MCOx__) & RCC_MCO_GPIOAF_MASK) >> RCC_MCO_GPIOAF_POS)
00087 
00088 00088 #define RCC_GET_MCO_GPIO_INDEX(__RCC_MCOx__) (((__RCC_MCOx__) & RCC_MCO_GPIOPORT_MASK) >> RCC_MCO_GPIOPORT_POS)
00089 
00090 00090 #define RCC_GET_MCO_GPIO_PORT(__RCC_MCOx__)  (AHB2PERIPH_BASE + ((0x00000400UL) * RCC_GET_MCO_GPIO_INDEX(__RCC_MCOx__)))
00091 
00092 00092 #define RCC_PLL_OSCSOURCE_CONFIG(__HAL_RCC_PLLSOURCE__) \
00093             (MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, (__HAL_RCC_PLLSOURCE__)))
00094 /**
00095   * @}
00096   */
00097 
00098 /* Private variables ---------------------------------------------------------*/
00099 
00100 /* Private function prototypes -----------------------------------------------*/
00101 /** @defgroup RCC_Private_Functions RCC私有函数
00102   * @{
00103   */
00104 static uint32_t          RCC_GetSysClockFreqFromPLLSource(void);
00105 /**
00106   * @}
00107   */
00108 
00109 /* Exported functions --------------------------------------------------------*/
00110 
00111 /** @defgroup RCC_Exported_Functions RCC导出函数
00112   * @{
00113   */
00114 
00115 /** @defgroup RCC_Exported_Functions_Group1 初始化和反初始化函数
00116   *  @brief    初始化和配置函数
00117   *
00118   @verbatim
00119  ===============================================================================
00120            ##### 初始化和反初始化函数 #####
00121  ===============================================================================
00122     [..]
00123       本节提供用于配置内部和外部振荡器的函数
00124       (HSE、HSI、LSE、LSI、PLL、CSS和MCO)以及系统总线时钟(SYSCLK、AHB、APB1
00125        和APB2)。
00126 
00127     [..] 内部/外部时钟和PLL配置
00128          (+) HSI(高速内部): 出厂校准的16 MHz RC,可直接或通过
00129              PLL作为系统时钟源。
00130 
00131          (+) LSI(低速内部): 32 KHz低功耗RC,用作IWDG和/或RTC
00132              时钟源。
00133 
00134          (+) HSE(高速外部): 4至48 MHz晶体振荡器,可直接或通过
00135              PLL作为系统时钟源。也可选择作为RTC时钟源。
00136 
00137          (+) LSE(低速外部): 32.768 KHz振荡器,可选择作为RTC时钟源。
00138 
00139          (+) PLL(由HSI、HSE提供时钟): 提供多达三个独立输出时钟:
00140            (++) 第一个输出用于生成高速系统时钟(高达170 MHz)。
00141            (++) 第二个输出用于为USB(48 MHz)、
00142                 QSPI(<= 48 MHz)、FDCAN、SAI和I2S生成时钟。
00143            (++) 第三个输出用于为ADC生成时钟
00144 
00145          (+) CSS(时钟安全系统): 启用后,如果HSE时钟发生故障
00146             (HSE直接或通过PLL作为系统时钟源),系统时钟
00147              会自动切换到HSI,如果启用,则会生成中断。
00148              该中断链接到Cortex-M4 NMI(不可屏蔽中断)
00149              异常向量。
00150 
00151          (+) MCO(微控制器时钟输出): 用于通过可配置预分频器输出LSI、HSI、LSE、HSE、
00152              主PLL时钟、系统时钟或RC48时钟到PA8引脚。
00153 
00154     [..] 系统、AHB和APB总线时钟配置
00155          (+) 可使用多个时钟源来驱动系统时钟(SYSCLK):HSI、
00156              HSE和主PLL。
00157              AHB时钟(HCLK)通过可配置预分频器从系统时钟派生,
00158              用于为CPU、存储器和映射到AHB总线上的外设(DMA、GPIO...)提供时钟。
00159              APB1(PCLK1)和APB2(PCLK2)时钟从AHB时钟通过可配置预分频器派生,
00161              用于为映射在这些总线上的外设提供时钟。
00162              您可以使用"HAL_RCC_GetSysClockFreq()"函数来获取这些时钟的频率。
00163 
00164          -@- 除以下情况外,所有外设时钟都源自系统时钟(SYSCLK):
00165 
00166            (+@) RTC:RTC时钟可以从LSI、LSE或HSE时钟
00167                 除以2到31获得。
00168                 您必须使用__HAL_RCC_RTC_ENABLE()和HAL_RCCEx_PeriphCLKConfig()函数
00169                 来配置此时钟。
00170            (+@) USB FS和RNG:USB FS需要48 MHz的频率
00171                 才能正常工作,而RNG外设需要频率

00172                 等于或低于48 MHz。此时钟从主PLL通过PLLQ分频器派生。
00174                 您必须启用外设时钟并使用
00175                 HAL_RCCEx_PeriphCLKConfig()函数来配置此时钟。
00176            (+@) IWDG时钟,它始终是LSI时钟。
00177