|
STM32G474xx HAL用户手册
|
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