You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

3376 lines
98 KiB
C

/**
******************************************************************************
* @file stm32h5xx_ll_rcc.c
* @author MCD Application Team
* @brief RCC LL module driver.
******************************************************************************
* @attention
*
* Copyright (c) 2023 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
#if defined(USE_FULL_LL_DRIVER)
/* Includes ------------------------------------------------------------------*/
#include "stm32h5xx_ll_rcc.h"
#ifdef USE_FULL_ASSERT
#include "stm32_assert.h"
#else
#define assert_param(expr) ((void)0U)
#endif /* USE_FULL_ASSERT */
/** @addtogroup STM32H5xx_LL_Driver
* @{
*/
#if defined(RCC)
/** @addtogroup RCC_LL
* @{
*/
/* Private types -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private constants ---------------------------------------------------------*/
/* Private macros ------------------------------------------------------------*/
/** @addtogroup RCC_LL_Private_Macros
* @{
*/
#if defined(USART10)
#define IS_LL_RCC_USART_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_USART1_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_USART2_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_USART3_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_USART6_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_USART10_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_USART11_CLKSOURCE))
#elif defined(USART6)
#define IS_LL_RCC_USART_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_USART1_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_USART2_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_USART3_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_USART6_CLKSOURCE))
#else
#define IS_LL_RCC_USART_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_USART1_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_USART2_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_USART3_CLKSOURCE))
#endif /* USART6 */
#if defined(UART7)
#define IS_LL_RCC_UART_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_UART4_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_UART5_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_UART7_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_UART8_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_UART9_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_UART12_CLKSOURCE))
#elif defined(UART5)
#define IS_LL_RCC_UART_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_UART4_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_UART5_CLKSOURCE))
#endif /* UART7 */
#define IS_LL_RCC_LPUART_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_LPUART1_CLKSOURCE))
#if defined(I2C4)
#define IS_LL_RCC_I2C_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I2C1_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_I2C2_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_I2C3_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_I2C4_CLKSOURCE))
#elif defined(I2C3)
#define IS_LL_RCC_I2C_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I2C1_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_I2C2_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_I2C3_CLKSOURCE))
#else
#define IS_LL_RCC_I2C_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I2C1_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_I2C2_CLKSOURCE))
#endif /* I2C3*/
#if defined(I3C2)
#define IS_LL_RCC_I3C_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I3C1_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_I3C2_CLKSOURCE))
#else
#define IS_LL_RCC_I3C_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I3C1_CLKSOURCE))
#endif /* I3C2 */
#if defined(SPI5)
#define IS_LL_RCC_SPI_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SPI1_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_SPI2_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_SPI3_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_SPI4_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_SPI5_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_SPI6_CLKSOURCE))
#elif defined(SPI4)
#define IS_LL_RCC_SPI_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SPI1_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_SPI2_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_SPI3_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_SPI4_CLKSOURCE))
#else
#define IS_LL_RCC_SPI_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SPI1_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_SPI2_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_SPI3_CLKSOURCE))
#endif /* SPI5 */
#if defined(LPTIM3)
#define IS_LL_RCC_LPTIM_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_LPTIM1_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_LPTIM2_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_LPTIM3_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_LPTIM4_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_LPTIM5_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_LPTIM6_CLKSOURCE))
#else
#define IS_LL_RCC_LPTIM_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_LPTIM1_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_LPTIM2_CLKSOURCE))
#endif /* LPTIM3 */
#if defined(SAI1)
#define IS_LL_RCC_SAI_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SAI1_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_SAI2_CLKSOURCE))
#endif /* SAI1 */
#if defined (SDMMC2)
#define IS_LL_RCC_SDMMC_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SDMMC1_CLKSOURCE) \
|| ((__VALUE__) == LL_RCC_SDMMC2_CLKSOURCE))
#elif defined (SDMMC1)
#define IS_LL_RCC_SDMMC_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SDMMC1_CLKSOURCE))
#endif /* SDMMC2*/
#define IS_LL_RCC_RNG_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_RNG_CLKSOURCE))
#if defined(USB_DRD_FS)
#define IS_LL_RCC_USB_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_USB_CLKSOURCE))
#endif /* USB_DRD_FS */
#define IS_LL_RCC_ADCDAC_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_ADCDAC_CLKSOURCE))
#define IS_LL_RCC_DAC_LP_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_DAC_LP_CLKSOURCE))
#define IS_LL_RCC_OCTOSPI_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_OCTOSPI_CLKSOURCE))
#define IS_LL_RCC_FDCAN_CLKSOURCE(__VALUE__) ((__VALUE__) == LL_RCC_FDCAN_CLKSOURCE)
#if defined(CEC)
#define IS_LL_RCC_CEC_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_CEC_CLKSOURCE))
#endif /* CEC */
/**
* @}
*/
/* Private function prototypes -----------------------------------------------*/
/** @defgroup RCC_LL_Private_Functions RCC Private functions
* @{
*/
uint32_t RCC_GetSystemClockFreq(void);
uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency);
uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency);
uint32_t RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency);
uint32_t RCC_GetPCLK3ClockFreq(uint32_t HCLK_Frequency);
uint32_t RCC_PLL1_GetFreqSystem(void);
/**
* @}
*/
/* Exported functions --------------------------------------------------------*/
/** @addtogroup RCC_LL_Exported_Functions
* @{
*/
/** @addtogroup RCC_LL_EF_Init
* @{
*/
/**
* @brief Reset the RCC clock configuration to the default reset state.
* @note The default reset state of the clock configuration is given below:
* - HSI ON and used as system clock source
* - HSE, CSI, PLL1, PLL2 and PLL3 OFF
* - AHB, APB1, APB2 and APB3 prescaler set to 1.
* - CSS OFF
* - All interrupts disabled
* @note This function doesn't modify the configuration of the
* - Peripheral clocks
* - LSI, LSE and RTC clocks
* @retval An ErrorStatus enumeration value:
* - SUCCESS: RCC registers are de-initialized
* - ERROR: not applicable
*/
ErrorStatus LL_RCC_DeInit(void)
{
/* Set HSION bit */
LL_RCC_HSI_Enable();
/* Wait for HSI READY bit */
while (LL_RCC_HSI_IsReady() == 0U)
{
}
/* Set HSIDIV Default value */
CLEAR_BIT(RCC->CR, RCC_CR_HSIDIV);
/* Set HSITRIM bits to the reset value*/
LL_RCC_HSI_SetCalibTrimming(0x40U);
/* Reset CFGR register */
LL_RCC_WriteReg(CFGR1, 0x00000000U);
LL_RCC_WriteReg(CFGR2, 0x00000000U);
/* Wait till clock switch is ready */
while (LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_HSI)
{
}
#if defined(RCC_CR_PLL3ON)
/* Reset HSECSSON, HSEON, HSIKERON, CSION, CSIKERON, HSI48ON, PLL1ON, PLL2ON and PLL3ON bits */
CLEAR_BIT(RCC->CR, RCC_CR_CSION | RCC_CR_CSIKERON | RCC_CR_HSECSSON | RCC_CR_HSIKERON | RCC_CR_HSI48ON |
RCC_CR_HSEON | RCC_CR_PLL1ON | RCC_CR_PLL2ON | RCC_CR_PLL3ON);
#else
/* Reset HSECSSON, HSEON, HSIKERON, CSION, CSIKERON, HSI48ON, PLL1ON, PLL2ON and PLL3ON bits */
CLEAR_BIT(RCC->CR, RCC_CR_CSION | RCC_CR_CSIKERON | RCC_CR_HSECSSON | RCC_CR_HSIKERON | RCC_CR_HSI48ON |
RCC_CR_HSEON | RCC_CR_PLL1ON | RCC_CR_PLL2ON);
#endif /* PLL3 */
/* Wait for PLL1 READY bit to be reset */
while (LL_RCC_PLL1_IsReady() != 0U)
{}
/* Wait for PLL2 READY bit to be reset */
while (LL_RCC_PLL2_IsReady() != 0U)
{}
#if defined(RCC_CR_PLL3ON)
/* Wait for PLL3 READY bit to be reset */
while (LL_RCC_PLL3_IsReady() != 0U)
{}
#endif /* PLL3 */
/* Reset PLL1CFGR register */
CLEAR_REG(RCC->PLL1CFGR);
/* Reset PLL1DIVR register */
LL_RCC_WriteReg(PLL1DIVR, 0x01010280U);
/* Reset PLL1FRACR register */
CLEAR_REG(RCC->PLL1FRACR);
/* Reset PLL2CFGR register */
CLEAR_REG(RCC->PLL2CFGR);
/* Reset PLL2DIVR register */
LL_RCC_WriteReg(PLL2DIVR, 0x01010280U);
/* Reset PLL2FRACR register */
CLEAR_REG(RCC->PLL2FRACR);
#if defined(RCC_CR_PLL3ON)
/* Reset PLL3CFGR register */
CLEAR_REG(RCC->PLL3CFGR);
/* Reset PLL3DIVR register */
LL_RCC_WriteReg(PLL3DIVR, 0x01010280U);
/* Reset PLL3FRACR register */
CLEAR_REG(RCC->PLL3FRACR);
#endif /* PLL3 */
/* Reset HSEBYP bit */
CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP);
/* Reset HSEEXT bit */
CLEAR_BIT(RCC->CR, RCC_CR_HSEEXT);
#if defined(RCC_CR_PLL3ON)
/* Disable all interrupts */
CLEAR_BIT(RCC->CIER, RCC_CIER_LSIRDYIE | RCC_CIER_LSERDYIE | RCC_CIER_HSIRDYIE | RCC_CIER_HSERDYIE
| RCC_CIER_CSIRDYIE | RCC_CIER_HSI48RDYIE | RCC_CIER_PLL1RDYIE | RCC_CIER_PLL2RDYIE
| RCC_CIER_PLL3RDYIE);
/* Clear all interrupt flags */
SET_BIT(RCC->CICR, RCC_CICR_LSIRDYC | RCC_CICR_LSERDYC | RCC_CICR_HSIRDYC | RCC_CICR_HSERDYC
| RCC_CICR_CSIRDYC | RCC_CICR_HSI48RDYC | RCC_CICR_PLL1RDYC | RCC_CICR_PLL2RDYC
| RCC_CICR_PLL3RDYC | RCC_CICR_HSECSSC);
#else
/* Disable all interrupts */
CLEAR_BIT(RCC->CIER, RCC_CIER_LSIRDYIE | RCC_CIER_LSERDYIE | RCC_CIER_HSIRDYIE | RCC_CIER_HSERDYIE
| RCC_CIER_CSIRDYIE | RCC_CIER_HSI48RDYIE | RCC_CIER_PLL1RDYIE | RCC_CIER_PLL2RDYIE);
/* Clear all interrupt flags */
SET_BIT(RCC->CICR, RCC_CICR_LSIRDYC | RCC_CICR_LSERDYC | RCC_CICR_HSIRDYC | RCC_CICR_HSERDYC
| RCC_CICR_CSIRDYC | RCC_CICR_HSI48RDYC | RCC_CICR_PLL1RDYC | RCC_CICR_PLL2RDYC
| RCC_CICR_HSECSSC);
#endif /* PLL3 */
/* Clear all reset flags */
LL_RCC_ClearResetFlags();
/* Update the SystemCoreClock global variable */
SystemCoreClock = HSI_VALUE;
return SUCCESS;
}
/**
* @}
*/
/** @addtogroup RCC_LL_EF_Get_Freq
* @brief Return the frequencies of different on chip clocks; System, AHB, APB1 and APB2 buses clocks
* and different peripheral clocks available on the device.
* @note If SYSCLK source is HSI, function returns values based on HSI_VALUE(*)
* @note If SYSCLK source is CSI, function returns values based on CSI_VALUE(**)
* @note If SYSCLK source is HSE, function returns values based on HSE_VALUE(***)
* @note If SYSCLK source is PLL1, function returns values based on HSE_VALUE(***)
* or HSI_VALUE(**) or CSI_VALUE(*) multiplied/divided by the main PLL factors.
* @note (*) HSI_VALUE is a constant defined in this file (default value
* 64 MHz) but the real value may vary depending on the variations
* in voltage and temperature.
* @note (**) CSI_VALUE is a constant defined in this file (default value
* 4 MHz) but the real value may vary depending on the variations
* in voltage and temperature.
* @note (***) HSE_VALUE is a constant defined in this file (default value
* 32 MHz), user has to ensure that HSE_VALUE is same as the real
* frequency of the crystal used. Otherwise, this function may
* have wrong result.
* @note The result of this function could be incorrect when using fractional
* value for HSE crystal.
* @note This function can be used by the user application to compute the
* baud-rate for the communication peripherals or configure other parameters.
* @{
*/
/**
* @brief Return the frequencies of different on chip clocks; System, AHB, APB1, APB2 and APB3 buses clocks
* @note Each time SYSCLK, HCLK, PCLK1, PCLK2 and PCLK3 clock changes, this function
* must be called to update structure fields. Otherwise, any
* configuration based on this function will be incorrect.
* @param pRCC_Clocks pointer to a @ref LL_RCC_ClocksTypeDef structure which will hold the clocks frequencies
* @retval None
*/
void LL_RCC_GetSystemClocksFreq(LL_RCC_ClocksTypeDef *pRCC_Clocks)
{
/* Get SYSCLK frequency */
pRCC_Clocks->SYSCLK_Frequency = RCC_GetSystemClockFreq();
/* HCLK clock frequency */
pRCC_Clocks->HCLK_Frequency = RCC_GetHCLKClockFreq(pRCC_Clocks->SYSCLK_Frequency);
/* PCLK1 clock frequency */
pRCC_Clocks->PCLK1_Frequency = RCC_GetPCLK1ClockFreq(pRCC_Clocks->HCLK_Frequency);
/* PCLK2 clock frequency */
pRCC_Clocks->PCLK2_Frequency = RCC_GetPCLK2ClockFreq(pRCC_Clocks->HCLK_Frequency);
/* PCLK3 clock frequency */
pRCC_Clocks->PCLK3_Frequency = RCC_GetPCLK3ClockFreq(pRCC_Clocks->HCLK_Frequency);
}
/**
* @brief Return PLL1 clocks frequencies
* @note LL_RCC_PERIPH_FREQUENCY_NO returned for non activated output or oscillator not ready
* @retval None
*/
void LL_RCC_GetPLL1ClockFreq(LL_PLL_ClocksTypeDef *pPLL_Clocks)
{
uint32_t pllinputfreq = LL_RCC_PERIPH_FREQUENCY_NO;
uint32_t pllsource;
uint32_t pllm;
uint32_t plln;
uint32_t fracn = 0U;
/* PLL_VCO = (HSE_VALUE, CSI_VALUE or HSI_VALUE/HSIDIV) / PLLM * (PLLN + FRACN)
SYSCLK = PLL_VCO / PLLP
*/
pPLL_Clocks->PLL_P_Frequency = LL_RCC_PERIPH_FREQUENCY_NO;
pPLL_Clocks->PLL_Q_Frequency = LL_RCC_PERIPH_FREQUENCY_NO;
pPLL_Clocks->PLL_R_Frequency = LL_RCC_PERIPH_FREQUENCY_NO;
if (LL_RCC_PLL1_IsReady() != 0U)
{
pllsource = LL_RCC_PLL1_GetSource();
switch (pllsource)
{
case LL_RCC_PLL1SOURCE_HSI:
if (LL_RCC_HSI_IsReady() != 0U)
{
pllinputfreq = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
}
break;
case LL_RCC_PLL1SOURCE_CSI:
if (LL_RCC_CSI_IsReady() != 0U)
{
pllinputfreq = CSI_VALUE;
}
break;
case LL_RCC_PLL1SOURCE_HSE:
if (LL_RCC_HSE_IsReady() != 0U)
{
pllinputfreq = HSE_VALUE;
}
break;
case LL_RCC_PLL1SOURCE_NONE:
default:
/* PLL clock disabled */
break;
}
pllm = LL_RCC_PLL1_GetM();
plln = LL_RCC_PLL1_GetN();
if (LL_RCC_PLL1FRACN_IsEnabled() != 0U)
{
fracn = LL_RCC_PLL1_GetFRACN();
}
if ((pllinputfreq != LL_RCC_PERIPH_FREQUENCY_NO) && (pllm != 0U))
{
if (LL_RCC_PLL1P_IsEnabled() != 0U)
{
pPLL_Clocks->PLL_P_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, pllm, plln, fracn, LL_RCC_PLL1_GetP());
}
if (LL_RCC_PLL1Q_IsEnabled() != 0U)
{
pPLL_Clocks->PLL_Q_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, pllm, plln, fracn, LL_RCC_PLL1_GetQ());
}
if (LL_RCC_PLL1R_IsEnabled() != 0U)
{
pPLL_Clocks->PLL_R_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, pllm, plln, fracn, LL_RCC_PLL1_GetR());
}
}
}
}
/**
* @brief Return PLL2 clocks frequencies
* @note LL_RCC_PERIPH_FREQUENCY_NO returned for non activated output or oscillator not ready
* @retval None
*/
void LL_RCC_GetPLL2ClockFreq(LL_PLL_ClocksTypeDef *pPLL_Clocks)
{
uint32_t pllinputfreq = LL_RCC_PERIPH_FREQUENCY_NO;
uint32_t pllsource;
uint32_t pllm;
uint32_t plln;
uint32_t fracn = 0U;
/* PLL_VCO = (HSE_VALUE, CSI_VALUE or HSI_VALUE/HSIDIV) / PLLM * (PLLN + FRACN)
SYSCLK = PLL_VCO / PLLP
*/
pPLL_Clocks->PLL_P_Frequency = LL_RCC_PERIPH_FREQUENCY_NO;
pPLL_Clocks->PLL_Q_Frequency = LL_RCC_PERIPH_FREQUENCY_NO;
pPLL_Clocks->PLL_R_Frequency = LL_RCC_PERIPH_FREQUENCY_NO;
if (LL_RCC_PLL2_IsReady() != 0U)
{
pllsource = LL_RCC_PLL2_GetSource();
switch (pllsource)
{
case LL_RCC_PLL2SOURCE_HSI:
if (LL_RCC_HSI_IsReady() != 0U)
{
pllinputfreq = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
}
break;
case LL_RCC_PLL2SOURCE_CSI:
if (LL_RCC_CSI_IsReady() != 0U)
{
pllinputfreq = CSI_VALUE;
}
break;
case LL_RCC_PLL2SOURCE_HSE:
if (LL_RCC_HSE_IsReady() != 0U)
{
pllinputfreq = HSE_VALUE;
}
break;
case LL_RCC_PLL2SOURCE_NONE:
default:
/* PLL clock disabled */
break;
}
pllm = LL_RCC_PLL2_GetM();
plln = LL_RCC_PLL2_GetN();
if (LL_RCC_PLL2FRACN_IsEnabled() != 0U)
{
fracn = LL_RCC_PLL2_GetFRACN();
}
if ((pllinputfreq != LL_RCC_PERIPH_FREQUENCY_NO) && (pllm != 0U))
{
if (LL_RCC_PLL2P_IsEnabled() != 0U)
{
pPLL_Clocks->PLL_P_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, pllm, plln, fracn, LL_RCC_PLL2_GetP());
}
if (LL_RCC_PLL2Q_IsEnabled() != 0U)
{
pPLL_Clocks->PLL_Q_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, pllm, plln, fracn, LL_RCC_PLL2_GetQ());
}
if (LL_RCC_PLL2R_IsEnabled() != 0U)
{
pPLL_Clocks->PLL_R_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, pllm, plln, fracn, LL_RCC_PLL2_GetR());
}
}
}
}
#if defined(RCC_CR_PLL3ON)
/**
* @brief Return PLL3 clocks frequencies
* @note LL_RCC_PERIPH_FREQUENCY_NO returned for non activated output or oscillator not ready
* @retval None
*/
void LL_RCC_GetPLL3ClockFreq(LL_PLL_ClocksTypeDef *pPLL_Clocks)
{
uint32_t pllinputfreq = LL_RCC_PERIPH_FREQUENCY_NO;
uint32_t pllsource;
uint32_t pllm;
uint32_t plln;
uint32_t fracn = 0U;
/* PLL_VCO = (HSE_VALUE, CSI_VALUE or HSI_VALUE/HSIDIV) / PLLM * (PLLN + FRACN)
SYSCLK = PLL_VCO / PLLP
*/
pPLL_Clocks->PLL_P_Frequency = LL_RCC_PERIPH_FREQUENCY_NO;
pPLL_Clocks->PLL_Q_Frequency = LL_RCC_PERIPH_FREQUENCY_NO;
pPLL_Clocks->PLL_R_Frequency = LL_RCC_PERIPH_FREQUENCY_NO;
if (LL_RCC_PLL3_IsReady() != 0U)
{
pllsource = LL_RCC_PLL3_GetSource();
switch (pllsource)
{
case LL_RCC_PLL3SOURCE_HSI:
if (LL_RCC_HSI_IsReady() != 0U)
{
pllinputfreq = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
}
break;
case LL_RCC_PLL3SOURCE_CSI:
if (LL_RCC_CSI_IsReady() != 0U)
{
pllinputfreq = CSI_VALUE;
}
break;
case LL_RCC_PLL3SOURCE_HSE:
if (LL_RCC_HSE_IsReady() != 0U)
{
pllinputfreq = HSE_VALUE;
}
break;
case LL_RCC_PLL3SOURCE_NONE:
default:
/* PLL clock disabled */
break;
}
pllm = LL_RCC_PLL3_GetM();
plln = LL_RCC_PLL3_GetN();
if (LL_RCC_PLL3FRACN_IsEnabled() != 0U)
{
fracn = LL_RCC_PLL3_GetFRACN();
}
if ((pllinputfreq != LL_RCC_PERIPH_FREQUENCY_NO) && (pllm != 0U))
{
if (LL_RCC_PLL3P_IsEnabled() != 0U)
{
pPLL_Clocks->PLL_P_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, pllm, plln, fracn, LL_RCC_PLL3_GetP());
}
if (LL_RCC_PLL3Q_IsEnabled() != 0U)
{
pPLL_Clocks->PLL_Q_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, pllm, plln, fracn, LL_RCC_PLL3_GetQ());
}
if (LL_RCC_PLL3R_IsEnabled() != 0U)
{
pPLL_Clocks->PLL_R_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, pllm, plln, fracn, LL_RCC_PLL3_GetR());
}
}
}
}
#endif /* PLL3 */
/**
* @brief Helper function to calculate the PLL1 frequency output
* @note ex: @ref LL_RCC_CalcPLLClockFreq (HSE_VALUE, @ref LL_RCC_PLL1_GetM (),
* @ref LL_RCC_PLL1_GetN (), @ref LL_RCC_PLL1_GetFRACN (), @ref LL_RCC_PLL1_GetP ());
* @param PLLInputFreq PLL Input frequency (based on HSE/(HSI/HSIDIV)/CSI)
* @param M Between 1 and 63
* @param N Between 4 and 512
* @param FRACN Between 0 and 0x1FFF
* @param PQR VCO output divider (P, Q or R)
* Between 1 and 128, except for PLL1P Odd value not allowed
* @retval PLL1 output clock frequency (in Hz)
*/
uint32_t LL_RCC_CalcPLLClockFreq(uint32_t PLLInputFreq, uint32_t M, uint32_t N, uint32_t FRACN, uint32_t PQR)
{
float_t freq;
freq = ((float_t)PLLInputFreq / (float_t)M) * ((float_t)N + ((float_t)FRACN / (float_t)0x2000));
freq = freq / (float_t)PQR;
return (uint32_t)freq;
}
/**
* @brief Return USARTx clock frequency
* @param USARTxSource This parameter can be one of the following values:
* @arg @ref LL_RCC_USART1_CLKSOURCE
* @arg @ref LL_RCC_USART2_CLKSOURCE
* @arg @ref LL_RCC_USART3_CLKSOURCE
* @arg @ref LL_RCC_USART6_CLKSOURCE (*)
* @arg @ref LL_RCC_USART10_CLKSOURCE (*)
* @arg @ref LL_RCC_USART11_CLKSOURCE (*)
*
* (*) : For stm32h56xxx and stm32h57xxx family lines only.
* @retval USART clock frequency (in Hz)
* - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator or PLL is not ready
*/
uint32_t LL_RCC_GetUSARTClockFreq(uint32_t USARTxSource)
{
uint32_t usart_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
LL_PLL_ClocksTypeDef PLL_Clocks;
/* Check parameter */
assert_param(IS_LL_RCC_USART_CLKSOURCE(USARTxSource));
if (USARTxSource == LL_RCC_USART1_CLKSOURCE)
{
/* USART1CLK clock frequency */
switch (LL_RCC_GetUSARTClockSource(USARTxSource))
{
case LL_RCC_USART1_CLKSOURCE_PCLK2: /* USART1 Clock is PCLK2 */
usart_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
break;
case LL_RCC_USART1_CLKSOURCE_PLL2Q: /* USART1 Clock is PLL2 Q */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
usart_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
#if defined(LL_RCC_USART1_CLKSOURCE_PLL3Q)
case LL_RCC_USART1_CLKSOURCE_PLL3Q: /* USART1 Clock is PLL3 Q */
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
usart_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
#endif /* LL_RCC_USART1_CLKSOURCE_PLL3 */
case LL_RCC_USART1_CLKSOURCE_HSI: /* USART1 Clock is HSI Osc. */
if (LL_RCC_HSI_IsReady() == 1U)
{
usart_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
}
break;
case LL_RCC_USART1_CLKSOURCE_CSI: /* USART1 Clock is CSI Osc. */
if (LL_RCC_CSI_IsReady() == 1U)
{
usart_frequency = CSI_VALUE;
}
break;
case LL_RCC_USART1_CLKSOURCE_LSE: /* USART1 Clock is LSE Osc. */
if (LL_RCC_LSE_IsReady() == 1U)
{
usart_frequency = LSE_VALUE;
}
break;
default:
/* unreachable code */
break;
}
}
else if (USARTxSource == LL_RCC_USART2_CLKSOURCE)
{
/* USART2CLK clock frequency */
switch (LL_RCC_GetUSARTClockSource(USARTxSource))
{
case LL_RCC_USART2_CLKSOURCE_PCLK1: /* USART2 Clock is PCLK1 */
usart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
break;
case LL_RCC_USART2_CLKSOURCE_PLL2Q: /* USART2 Clock is PLL2 Q */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
usart_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
#if defined(LL_RCC_USART2_CLKSOURCE_PLL3Q)
case LL_RCC_USART2_CLKSOURCE_PLL3Q: /* USART2 Clock is PLL3 Q */
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
usart_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
#endif /* LL_RCC_USART2_CLKSOURCE_PLL3 */
case LL_RCC_USART2_CLKSOURCE_HSI: /* USART2 Clock is HSI Osc. */
if (LL_RCC_HSI_IsReady() == 1U)
{
usart_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
}
break;
case LL_RCC_USART2_CLKSOURCE_CSI: /* USART2 Clock is CSI Osc. */
if (LL_RCC_CSI_IsReady() == 1U)
{
usart_frequency = CSI_VALUE;
}
break;
case LL_RCC_USART2_CLKSOURCE_LSE: /* USART2 Clock is LSE Osc. */
if (LL_RCC_LSE_IsReady() == 1U)
{
usart_frequency = LSE_VALUE;
}
break;
default:
/* unreachable code */
break;
}
}
else if (USARTxSource == LL_RCC_USART3_CLKSOURCE)
{
/* USART3CLK clock frequency */
switch (LL_RCC_GetUSARTClockSource(USARTxSource))
{
case LL_RCC_USART3_CLKSOURCE_PCLK1: /* USART3 Clock is PCLK1 */
usart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
break;
case LL_RCC_USART3_CLKSOURCE_PLL2Q: /* USART3 Clock is PLL2 Q */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
usart_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
#if defined(LL_RCC_USART3_CLKSOURCE_PLL3Q)
case LL_RCC_USART3_CLKSOURCE_PLL3Q: /* USART3 Clock is PLL3 Q */
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
usart_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
#endif /* LL_RCC_USART3_CLKSOURCE_PLL3 */
case LL_RCC_USART3_CLKSOURCE_HSI: /* USART3 Clock is HSI Osc. */
if (LL_RCC_HSI_IsReady() == 1U)
{
usart_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
}
break;
case LL_RCC_USART3_CLKSOURCE_CSI: /* USART3 Clock is CSI Osc. */
if (LL_RCC_CSI_IsReady() == 1U)
{
usart_frequency = CSI_VALUE;
}
break;
case LL_RCC_USART3_CLKSOURCE_LSE: /* USART3 Clock is LSE Osc. */
if (LL_RCC_LSE_IsReady() == 1U)
{
usart_frequency = LSE_VALUE;
}
break;
default:
/* unreachable code */
break;
}
}
#if defined(USART6)
else if (USARTxSource == LL_RCC_USART6_CLKSOURCE)
{
/* USART6CLK clock frequency */
switch (LL_RCC_GetUSARTClockSource(USARTxSource))
{
case LL_RCC_USART6_CLKSOURCE_PCLK1: /* USART6 Clock is PCLK1 */
usart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
break;
case LL_RCC_USART6_CLKSOURCE_PLL2Q: /* USART6 Clock is PLL2 Q */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
usart_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_USART6_CLKSOURCE_PLL3Q: /* USART6 Clock is PLL3 Q */
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
usart_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_USART6_CLKSOURCE_HSI: /* USART6 Clock is HSI Osc. */
if (LL_RCC_HSI_IsReady() == 1U)
{
usart_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
}
break;
case LL_RCC_USART6_CLKSOURCE_CSI: /* USART6 Clock is CSI Osc. */
if (LL_RCC_CSI_IsReady() == 1U)
{
usart_frequency = CSI_VALUE;
}
break;
case LL_RCC_USART6_CLKSOURCE_LSE: /* USART6 Clock is LSE Osc. */
if (LL_RCC_LSE_IsReady() == 1U)
{
usart_frequency = LSE_VALUE;
}
break;
default:
/* unreachable code */
break;
}
}
#endif /* USART6 */
#if defined(USART10)
else if (USARTxSource == LL_RCC_USART10_CLKSOURCE)
{
/* USART10CLK clock frequency */
switch (LL_RCC_GetUSARTClockSource(USARTxSource))
{
case LL_RCC_USART10_CLKSOURCE_PCLK1: /* USART10 Clock is PCLK1 */
usart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
break;
case LL_RCC_USART10_CLKSOURCE_PLL2Q: /* USART10 Clock is PLL2 Q */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
usart_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_USART10_CLKSOURCE_PLL3Q: /* USART10 Clock is PLL3 Q */
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
usart_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_USART10_CLKSOURCE_HSI: /* USART10 Clock is HSI Osc. */
if (LL_RCC_HSI_IsReady() == 1U)
{
usart_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
}
break;
case LL_RCC_USART10_CLKSOURCE_CSI: /* USART10 Clock is CSI Osc. */
if (LL_RCC_CSI_IsReady() == 1U)
{
usart_frequency = CSI_VALUE;
}
break;
case LL_RCC_USART10_CLKSOURCE_LSE: /* USART10 Clock is LSE Osc. */
if (LL_RCC_LSE_IsReady() == 1U)
{
usart_frequency = LSE_VALUE;
}
break;
default:
/* unreachable code */
break;
}
}
#endif /* USART10 */
#if defined(USART11)
else if (USARTxSource == LL_RCC_USART11_CLKSOURCE)
{
/* USART11CLK clock frequency */
switch (LL_RCC_GetUSARTClockSource(USARTxSource))
{
case LL_RCC_USART11_CLKSOURCE_PCLK1: /* USART11 Clock is PCLK1 */
usart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
break;
case LL_RCC_USART11_CLKSOURCE_PLL2Q: /* USART11 Clock is PLL2 Q */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
usart_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_USART11_CLKSOURCE_PLL3Q: /* USART11 Clock is PLL3 Q */
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
usart_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_USART11_CLKSOURCE_HSI: /* USART11 Clock is HSI Osc. */
if (LL_RCC_HSI_IsReady() == 1U)
{
usart_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
}
break;
case LL_RCC_USART11_CLKSOURCE_CSI: /* USART11 Clock is CSI Osc. */
if (LL_RCC_CSI_IsReady() == 1U)
{
usart_frequency = CSI_VALUE;
}
break;
case LL_RCC_USART11_CLKSOURCE_LSE: /* USART11 Clock is LSE Osc. */
if (LL_RCC_LSE_IsReady() == 1U)
{
usart_frequency = LSE_VALUE;
}
break;
default:
/* unreachable code */
break;
}
}
#endif /* USART11 */
else
{
/* nothing to do */
}
return usart_frequency;
}
#if defined(UART4)
/**
* @brief Return UARTx clock frequency
* @param UARTxSource This parameter can be one of the following values:
* @arg @ref LL_RCC_UART4_CLKSOURCE
* @arg @ref LL_RCC_UART5_CLKSOURCE
* @arg @ref LL_RCC_UART7_CLKSOURCE
* @arg @ref LL_RCC_UART8_CLKSOURCE
* @arg @ref LL_RCC_UART9_CLKSOURCE
* @arg @ref LL_RCC_UART12_CLKSOURCE
* @retval UART clock frequency (in Hz)
* - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator or PLL is not ready
*/
uint32_t LL_RCC_GetUARTClockFreq(uint32_t UARTxSource)
{
uint32_t uart_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
LL_PLL_ClocksTypeDef PLL_Clocks;
/* Check parameter */
assert_param(IS_LL_RCC_UART_CLKSOURCE(UARTxSource));
if (UARTxSource == LL_RCC_UART4_CLKSOURCE)
{
/* UART4CLK clock frequency */
switch (LL_RCC_GetUARTClockSource(UARTxSource))
{
case LL_RCC_UART4_CLKSOURCE_PCLK1: /* UART4 Clock is PCLK1 */
uart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
break;
case LL_RCC_UART4_CLKSOURCE_PLL2Q: /* UART4 Clock is PLL2 Q */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
uart_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_UART4_CLKSOURCE_PLL3Q: /* UART4 Clock is PLL3 Q */
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
uart_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_UART4_CLKSOURCE_HSI: /* UART4 Clock is HSI Osc. */
if (LL_RCC_HSI_IsReady() == 1U)
{
uart_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
}
break;
case LL_RCC_UART4_CLKSOURCE_CSI: /* UART4 Clock is CSI Osc. */
if (LL_RCC_CSI_IsReady() == 1U)
{
uart_frequency = CSI_VALUE;
}
break;
case LL_RCC_UART4_CLKSOURCE_LSE: /* UART4 Clock is LSE Osc. */
if (LL_RCC_LSE_IsReady() == 1U)
{
uart_frequency = LSE_VALUE;
}
break;
default:
/* unreachable code */
break;
}
}
else if (UARTxSource == LL_RCC_UART5_CLKSOURCE)
{
/* UART5CLK clock frequency */
switch (LL_RCC_GetUARTClockSource(UARTxSource))
{
case LL_RCC_UART5_CLKSOURCE_PCLK1: /* UART5 Clock is PCLK1 */
uart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
break;
case LL_RCC_UART5_CLKSOURCE_PLL2Q: /* UART5 Clock is PLL2 Q */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
uart_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_UART5_CLKSOURCE_PLL3Q: /* UART5 Clock is PLL3 Q */
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
uart_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_UART5_CLKSOURCE_HSI: /* UART5 Clock is HSI Osc. */
if (LL_RCC_HSI_IsReady() == 1U)
{
uart_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
}
break;
case LL_RCC_UART5_CLKSOURCE_CSI: /* UART5 Clock is CSI Osc. */
if (LL_RCC_CSI_IsReady() == 1U)
{
uart_frequency = CSI_VALUE;
}
break;
case LL_RCC_UART5_CLKSOURCE_LSE: /* UART5 Clock is LSE Osc. */
if (LL_RCC_LSE_IsReady() == 1U)
{
uart_frequency = LSE_VALUE;
}
break;
default:
/* unreachable code */
break;
}
}
#if defined(UART7)
else if (UARTxSource == LL_RCC_UART7_CLKSOURCE)
{
/* UART7CLK clock frequency */
switch (LL_RCC_GetUARTClockSource(UARTxSource))
{
case LL_RCC_UART7_CLKSOURCE_PCLK1: /* UART7 Clock is PCLK1 */
uart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
break;
case LL_RCC_UART7_CLKSOURCE_PLL2Q: /* UART7 Clock is PLL2 Q */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
uart_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_UART7_CLKSOURCE_PLL3Q: /* UART7 Clock is PLL3 Q */
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
uart_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_UART7_CLKSOURCE_HSI: /* UART7 Clock is HSI Osc. */
if (LL_RCC_HSI_IsReady() == 1U)
{
uart_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
}
break;
case LL_RCC_UART7_CLKSOURCE_CSI: /* UART7 Clock is CSI Osc. */
if (LL_RCC_CSI_IsReady() == 1U)
{
uart_frequency = CSI_VALUE;
}
break;
case LL_RCC_UART7_CLKSOURCE_LSE: /* UART7 Clock is LSE Osc. */
if (LL_RCC_LSE_IsReady() == 1U)
{
uart_frequency = LSE_VALUE;
}
break;
default:
/* unreachable code */
break;
}
}
#endif /* UART7 */
#if defined(UART8)
else if (UARTxSource == LL_RCC_UART8_CLKSOURCE)
{
/* UART8CLK clock frequency */
switch (LL_RCC_GetUARTClockSource(UARTxSource))
{
case LL_RCC_UART8_CLKSOURCE_PCLK1: /* UART8 Clock is PCLK1 */
uart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
break;
case LL_RCC_UART8_CLKSOURCE_PLL2Q: /* UART8 Clock is PLL2 Q */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
uart_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_UART8_CLKSOURCE_PLL3Q: /* UART8 Clock is PLL3 Q */
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
uart_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_UART8_CLKSOURCE_HSI: /* UART8 Clock is HSI Osc. */
if (LL_RCC_HSI_IsReady() == 1U)
{
uart_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
}
break;
case LL_RCC_UART8_CLKSOURCE_CSI: /* UART8 Clock is CSI Osc. */
if (LL_RCC_CSI_IsReady() == 1U)
{
uart_frequency = CSI_VALUE;
}
break;
case LL_RCC_UART8_CLKSOURCE_LSE: /* UART8 Clock is LSE Osc. */
if (LL_RCC_LSE_IsReady() == 1U)
{
uart_frequency = LSE_VALUE;
}
break;
default:
/* unreachable code */
break;
}
}
#endif /* UART8 */
#if defined(UART9)
else if (UARTxSource == LL_RCC_UART9_CLKSOURCE)
{
/* UART9CLK clock frequency */
switch (LL_RCC_GetUARTClockSource(UARTxSource))
{
case LL_RCC_UART9_CLKSOURCE_PCLK1: /* UART9 Clock is PCLK1 */
uart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
break;
case LL_RCC_UART9_CLKSOURCE_PLL2Q: /* UART9 Clock is PLL2 Q */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
uart_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_UART9_CLKSOURCE_PLL3Q: /* UART9 Clock is PLL3 Q */
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
uart_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_UART9_CLKSOURCE_HSI: /* UART9 Clock is HSI Osc. */
if (LL_RCC_HSI_IsReady() == 1U)
{
uart_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
}
break;
case LL_RCC_UART9_CLKSOURCE_CSI: /* UART9 Clock is CSI Osc. */
if (LL_RCC_CSI_IsReady() == 1U)
{
uart_frequency = CSI_VALUE;
}
break;
case LL_RCC_UART9_CLKSOURCE_LSE: /* UART9 Clock is LSE Osc. */
if (LL_RCC_LSE_IsReady() == 1U)
{
uart_frequency = LSE_VALUE;
}
break;
default:
/* unreachable code */
break;
}
}
#endif /* UART9 */
#if defined(UART12)
else if (UARTxSource == LL_RCC_UART12_CLKSOURCE)
{
/* UART12CLK clock frequency */
switch (LL_RCC_GetUARTClockSource(UARTxSource))
{
case LL_RCC_UART12_CLKSOURCE_PCLK1: /* UART12 Clock is PCLK1 */
uart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
break;
case LL_RCC_UART12_CLKSOURCE_PLL2Q: /* UART12 Clock is PLL2 Q */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
uart_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_UART12_CLKSOURCE_PLL3Q: /* UART12 Clock is PLL3 Q */
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
uart_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_UART12_CLKSOURCE_HSI: /* UART12 Clock is HSI Osc. */
if (LL_RCC_HSI_IsReady() == 1U)
{
uart_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
}
break;
case LL_RCC_UART12_CLKSOURCE_CSI: /* UART12 Clock is CSI Osc. */
if (LL_RCC_CSI_IsReady() == 1U)
{
uart_frequency = CSI_VALUE;
}
break;
case LL_RCC_UART12_CLKSOURCE_LSE: /* UART12 Clock is LSE Osc. */
if (LL_RCC_LSE_IsReady() == 1U)
{
uart_frequency = LSE_VALUE;
}
break;
default:
/* unreachable code */
break;
}
}
#endif /* UART12 */
else
{
/* nothing to do */
}
return uart_frequency;
}
#endif /* UART4 */
/**
* @brief Return SPIx clock frequency
* @param SPIxSource This parameter can be one of the following values:
* @arg @ref LL_RCC_SPI1_CLKSOURCE
* @arg @ref LL_RCC_SPI2_CLKSOURCE
* @arg @ref LL_RCC_SPI3_CLKSOURCE
* @arg @ref LL_RCC_SPI4_CLKSOURCE (*)
* @arg @ref LL_RCC_SPI5_CLKSOURCE (*)
* @arg @ref LL_RCC_SPI6_CLKSOURCE (*)
*
* (*) : For stm32h56xxx and stm32h57xxx family lines only.
* @retval SPI clock frequency (in Hz)
* - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator or PLL is not ready
*/
uint32_t LL_RCC_GetSPIClockFreq(uint32_t SPIxSource)
{
uint32_t spi_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
LL_PLL_ClocksTypeDef PLL_Clocks;
/* Check parameter */
assert_param(IS_LL_RCC_SPI_CLKSOURCE(SPIxSource));
if (SPIxSource == LL_RCC_SPI1_CLKSOURCE)
{
/* SPI1 CLK clock frequency */
switch (LL_RCC_GetSPIClockSource(SPIxSource))
{
case LL_RCC_SPI1_CLKSOURCE_PLL1Q: /* SPI1 Clock is PLL1 Q */
if (LL_RCC_PLL1_IsReady() != 0U)
{
if (LL_RCC_PLL1Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
spi_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_SPI1_CLKSOURCE_PLL2P: /* SPI1 Clock is PLL2 P */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2P_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
spi_frequency = PLL_Clocks.PLL_P_Frequency;
}
}
break;
#if defined(LL_RCC_SPI1_CLKSOURCE_PLL3P)
case LL_RCC_SPI1_CLKSOURCE_PLL3P: /* SPI1 Clock is PLL3 P */
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3P_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
spi_frequency = PLL_Clocks.PLL_P_Frequency;
}
}
break;
#endif /* PLL3 */
case LL_RCC_SPI1_CLKSOURCE_PIN: /* SPI1 Clock is External Clock */
spi_frequency = EXTERNAL_CLOCK_VALUE;
break;
case LL_RCC_SPI1_CLKSOURCE_CLKP: /* SPI1 Clock is CLKP */
spi_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_GetCLKPClockSource(LL_RCC_CLKP_CLKSOURCE));
break;
default:
/* unreachable code */
break;
}
}
else if (SPIxSource == LL_RCC_SPI2_CLKSOURCE)
{
/* SPI2 CLK clock frequency */
switch (LL_RCC_GetSPIClockSource(SPIxSource))
{
case LL_RCC_SPI2_CLKSOURCE_PLL1Q: /* SPI2 Clock is PLL1 Q */
if (LL_RCC_PLL1_IsReady() != 0U)
{
if (LL_RCC_PLL1Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
spi_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_SPI2_CLKSOURCE_PLL2P: /* SPI2 Clock is PLL2 P */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2P_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
spi_frequency = PLL_Clocks.PLL_P_Frequency;
}
}
break;
#if defined(LL_RCC_SPI2_CLKSOURCE_PLL3P)
case LL_RCC_SPI2_CLKSOURCE_PLL3P: /* SPI2 Clock is PLL3 P */
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3P_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
spi_frequency = PLL_Clocks.PLL_P_Frequency;
}
}
break;
#endif /* PLL3 */
case LL_RCC_SPI2_CLKSOURCE_PIN: /* SPI2 Clock is External Clock */
spi_frequency = EXTERNAL_CLOCK_VALUE;
break;
case LL_RCC_SPI2_CLKSOURCE_CLKP: /* SPI2 Clock is CLKP */
spi_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_GetCLKPClockSource(LL_RCC_CLKP_CLKSOURCE));
break;
default:
/* unreachable code */
break;
}
}
else if (SPIxSource == LL_RCC_SPI3_CLKSOURCE)
{
/* SPI3 CLK clock frequency */
switch (LL_RCC_GetSPIClockSource(SPIxSource))
{
case LL_RCC_SPI3_CLKSOURCE_PLL1Q: /* SPI3 Clock is PLL1 Q */
if (LL_RCC_PLL1_IsReady() != 0U)
{
if (LL_RCC_PLL1Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
spi_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_SPI3_CLKSOURCE_PLL2P: /* SPI3 Clock is PLL2 P*/
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2P_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
spi_frequency = PLL_Clocks.PLL_P_Frequency;
}
}
break;
#if defined(LL_RCC_SPI3_CLKSOURCE_PLL3P)
case LL_RCC_SPI3_CLKSOURCE_PLL3P: /* SPI3 Clock is PLL3 P*/
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3P_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
spi_frequency = PLL_Clocks.PLL_P_Frequency;
}
}
break;
#endif /* PLL3 */
case LL_RCC_SPI3_CLKSOURCE_PIN: /* SPI3 Clock is External Clock */
spi_frequency = EXTERNAL_CLOCK_VALUE;
break;
case LL_RCC_SPI3_CLKSOURCE_CLKP: /* SPI3 Clock is CLKP */
spi_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_GetCLKPClockSource(LL_RCC_CLKP_CLKSOURCE));
break;
default:
/* unreachable code */
break;
}
}
#if defined(SPI4)
else if (SPIxSource == LL_RCC_SPI4_CLKSOURCE)
{
/* SPI4 CLK clock frequency */
switch (LL_RCC_GetSPIClockSource(SPIxSource))
{
case LL_RCC_SPI4_CLKSOURCE_PCLK2: /* SPI4 Clock is PCLK2 */
spi_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
break;
case LL_RCC_SPI4_CLKSOURCE_PLL2Q: /* SPI4 Clock is PLL2 Q*/
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
spi_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_SPI4_CLKSOURCE_PLL3Q: /* SPI4 Clock is PLL3 Q*/
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
spi_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_SPI4_CLKSOURCE_HSI: /* SPI4 Clock is HSI Osc. */
if (LL_RCC_HSI_IsReady() == 1U)
{
spi_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
}
break;
case LL_RCC_SPI4_CLKSOURCE_CSI: /* SPI4 Clock is CSI Osc. */
if (LL_RCC_CSI_IsReady() == 1U)
{
spi_frequency = CSI_VALUE;
}
break;
case LL_RCC_SPI4_CLKSOURCE_HSE: /* SPI4 Clock is HSE Osc. */
if (LL_RCC_HSE_IsReady() == 1U)
{
spi_frequency = HSE_VALUE;
}
break;
default:
/* unreachable code */
break;
}
}
#endif /* SPI4 */
#if defined(SPI5)
else if (SPIxSource == LL_RCC_SPI5_CLKSOURCE)
{
/* SPI5 CLK clock frequency */
switch (LL_RCC_GetSPIClockSource(SPIxSource))
{
case LL_RCC_SPI5_CLKSOURCE_PCLK3: /* SPI5 Clock is PCLK3 */
spi_frequency = RCC_GetPCLK3ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
break;
case LL_RCC_SPI5_CLKSOURCE_PLL2Q: /* SPI5 Clock is PLL2 Q*/
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
spi_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_SPI5_CLKSOURCE_PLL3Q: /* SPI5 Clock is PLL3 Q*/
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
spi_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_SPI5_CLKSOURCE_HSI: /* SPI5 Clock is HSI Osc. */
if (LL_RCC_HSI_IsReady() == 1U)
{
spi_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
}
break;
case LL_RCC_SPI5_CLKSOURCE_CSI: /* SPI5 Clock is CSI Osc. */
if (LL_RCC_CSI_IsReady() == 1U)
{
spi_frequency = CSI_VALUE;
}
break;
case LL_RCC_SPI5_CLKSOURCE_HSE: /* SPI5 Clock is HSE Osc. */
if (LL_RCC_HSE_IsReady() == 1U)
{
spi_frequency = HSE_VALUE;
}
break;
default:
/* unreachable code */
break;
}
}
#endif /* SPI5 */
#if defined(SPI6)
else if (SPIxSource == LL_RCC_SPI6_CLKSOURCE)
{
/* SPI6 CLK clock frequency */
switch (LL_RCC_GetSPIClockSource(SPIxSource))
{
case LL_RCC_SPI6_CLKSOURCE_PCLK2: /* SPI6 Clock is PCLK2 */
spi_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
break;
case LL_RCC_SPI6_CLKSOURCE_PLL2Q: /* SPI6 Clock is PLL2 Q*/
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
spi_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_SPI6_CLKSOURCE_PLL3Q: /* SPI6 Clock is PLL3 Q*/
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
spi_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_SPI6_CLKSOURCE_HSI: /* SPI6 Clock is HSI Osc. */
if (LL_RCC_HSI_IsReady() == 1U)
{
spi_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
}
break;
case LL_RCC_SPI6_CLKSOURCE_CSI: /* SPI6 Clock is CSI Osc. */
if (LL_RCC_CSI_IsReady() == 1U)
{
spi_frequency = CSI_VALUE;
}
break;
case LL_RCC_SPI6_CLKSOURCE_HSE: /* SPI6 Clock is HSE Osc. */
if (LL_RCC_HSE_IsReady() == 1U)
{
spi_frequency = HSE_VALUE;
}
break;
default:
/* unreachable code */
break;
}
}
#endif /* SPI6 */
else
{
/* nothing to do */
}
return spi_frequency;
}
/**
* @brief Return I2Cx clock frequency
* @param I2CxSource This parameter can be one of the following values:
* @arg @ref LL_RCC_I2C1_CLKSOURCE
* @arg @ref LL_RCC_I2C2_CLKSOURCE
* @arg @ref LL_RCC_I2C3_CLKSOURCE (*)
* @arg @ref LL_RCC_I2C4_CLKSOURCE (*)
*
* (*) : For stm32h56xxx and stm32h57xxx family lines only.
* @retval I2C clock frequency (in Hz)
* - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator or PLL is not ready
*/
uint32_t LL_RCC_GetI2CClockFreq(uint32_t I2CxSource)
{
uint32_t i2c_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
LL_PLL_ClocksTypeDef PLL_Clocks;
/* Check parameter */
assert_param(IS_LL_RCC_I2C_CLKSOURCE(I2CxSource));
if (I2CxSource == LL_RCC_I2C1_CLKSOURCE)
{
/* I2C1 CLK clock frequency */
switch (LL_RCC_GetI2CClockSource(I2CxSource))
{
case LL_RCC_I2C1_CLKSOURCE_PCLK1: /* I2C1 Clock is PCLK1 */
i2c_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
break;
#if defined(LL_RCC_I2C1_CLKSOURCE_PLL3R)
case LL_RCC_I2C1_CLKSOURCE_PLL3R: /* I2C1 Clock is PLL3 R */
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3R_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
i2c_frequency = PLL_Clocks.PLL_R_Frequency;
}
}
break;
#else
case LL_RCC_I2C1_CLKSOURCE_PLL2R: /* I2C1 Clock is PLL2 R */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2R_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
i2c_frequency = PLL_Clocks.PLL_R_Frequency;
}
}
break;
#endif /* PLL3 */
case LL_RCC_I2C1_CLKSOURCE_HSI: /* I2C1 Clock is HSI Osc. */
if (LL_RCC_HSI_IsReady() == 1U)
{
i2c_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
}
break;
case LL_RCC_I2C1_CLKSOURCE_CSI: /* I2C1 Clock is CSI Osc. */
if (LL_RCC_CSI_IsReady() == 1U)
{
i2c_frequency = CSI_VALUE;
}
break;
default:
/* unreachable code */
break;
}
}
else if (I2CxSource == LL_RCC_I2C2_CLKSOURCE)
{
/* I2C2 CLK clock frequency */
switch (LL_RCC_GetI2CClockSource(I2CxSource))
{
case LL_RCC_I2C2_CLKSOURCE_PCLK1: /* I2C2 Clock is PCLK1 */
i2c_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
break;
#if defined(LL_RCC_I2C2_CLKSOURCE_PLL3R)
case LL_RCC_I2C2_CLKSOURCE_PLL3R: /* I2C2 Clock is PLL3 R */
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3R_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
i2c_frequency = PLL_Clocks.PLL_R_Frequency;
}
}
break;
#else
case LL_RCC_I2C2_CLKSOURCE_PLL2R: /* I2C2 Clock is PLL2 R */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2R_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
i2c_frequency = PLL_Clocks.PLL_R_Frequency;
}
}
break;
#endif /* PLL3 */
case LL_RCC_I2C2_CLKSOURCE_HSI: /* I2C2 Clock is HSI Osc. */
if (LL_RCC_HSI_IsReady() == 1U)
{
i2c_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
}
break;
case LL_RCC_I2C2_CLKSOURCE_CSI: /* I2C2 Clock is CSI Osc. */
if (LL_RCC_CSI_IsReady() == 1U)
{
i2c_frequency = CSI_VALUE;
}
break;
default:
/* unreachable code */
break;
}
}
#if defined(I2C3)
else if (I2CxSource == LL_RCC_I2C3_CLKSOURCE)
{
/* I2C3 CLK clock frequency */
switch (LL_RCC_GetI2CClockSource(I2CxSource))
{
case LL_RCC_I2C3_CLKSOURCE_PCLK3: /* I2C3 Clock is PCLK3 */
i2c_frequency = RCC_GetPCLK3ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
break;
case LL_RCC_I2C3_CLKSOURCE_PLL3R: /* I2C3 Clock is PLL3 R */
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3R_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
i2c_frequency = PLL_Clocks.PLL_R_Frequency;
}
}
break;
case LL_RCC_I2C3_CLKSOURCE_HSI: /* I2C3 Clock is HSI Osc. */
if (LL_RCC_HSI_IsReady() == 1U)
{
i2c_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
}
break;
case LL_RCC_I2C3_CLKSOURCE_CSI: /* I2C3 Clock is CSI Osc. */
if (LL_RCC_CSI_IsReady() == 1U)
{
i2c_frequency = CSI_VALUE;
}
break;
default:
/* unreachable code */
break;
}
}
#endif /* I2C3 */
#if defined(I2C4)
else if (I2CxSource == LL_RCC_I2C4_CLKSOURCE)
{
/* I2C4 CLK clock frequency */
switch (LL_RCC_GetI2CClockSource(I2CxSource))
{
case LL_RCC_I2C4_CLKSOURCE_PCLK3: /* I2C4 Clock is PCLK3 */
i2c_frequency = RCC_GetPCLK3ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
break;
case LL_RCC_I2C4_CLKSOURCE_PLL3R: /* I2C4 Clock is PLL3 R */
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3R_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
i2c_frequency = PLL_Clocks.PLL_R_Frequency;
}
}
break;
case LL_RCC_I2C4_CLKSOURCE_HSI: /* I2C4 Clock is HSI Osc. */
if (LL_RCC_HSI_IsReady() == 1U)
{
i2c_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
}
break;
case LL_RCC_I2C4_CLKSOURCE_CSI: /* I2C4 Clock is CSI Osc. */
if (LL_RCC_CSI_IsReady() == 1U)
{
i2c_frequency = CSI_VALUE;
}
break;
default:
/* unreachable code */
break;
}
}
#endif /* I2C4 */
else
{
/* nothing to do */
}
return i2c_frequency;
}
/**
* @brief Return I3Cx clock frequency
* @param I3CxSource This parameter can be one of the following values:
* @arg @ref LL_RCC_I3C1_CLKSOURCE
* @arg @ref LL_RCC_I3C2_CLKSOURCE (*)
*
* (*) : For stm32h503xx family line only.
* @retval I3C clock frequency (in Hz)
* - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator or PLL is not ready or no clock is selected
*/
uint32_t LL_RCC_GetI3CClockFreq(uint32_t I3CxSource)
{
uint32_t I3C_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
LL_PLL_ClocksTypeDef PLL_Clocks;
/* Check parameter */
assert_param(IS_LL_RCC_I3C_CLKSOURCE(I3CxSource));
if (I3CxSource == LL_RCC_I3C1_CLKSOURCE)
{
/* I3C1 CLK clock frequency */
switch (LL_RCC_GetI3CClockSource(I3CxSource))
{
case LL_RCC_I3C1_CLKSOURCE_PCLK1: /* I3C1 Clock is PCLK1 */
I3C_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
break;
#if defined(LL_RCC_I3C1_CLKSOURCE_PLL3R)
case LL_RCC_I3C1_CLKSOURCE_PLL3R: /* I3C1 Clock is PLL3 R */
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3R_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
I3C_frequency = PLL_Clocks.PLL_R_Frequency;
}
}
break;
#else
case LL_RCC_I3C1_CLKSOURCE_PLL2R: /* I3C1 Clock is PLL2 R */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2R_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
I3C_frequency = PLL_Clocks.PLL_R_Frequency;
}
}
break;
#endif /* LL_RCC_I3C1_CLKSOURCE_PLL3R */
case LL_RCC_I3C1_CLKSOURCE_HSI: /* I3C1 Clock is HSI Osc. */
if (LL_RCC_HSI_IsReady() == 1U)
{
I3C_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
}
break;
case LL_RCC_I3C1_CLKSOURCE_NONE: /* No Clock used for I3C1 */
break;
default:
/* unreachable code */
break;
}
}
#if defined (I3C2)
else if (I3CxSource == LL_RCC_I3C2_CLKSOURCE)
{
/* I3C2 CLK clock frequency */
switch (LL_RCC_GetI3CClockSource(I3CxSource))
{
case LL_RCC_I3C2_CLKSOURCE_PCLK3: /* I3C2 Clock is PCLK3 */
I3C_frequency = RCC_GetPCLK3ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
break;
#if defined(RCC_CR_PLL3ON)
case LL_RCC_I3C2_CLKSOURCE_PLL3R: /* I3C2 Clock is PLL3 R */
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3R_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
I3C_frequency = PLL_Clocks.PLL_R_Frequency;
}
}
#else
case LL_RCC_I3C2_CLKSOURCE_PLL2R: /* I3C2 Clock is PLL2 R */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2R_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
I3C_frequency = PLL_Clocks.PLL_R_Frequency;
}
}
#endif /* PLL3 */
break;
case LL_RCC_I3C2_CLKSOURCE_HSI: /* I3C2 Clock is HSI Osc. */
if (LL_RCC_HSI_IsReady() == 1U)
{
I3C_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
}
break;
case LL_RCC_I3C2_CLKSOURCE_NONE: /* No Clock used for I3C2 */
break;
default:
/* unreachable code */
break;
}
}
#endif /* I3C2 */
else
{
/* nothing to do */
}
return I3C_frequency;
}
/**
* @brief Return LPUARTx clock frequency
* @param LPUARTxSource This parameter can be one of the following values:
* @arg @ref LL_RCC_LPUART1_CLKSOURCE
* @retval LPUART clock frequency (in Hz)
* - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator or PLL is not ready
*/
uint32_t LL_RCC_GetLPUARTClockFreq(uint32_t LPUARTxSource)
{
uint32_t lpuart_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
LL_PLL_ClocksTypeDef PLL_Clocks;
/* Check parameter */
assert_param(IS_LL_RCC_LPUART_CLKSOURCE(LPUARTxSource));
/* LPUART1CLK clock frequency */
switch (LL_RCC_GetLPUARTClockSource(LPUARTxSource))
{
case LL_RCC_LPUART1_CLKSOURCE_PCLK3: /* LPUART1 Clock is is PCLK3 */
lpuart_frequency = RCC_GetPCLK3ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
break;
case LL_RCC_LPUART1_CLKSOURCE_PLL2Q: /* LPUART1 Clock is PLL2 Q */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
lpuart_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
#if defined(LL_RCC_LPUART1_CLKSOURCE_PLL3Q)
case LL_RCC_LPUART1_CLKSOURCE_PLL3Q: /* LPUART1 Clock is PLL3 Q */
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
lpuart_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
#endif /* PLL3 */
case LL_RCC_LPUART1_CLKSOURCE_HSI: /* LPUART1 Clock is HSI Osc. */
if (LL_RCC_HSI_IsReady() == 1U)
{
lpuart_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
}
break;
case LL_RCC_LPUART1_CLKSOURCE_CSI: /* LPUART1 Clock is CSI Osc. */
if (LL_RCC_CSI_IsReady() == 1U)
{
lpuart_frequency = CSI_VALUE;
}
break;
case LL_RCC_LPUART1_CLKSOURCE_LSE: /* LPUART1 Clock is LSE Osc. */
if (LL_RCC_LSE_IsReady() == 1U)
{
lpuart_frequency = LSE_VALUE;
}
break;
default:
/* unreachable code */
break;
}
return lpuart_frequency;
}
/**
* @brief Return LPTIMx clock frequency
* @param LPTIMxSource This parameter can be one of the following values:
* @arg @ref LL_RCC_LPTIM1_CLKSOURCE
* @arg @ref LL_RCC_LPTIM2_CLKSOURCE
* @arg @ref LL_RCC_LPTIM3_CLKSOURCE (*)
* @arg @ref LL_RCC_LPTIM4_CLKSOURCE (*)
* @arg @ref LL_RCC_LPTIM5_CLKSOURCE (*)
* @arg @ref LL_RCC_LPTIM6_CLKSOURCE (*)
*
* (*) : For stm32h56xxx and stm32h57xxx family lines only.
* @retval LPTIM clock frequency (in Hz)
* - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator or PLL is not ready
*/
uint32_t LL_RCC_GetLPTIMClockFreq(uint32_t LPTIMxSource)
{
uint32_t lptim_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
LL_PLL_ClocksTypeDef PLL_Clocks;
/* Check parameter */
assert_param(IS_LL_RCC_LPTIM_CLKSOURCE(LPTIMxSource));
if (LPTIMxSource == LL_RCC_LPTIM1_CLKSOURCE)
{
/* LPTIM1CLK clock frequency */
switch (LL_RCC_GetLPTIMClockSource(LPTIMxSource))
{
case LL_RCC_LPTIM1_CLKSOURCE_PCLK3: /* LPTIM1 Clock is is PCLK3 */
lptim_frequency = RCC_GetPCLK3ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
break;
case LL_RCC_LPTIM1_CLKSOURCE_PLL2P: /* LPTIM1 Clock is PLL2 P */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2P_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
lptim_frequency = PLL_Clocks.PLL_P_Frequency;
}
}
break;
#if defined(LL_RCC_LPTIM1_CLKSOURCE_PLL3R)
case LL_RCC_LPTIM1_CLKSOURCE_PLL3R: /* LPTIM1 Clock is PLL3 R */
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3R_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
lptim_frequency = PLL_Clocks.PLL_R_Frequency;
}
}
break;
#endif /* PLL3 */
case LL_RCC_LPTIM1_CLKSOURCE_LSE: /* LPTIM1 Clock is LSE Osc. */
if (LL_RCC_LSE_IsReady() == 1U)
{
lptim_frequency = LSE_VALUE;
}
break;
case LL_RCC_LPTIM1_CLKSOURCE_LSI: /* LPTIM1 Clock is LSI Osc. */
if (LL_RCC_LSI_IsReady() == 1U)
{
lptim_frequency = LSI_VALUE;
}
break;
case LL_RCC_LPTIM1_CLKSOURCE_CLKP: /* LPTIM1 Clock is CLKP */
lptim_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_GetCLKPClockSource(LL_RCC_CLKP_CLKSOURCE));
break;
default:
/* unreachable code */
break;
}
}
else if (LPTIMxSource == LL_RCC_LPTIM2_CLKSOURCE)
{
/* LPTIM2CLK clock frequency */
switch (LL_RCC_GetLPTIMClockSource(LPTIMxSource))
{
case LL_RCC_LPTIM2_CLKSOURCE_PCLK1: /* LPTIM2 Clock is is PCLK1 */
lptim_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
break;
case LL_RCC_LPTIM2_CLKSOURCE_PLL2P: /* LPTIM2 Clock is PLL2 P */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2P_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
lptim_frequency = PLL_Clocks.PLL_P_Frequency;
}
}
break;
#if defined(LL_RCC_LPTIM2_CLKSOURCE_PLL3R)
case LL_RCC_LPTIM2_CLKSOURCE_PLL3R: /* LPTIM2 Clock is PLL3 R */
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3R_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
lptim_frequency = PLL_Clocks.PLL_R_Frequency;
}
}
break;
#endif /* PLL3 */
case LL_RCC_LPTIM2_CLKSOURCE_LSE: /* LPTIM2 Clock is LSE Osc. */
if (LL_RCC_LSE_IsReady() == 1U)
{
lptim_frequency = LSE_VALUE;
}
break;
case LL_RCC_LPTIM2_CLKSOURCE_LSI: /* LPTIM2 Clock is LSI Osc. */
if (LL_RCC_LSI_IsReady() == 1U)
{
lptim_frequency = LSI_VALUE;
}
break;
case LL_RCC_LPTIM2_CLKSOURCE_CLKP: /* LPTIM2 Clock is CLKP */
lptim_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_GetCLKPClockSource(LL_RCC_CLKP_CLKSOURCE));
break;
default:
/* unreachable code */
break;
}
}
#if defined(LPTIM3)
else if (LPTIMxSource == LL_RCC_LPTIM3_CLKSOURCE)
{
/* LPTIM3CLK clock frequency */
switch (LL_RCC_GetLPTIMClockSource(LPTIMxSource))
{
case LL_RCC_LPTIM3_CLKSOURCE_PCLK3: /* LPTIM3 Clock is is PCLK3 */
lptim_frequency = RCC_GetPCLK3ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
break;
case LL_RCC_LPTIM3_CLKSOURCE_PLL2P: /* LPTIM3 Clock is PLL2 P */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2P_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
lptim_frequency = PLL_Clocks.PLL_P_Frequency;
}
}
break;
case LL_RCC_LPTIM3_CLKSOURCE_PLL3R: /* LPTIM3 Clock is PLL3 R */
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3R_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
lptim_frequency = PLL_Clocks.PLL_R_Frequency;
}
}
break;
case LL_RCC_LPTIM3_CLKSOURCE_LSE: /* LPTIM3 Clock is LSE Osc. */
if (LL_RCC_LSE_IsReady() == 1U)
{
lptim_frequency = LSE_VALUE;
}
break;
case LL_RCC_LPTIM3_CLKSOURCE_LSI: /* LPTIM3 Clock is LSI Osc. */
if (LL_RCC_LSI_IsReady() == 1U)
{
lptim_frequency = LSI_VALUE;
}
break;
case LL_RCC_LPTIM3_CLKSOURCE_CLKP: /* LPTIM3 Clock is CLKP */
lptim_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_GetCLKPClockSource(LL_RCC_CLKP_CLKSOURCE));
break;
default:
/* unreachable code */
break;
}
}
#endif /* LPTIM3 */
#if defined(LPTIM4)
else if (LPTIMxSource == LL_RCC_LPTIM4_CLKSOURCE)
{
/* LPTIM4CLK clock frequency */
switch (LL_RCC_GetLPTIMClockSource(LPTIMxSource))
{
case LL_RCC_LPTIM4_CLKSOURCE_PCLK3: /* LPTIM4 Clock is is PCLK3 */
lptim_frequency = RCC_GetPCLK3ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
break;
case LL_RCC_LPTIM4_CLKSOURCE_PLL2P: /* LPTIM4 Clock is PLL2 P */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2P_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
lptim_frequency = PLL_Clocks.PLL_P_Frequency;
}
}
break;
case LL_RCC_LPTIM4_CLKSOURCE_PLL3R: /* LPTIM4 Clock is PLL3 R */
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3R_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
lptim_frequency = PLL_Clocks.PLL_R_Frequency;
}
}
break;
case LL_RCC_LPTIM4_CLKSOURCE_LSE: /* LPTIM4 Clock is LSE Osc. */
if (LL_RCC_LSE_IsReady() == 1U)
{
lptim_frequency = LSE_VALUE;
}
break;
case LL_RCC_LPTIM4_CLKSOURCE_LSI: /* LPTIM4 Clock is LSI Osc. */
if (LL_RCC_LSI_IsReady() == 1U)
{
lptim_frequency = LSI_VALUE;
}
break;
case LL_RCC_LPTIM4_CLKSOURCE_CLKP: /* LPTIM4 Clock is CLKP */
lptim_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_GetCLKPClockSource(LL_RCC_CLKP_CLKSOURCE));
break;
default:
/* unreachable code */
break;
}
}
#endif /* LPTIM4 */
#if defined(LPTIM5)
else if (LPTIMxSource == LL_RCC_LPTIM5_CLKSOURCE)
{
/* LPTIM5CLK clock frequency */
switch (LL_RCC_GetLPTIMClockSource(LPTIMxSource))
{
case LL_RCC_LPTIM5_CLKSOURCE_PCLK3: /* LPTIM5 Clock is is PCLK3 */
lptim_frequency = RCC_GetPCLK3ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
break;
case LL_RCC_LPTIM5_CLKSOURCE_PLL2P: /* LPTIM5 Clock is PLL2 P */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2P_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
lptim_frequency = PLL_Clocks.PLL_P_Frequency;
}
}
break;
case LL_RCC_LPTIM5_CLKSOURCE_PLL3R: /* LPTIM5 Clock is PLL3 R */
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3R_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
lptim_frequency = PLL_Clocks.PLL_R_Frequency;
}
}
break;
case LL_RCC_LPTIM5_CLKSOURCE_LSE: /* LPTIM5 Clock is LSE Osc. */
if (LL_RCC_LSE_IsReady() == 1U)
{
lptim_frequency = LSE_VALUE;
}
break;
case LL_RCC_LPTIM5_CLKSOURCE_LSI: /* LPTIM5 Clock is LSI Osc. */
if (LL_RCC_LSI_IsReady() == 1U)
{
lptim_frequency = LSI_VALUE;
}
break;
case LL_RCC_LPTIM5_CLKSOURCE_CLKP: /* LPTIM5 Clock is CLKP */
lptim_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_GetCLKPClockSource(LL_RCC_CLKP_CLKSOURCE));
break;
default:
/* unreachable code */
break;
}
}
#endif /* LPTIM5 */
#if defined(LPTIM6)
else if (LPTIMxSource == LL_RCC_LPTIM6_CLKSOURCE)
{
/* LPTIM6CLK clock frequency */
switch (LL_RCC_GetLPTIMClockSource(LPTIMxSource))
{
case LL_RCC_LPTIM6_CLKSOURCE_PCLK3: /* LPTIM6 Clock is is PCLK3 */
lptim_frequency = RCC_GetPCLK3ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
break;
case LL_RCC_LPTIM6_CLKSOURCE_PLL2P: /* LPTIM6 Clock is PLL2 P */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2P_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
lptim_frequency = PLL_Clocks.PLL_P_Frequency;
}
}
break;
case LL_RCC_LPTIM6_CLKSOURCE_PLL3R: /* LPTIM6 Clock is PLL3 R */
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3R_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
lptim_frequency = PLL_Clocks.PLL_R_Frequency;
}
}
break;
case LL_RCC_LPTIM6_CLKSOURCE_LSE: /* LPTIM6 Clock is LSE Osc. */
if (LL_RCC_LSE_IsReady() == 1U)
{
lptim_frequency = LSE_VALUE;
}
break;
case LL_RCC_LPTIM6_CLKSOURCE_LSI: /* LPTIM6 Clock is LSI Osc. */
if (LL_RCC_LSI_IsReady() == 1U)
{
lptim_frequency = LSI_VALUE;
}
break;
case LL_RCC_LPTIM6_CLKSOURCE_CLKP: /* LPTIM6 Clock is CLKP */
lptim_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_GetCLKPClockSource(LL_RCC_CLKP_CLKSOURCE));
break;
default:
/* unreachable code */
break;
}
}
#endif /* LPTIM6 */
else
{
/* nothing to do */
}
return lptim_frequency;
}
#if defined(SAI1)
/**
* @brief Return SAIx clock frequency
* @param SAIxSource This parameter can be one of the following values:
* @arg @ref LL_RCC_SAI1_CLKSOURCE
* @arg @ref LL_RCC_SAI2_CLKSOURCE
* @retval SAI clock frequency (in Hz)
* - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that PLL is not ready
*/
uint32_t LL_RCC_GetSAIClockFreq(uint32_t SAIxSource)
{
uint32_t sai_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
LL_PLL_ClocksTypeDef PLL_Clocks;
/* Check parameter */
assert_param(IS_LL_RCC_SAI_CLKSOURCE(SAIxSource));
if (SAIxSource == LL_RCC_SAI1_CLKSOURCE)
{
/* SAI1CLK clock frequency */
switch (LL_RCC_GetSAIClockSource(SAIxSource))
{
case LL_RCC_SAI1_CLKSOURCE_PLL1Q: /* PLL1 Q clock used as SAI1 clock source */
if (LL_RCC_PLL1_IsReady() != 0U)
{
if (LL_RCC_PLL1Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
sai_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_SAI1_CLKSOURCE_PLL2P: /* PLL2 P clock used as SAI1 clock source */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2P_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
sai_frequency = PLL_Clocks.PLL_P_Frequency;
}
}
break;
case LL_RCC_SAI1_CLKSOURCE_PLL3P: /* PLL3 P clock used as SAI1 clock source */
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3P_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
sai_frequency = PLL_Clocks.PLL_P_Frequency;
}
}
break;
case LL_RCC_SAI1_CLKSOURCE_PIN: /* External input clock used as SAI1 clock source */
sai_frequency = EXTERNAL_CLOCK_VALUE;
break;
case LL_RCC_SAI1_CLKSOURCE_CLKP: /* CLKP used as SAI1 clock source */
sai_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_GetCLKPClockSource(LL_RCC_CLKP_CLKSOURCE));
break;
default:
/* unreachable code */
break;
}
}
else if (SAIxSource == LL_RCC_SAI2_CLKSOURCE)
{
/* SAI2CLK clock frequency */
switch (LL_RCC_GetSAIClockSource(SAIxSource))
{
case LL_RCC_SAI2_CLKSOURCE_PLL1Q: /* PLL1 Q clock used as SAI2 clock source */
if (LL_RCC_PLL1_IsReady() != 0U)
{
if (LL_RCC_PLL1Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
sai_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_SAI2_CLKSOURCE_PLL2P: /* PLL2 P clock used as SAI2 clock source */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2P_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
sai_frequency = PLL_Clocks.PLL_P_Frequency;
}
}
break;
case LL_RCC_SAI2_CLKSOURCE_PLL3P: /* PLL3 P clock used as SAI2 clock source */
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3P_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
sai_frequency = PLL_Clocks.PLL_P_Frequency;
}
}
break;
case LL_RCC_SAI2_CLKSOURCE_PIN: /* External input clock used as SAI2 clock source */
sai_frequency = EXTERNAL_CLOCK_VALUE;
break;
case LL_RCC_SAI2_CLKSOURCE_CLKP: /* SAI2 Clock is CLKP */
sai_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_GetCLKPClockSource(LL_RCC_CLKP_CLKSOURCE));
break;
default:
/* unreachable code */
break;
}
}
else
{
/* nothing to do */
}
return sai_frequency;
}
#endif /* SAI1 */
#if defined(SDMMC1)
/**
* @brief Return SDMMCx clock frequency
* @param SDMMCxSource This parameter can be one of the following values:
* @arg @ref LL_RCC_SDMMC1_CLKSOURCE
* @arg @ref LL_RCC_SDMMC2_CLKSOURCE (*)
* @retval SDMMC clock frequency (in Hz)
* - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator or PLL is not ready
*
* (*) : Available on some STM32H5 lines only.
*/
uint32_t LL_RCC_GetSDMMCClockFreq(uint32_t SDMMCxSource)
{
uint32_t sdmmc_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
LL_PLL_ClocksTypeDef PLL_Clocks;
/* Check parameter */
assert_param(IS_LL_RCC_SDMMC_CLKSOURCE(SDMMCxSource));
if (SDMMCxSource == LL_RCC_SDMMC1_CLKSOURCE)
{
/* SDMMC1CLK clock frequency */
switch (LL_RCC_GetSDMMCClockSource(SDMMCxSource))
{
case LL_RCC_SDMMC1_CLKSOURCE_PLL1Q: /* PLL1 Q clock used as SDMMC1 clock source */
if (LL_RCC_PLL1_IsReady() != 0U)
{
if (LL_RCC_PLL1Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
sdmmc_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_SDMMC1_CLKSOURCE_PLL2R: /* PLL2 R clock used as SDMMC1 clock source */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2R_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
sdmmc_frequency = PLL_Clocks.PLL_R_Frequency;
}
}
break;
default:
/* unreachable code */
break;
}
}
#if defined(SDMMC2)
else if (SDMMCxSource == LL_RCC_SDMMC2_CLKSOURCE)
{
/* SDMMC2CLK clock frequency */
switch (LL_RCC_GetSDMMCClockSource(SDMMCxSource))
{
case LL_RCC_SDMMC2_CLKSOURCE_PLL1Q: /* PLL1 Q clock used as SDMMC2 clock source */
if (LL_RCC_PLL1_IsReady() != 0U)
{
if (LL_RCC_PLL1Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
sdmmc_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_SDMMC2_CLKSOURCE_PLL2R: /* PLL2 R clock used as SDMMC2 clock source */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2R_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
sdmmc_frequency = PLL_Clocks.PLL_R_Frequency;
}
}
break;
default:
/* unreachable code */
break;
}
}
#endif /* SDMMC2 */
else
{
/* nothing to do */
}
return sdmmc_frequency;
}
#endif /* SDMMC1 */
/**
* @brief Return RNGx clock frequency
* @param RNGxSource This parameter can be one of the following values:
* @arg @ref LL_RCC_RNG_CLKSOURCE
* @retval RNG clock frequency (in Hz)
* - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator or PLL is not ready
*/
uint32_t LL_RCC_GetRNGClockFreq(uint32_t RNGxSource)
{
uint32_t rng_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
LL_PLL_ClocksTypeDef PLL_Clocks;
/* Check parameter */
assert_param(IS_LL_RCC_RNG_CLKSOURCE(RNGxSource));
/* RNGCLK clock frequency */
switch (LL_RCC_GetRNGClockSource(RNGxSource))
{
case LL_RCC_RNG_CLKSOURCE_HSI48: /* HSI48 clock used as RNG clock source */
if (LL_RCC_HSI48_IsReady() == 1U)
{
rng_frequency = HSI48_VALUE;
}
break;
case LL_RCC_RNG_CLKSOURCE_PLL1Q: /* PLL1 Q clock used as RNG clock source */
if (LL_RCC_PLL1_IsReady() != 0U)
{
if (LL_RCC_PLL1Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
rng_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_RNG_CLKSOURCE_LSE: /* LSE clock used as RNG clock source */
if (LL_RCC_LSE_IsReady() == 1U)
{
rng_frequency = LSE_VALUE;
}
break;
case LL_RCC_RNG_CLKSOURCE_LSI: /* LSI clock used as RNG clock source */
if (LL_RCC_LSI_IsReady() == 1U)
{
rng_frequency = LSI_VALUE;
}
break;
default:
/* unreachable code */
break;
}
return rng_frequency;
}
#if defined(USB_DRD_FS)
/**
* @brief Return USBx clock frequency
* @param USBxSource This parameter can be one of the following values:
* @arg @ref LL_RCC_USB_CLKSOURCE
* @retval USB clock frequency (in Hz)
* - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator or PLL is not ready or no clock is selected
*/
uint32_t LL_RCC_GetUSBClockFreq(uint32_t USBxSource)
{
uint32_t usb_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
LL_PLL_ClocksTypeDef PLL_Clocks;
/* Check parameter */
assert_param(IS_LL_RCC_USB_CLKSOURCE(USBxSource));
/* USBCLK clock frequency */
switch (LL_RCC_GetUSBClockSource(USBxSource))
{
case LL_RCC_USB_CLKSOURCE_NONE: /* NO clock used as USB clock source */
break;
case LL_RCC_USB_CLKSOURCE_PLL1Q: /* PLL1 Q clock used as USB clock source */
if (LL_RCC_PLL1_IsReady() != 0U)
{
if (LL_RCC_PLL1Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
usb_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
#if defined(LL_RCC_USB_CLKSOURCE_PLL3Q)
case LL_RCC_USB_CLKSOURCE_PLL3Q: /* PLL3 Q clock used as USB clock source */
if (LL_RCC_PLL3_IsReady() != 0U)
{
if (LL_RCC_PLL3Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
usb_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
#else
case LL_RCC_USB_CLKSOURCE_PLL2Q: /* PLL2 Q clock used as USB clock source */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
usb_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
#endif /* LL_RCC_USB_CLKSOURCE_PLL3Q */
case LL_RCC_USB_CLKSOURCE_HSI48: /* HSI48 clock used as USB clock source */
if (LL_RCC_HSI48_IsReady() == 1U)
{
usb_frequency = HSI48_VALUE;
}
break;
default:
/* unreachable code */
break;
}
return usb_frequency;
}
#endif /* USB_DRD_FS */
/**
* @brief Return ADCxDAC clock frequency
* @param ADCDACxSource This parameter can be one of the following values:
* @arg @ref LL_RCC_ADCDAC_CLKSOURCE
* @retval ADCDAC clock frequency (in Hz)
* - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator or PLL is not ready
*/
uint32_t LL_RCC_GetADCDACClockFreq(uint32_t ADCDACxSource)
{
uint32_t adcdac_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
LL_PLL_ClocksTypeDef PLL_Clocks;
/* Check parameter */
assert_param(IS_LL_RCC_ADCDAC_CLKSOURCE(ADCDACxSource));
/* ADCCLK clock frequency */
switch (LL_RCC_GetADCDACClockSource(ADCDACxSource))
{
case LL_RCC_ADCDAC_CLKSOURCE_HCLK: /* ADCDAC Clock is AHB clock */
adcdac_frequency = RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq());
break;
case LL_RCC_ADCDAC_CLKSOURCE_SYSCLK: /* ADCDAC Clock is SYSCLK clock */
adcdac_frequency = RCC_GetSystemClockFreq();
break;
case LL_RCC_ADCDAC_CLKSOURCE_PLL2R: /* ADCDAC Clock is PLL2 R */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2R_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
adcdac_frequency = PLL_Clocks.PLL_R_Frequency;
}
}
break;
case LL_RCC_ADCDAC_CLKSOURCE_HSE: /* ADCDAC Clock is HSE Osc. */
if (LL_RCC_HSE_IsReady() == 1U)
{
adcdac_frequency = HSE_VALUE;
}
break;
case LL_RCC_ADCDAC_CLKSOURCE_HSI: /* ADCDAC Clock is HSI Osc. */
if (LL_RCC_HSI_IsReady() == 1U)
{
adcdac_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
}
break;
case LL_RCC_ADCDAC_CLKSOURCE_CSI: /* ADCDAC Clock is CSI Osc. */
if (LL_RCC_CSI_IsReady() == 1U)
{
adcdac_frequency = CSI_VALUE;
}
break;
default:
/* unreachable code */
break;
}
return adcdac_frequency;
}
/**
* @brief Return DAC low-power clock frequency
* @param DACLPxSource This parameter can be one of the following values:
* @arg @ref LL_RCC_DAC_LP_CLKSOURCE
* @retval DAC low-power clock frequency (in Hz)
* - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that LSI or LSE oscillator is not ready
*/
uint32_t LL_RCC_GetDACLPClockFreq(uint32_t DACLPxSource)
{
uint32_t daclp_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
/* Check parameter */
assert_param(IS_LL_RCC_DAC_LP_CLKSOURCE(DACLPxSource));
/* DAC clock frequency */
switch (LL_RCC_GetDACLPClockSource(DACLPxSource))
{
case LL_RCC_DAC_LP_CLKSOURCE_LSE: /* DAC low-power Clock is LSE Osc. */
if (LL_RCC_LSE_IsReady() == 1U)
{
daclp_frequency = LSE_VALUE;
}
break;
case LL_RCC_DAC_LP_CLKSOURCE_LSI: /* DAC low-power Clock is LSI Osc. */
if (LL_RCC_LSI_IsReady() == 1U)
{
daclp_frequency = LSI_VALUE;
}
break;
default:
/* unreachable code */
break;
}
return daclp_frequency;
}
#if defined( OCTOSPI1)
/**
* @brief Return OCTOSPI clock frequency
* @param OCTOSPIxSource This parameter can be one of the following values:
* @arg @ref LL_RCC_OCTOSPI_CLKSOURCE
* @retval OCTOSPI clock frequency (in Hz)
* - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator or PLL is not ready
*/
uint32_t LL_RCC_GetOCTOSPIClockFreq(uint32_t OCTOSPIxSource)
{
uint32_t octospi_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
LL_PLL_ClocksTypeDef PLL_Clocks;
/* Check parameter */
assert_param(IS_LL_RCC_OCTOSPI_CLKSOURCE(OCTOSPIxSource));
/* OCTOSPI clock frequency */
switch (LL_RCC_GetOCTOSPIClockSource(OCTOSPIxSource))
{
case LL_RCC_OSPI_CLKSOURCE_HCLK: /* OCTOSPI clock is SYSCLK */
octospi_frequency = RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq());
break;
case LL_RCC_OSPI_CLKSOURCE_PLL1Q: /* OSPI Clock is PLL1 Q */
if (LL_RCC_PLL1_IsReady() != 0U)
{
if (LL_RCC_PLL1Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
octospi_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_OSPI_CLKSOURCE_PLL2R: /* OSPI Clock is PLL2 R */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2R_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
octospi_frequency = PLL_Clocks.PLL_R_Frequency;
}
}
break;
case LL_RCC_OSPI_CLKSOURCE_CLKP: /* OSPI Clock is CLKP */
octospi_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_GetCLKPClockSource(LL_RCC_CLKP_CLKSOURCE));
break;
default:
/* unreachable code */
break;
}
return octospi_frequency;
}
#endif /* OCTOSPI1 */
/**
* @brief Return FDCAN kernel clock frequency
* @param FDCANxSource This parameter can be one of the following values:
* @arg @ref LL_RCC_FDCAN_CLKSOURCE
* @retval FDCAN kernel clock frequency (in Hz)
* - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator or PLL is not ready or no clock is selected
*
*/
uint32_t LL_RCC_GetFDCANClockFreq(uint32_t FDCANxSource)
{
uint32_t fdcan_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
LL_PLL_ClocksTypeDef PLL_Clocks;
/* Check parameter */
assert_param(IS_LL_RCC_FDCAN_CLKSOURCE(FDCANxSource));
/* FDCANCLK clock frequency */
switch (LL_RCC_GetFDCANClockSource(FDCANxSource))
{
case LL_RCC_FDCAN_CLKSOURCE_HSE: /* HSE clock used as FDCAN clock source */
if (LL_RCC_HSE_IsReady() == 1U)
{
fdcan_frequency = HSE_VALUE;
}
break;
case LL_RCC_FDCAN_CLKSOURCE_PLL1Q: /* PLL1 Q clock used as FDCAN clock source */
if (LL_RCC_PLL1_IsReady() != 0U)
{
if (LL_RCC_PLL1Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
fdcan_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_FDCAN_CLKSOURCE_PLL2Q: /* PLL2 Q clock used as FDCAN clock source */
if (LL_RCC_PLL2_IsReady() != 0U)
{
if (LL_RCC_PLL2Q_IsEnabled() != 0U)
{
LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
fdcan_frequency = PLL_Clocks.PLL_Q_Frequency;
}
}
break;
case LL_RCC_FDCAN_CLKSOURCE_NONE: /* No clock used as FDCAN clock source */
break;
default:
/* unreachable code */
break;
}
return fdcan_frequency;
}
#if defined(CEC)
/**
* @brief Return CEC clock frequency
* @param CECxSource This parameter can be one of the following values:
* @arg @ref LL_RCC_CEC_CLKSOURCE
* @retval CEC clock frequency (in Hz)
* - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready or no clock is selected
*/
uint32_t LL_RCC_GetCECClockFreq(uint32_t CECxSource)
{
uint32_t cec_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
switch (LL_RCC_GetCECClockSource(CECxSource))
{
case LL_RCC_CEC_CLKSOURCE_LSE: /* CEC Clock is LSE */
if (LL_RCC_LSE_IsReady() != 0U)
{
cec_frequency = LSE_VALUE;
}
break;
case LL_RCC_CEC_CLKSOURCE_LSI: /* CEC Clock is LSI */
if (LL_RCC_LSI_IsReady() != 0U)
{
cec_frequency = LSI_VALUE;
}
break;
case LL_RCC_CEC_CLKSOURCE_CSI_DIV122: /* CEC Clock is CSI divided by 122 */
if (LL_RCC_CSI_IsReady() != 0U)
{
cec_frequency = CSI_VALUE / 122U;
}
break;
case LL_RCC_CEC_CLKSOURCE_NONE: /* No Clock selected for CEC */
break;
default:
/* Kernel clock disabled */
break;
}
return cec_frequency;
}
#endif /* CEC */
/**
* @brief Return CLKP clock frequency
* @param CLKPxSource This parameter can be one of the following values:
* @arg @ref LL_RCC_CLKP_CLKSOURCE
* @retval CLKP clock frequency (in Hz)
* - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready or no clock is selected
*/
uint32_t LL_RCC_GetCLKPClockFreq(uint32_t CLKPxSource)
{
uint32_t clkp_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
switch (LL_RCC_GetCLKPClockSource(CLKPxSource))
{
case LL_RCC_CLKP_CLKSOURCE_HSI: /* HSI used as CLKP clock source */
if (LL_RCC_HSI_IsReady() != 0U)
{
clkp_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
}
break;
case LL_RCC_CLKP_CLKSOURCE_CSI: /* CSI used as CLKP clock source */
if (LL_RCC_CSI_IsReady() != 0U)
{
clkp_frequency = CSI_VALUE;
}
break;
case LL_RCC_CLKP_CLKSOURCE_HSE: /* HSE used as CLKP clock source */
if (LL_RCC_HSE_IsReady() != 0U)
{
clkp_frequency = HSE_VALUE;
}
break;
case LL_RCC_CLKP_CLKSOURCE_NONE: /* NO clock used as CLKP clock source */
break;
default:
/* CLKP clock disabled */
break;
}
return clkp_frequency;
}
/**
* @}
*/
/**
* @}
*/
/** @addtogroup RCC_LL_Private_Functions
* @{
*/
/**
* @brief Return SYSTEM clock frequency
* @retval SYSTEM clock frequency (in Hz)
*/
uint32_t RCC_GetSystemClockFreq(void)
{
uint32_t frequency;
/* Get SYSCLK source -------------------------------------------------------*/
switch (LL_RCC_GetSysClkSource())
{
case LL_RCC_SYS_CLKSOURCE_STATUS_HSI: /* HSI used as system clock source */
frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
break;
case LL_RCC_SYS_CLKSOURCE_STATUS_CSI: /* CSI used as system clock source */
frequency = CSI_VALUE;
break;
case LL_RCC_SYS_CLKSOURCE_STATUS_HSE: /* HSE used as system clock source */
frequency = HSE_VALUE;
break;
case LL_RCC_SYS_CLKSOURCE_STATUS_PLL1: /* PLL1 used as system clock source */
frequency = RCC_PLL1_GetFreqSystem();
break;
default:
frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
break;
}
return frequency;
}
/**
* @brief Return HCLK clock frequency
* @param SYSCLK_Frequency SYSCLK clock frequency
* @retval HCLK clock frequency (in Hz)
*/
uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency)
{
/* HCLK clock frequency */
return __LL_RCC_CALC_HCLK_FREQ(SYSCLK_Frequency, LL_RCC_GetAHBPrescaler());
}
/**
* @brief Return PCLK1 clock frequency
* @param HCLK_Frequency HCLK clock frequency
* @retval PCLK1 clock frequency (in Hz)
*/
uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency)
{
/* PCLK1 clock frequency */
return __LL_RCC_CALC_PCLK1_FREQ(HCLK_Frequency, LL_RCC_GetAPB1Prescaler());
}
/**
* @brief Return PCLK2 clock frequency
* @param HCLK_Frequency HCLK clock frequency
* @retval PCLK2 clock frequency (in Hz)
*/
uint32_t RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency)
{
/* PCLK2 clock frequency */
return __LL_RCC_CALC_PCLK2_FREQ(HCLK_Frequency, LL_RCC_GetAPB2Prescaler());
}
/**
* @brief Return PCLK3 clock frequency
* @param HCLK_Frequency HCLK clock frequency
* @retval PCLK3 clock frequency (in Hz)
*/
uint32_t RCC_GetPCLK3ClockFreq(uint32_t HCLK_Frequency)
{
/* PCLK3 clock frequency */
return __LL_RCC_CALC_PCLK3_FREQ(HCLK_Frequency, LL_RCC_GetAPB3Prescaler());
}
/**
* @brief Return PLL1 clock frequency used for system clock
* @retval PLL1 clock frequency (in Hz)
*/
uint32_t RCC_PLL1_GetFreqSystem(void)
{
uint32_t pllinputfreq;
uint32_t pllsource;
/* PLL_VCO = (HSE_VALUE or HSI_VALUE or CSI_VALUE/ PLLM) * PLLN
SYSCLK = PLL_VCO / PLLP
*/
pllsource = LL_RCC_PLL1_GetSource();
switch (pllsource)
{
case LL_RCC_PLL1SOURCE_HSI: /* HSI used as PLL1 clock source */
pllinputfreq = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
break;
case LL_RCC_PLL1SOURCE_CSI: /* CSI used as PLL1 clock source */
pllinputfreq = CSI_VALUE;
break;
case LL_RCC_PLL1SOURCE_HSE: /* HSE used as PLL1 clock source */
pllinputfreq = HSE_VALUE;
break;
default:
pllinputfreq = 0;
break;
}
return __LL_RCC_CALC_PLL1CLK_P_FREQ(pllinputfreq, LL_RCC_PLL1_GetM(),
LL_RCC_PLL1_GetN(), LL_RCC_PLL1_GetP());
}
/**
* @}
*/
/**
* @}
*/
#endif /* defined(RCC) */
/**
* @}
*/
#endif /* USE_FULL_LL_DRIVER */