| /** |
| ****************************************************************************** |
| * @file stm32f7xx_hal_rcc_ex.c |
| * @author MCD Application Team |
| * @brief Extension RCC HAL module driver. |
| * This file provides firmware functions to manage the following |
| * functionalities RCC extension peripheral: |
| * + Extended Peripheral Control functions |
| * |
| ****************************************************************************** |
| * @attention |
| * |
| * Copyright (c) 2017 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. |
| ****************************************************************************** |
| */ |
| |
| /* Includes ------------------------------------------------------------------*/ |
| #include "stm32f7xx_hal.h" |
| |
| /** @addtogroup STM32F7xx_HAL_Driver |
| * @{ |
| */ |
| |
| /** @defgroup RCCEx RCCEx |
| * @brief RCCEx HAL module driver |
| * @{ |
| */ |
| |
| #ifdef HAL_RCC_MODULE_ENABLED |
| |
| /* Private typedef -----------------------------------------------------------*/ |
| /* Private define ------------------------------------------------------------*/ |
| /** @defgroup RCCEx_Private_Defines RCCEx Private Defines |
| * @{ |
| */ |
| /** |
| * @} |
| */ |
| /* Private macro -------------------------------------------------------------*/ |
| /** @defgroup RCCEx_Private_Macros RCCEx Private Macros |
| * @{ |
| */ |
| /** |
| * @} |
| */ |
| |
| /** @defgroup RCCEx_Private_Macros RCCEx Private Macros |
| * @{ |
| */ |
| |
| /** |
| * @} |
| */ |
| |
| |
| /* Private variables ---------------------------------------------------------*/ |
| /* Private function prototypes -----------------------------------------------*/ |
| /* Private functions ---------------------------------------------------------*/ |
| |
| /** @defgroup RCCEx_Exported_Functions RCCEx Exported Functions |
| * @{ |
| */ |
| |
| /** @defgroup RCCEx_Exported_Functions_Group1 Extended Peripheral Control functions |
| * @brief Extended Peripheral Control functions |
| * |
| @verbatim |
| =============================================================================== |
| ##### Extended Peripheral Control functions ##### |
| =============================================================================== |
| [..] |
| This subsection provides a set of functions allowing to control the RCC Clocks |
| frequencies. |
| [..] |
| (@) Important note: Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to |
| select the RTC clock source; in this case the Backup domain will be reset in |
| order to modify the RTC Clock source, as consequence RTC registers (including |
| the backup registers) and RCC_BDCR register will be set to their reset values. |
| |
| @endverbatim |
| * @{ |
| */ |
| #if defined (STM32F745xx) || defined (STM32F746xx) || defined (STM32F756xx) || defined (STM32F765xx) || \ |
| defined (STM32F767xx) || defined (STM32F769xx) || defined (STM32F777xx) || defined (STM32F779xx) || \ |
| defined (STM32F750xx) |
| /** |
| * @brief Initializes the RCC extended peripherals clocks according to the specified |
| * parameters in the RCC_PeriphCLKInitTypeDef. |
| * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that |
| * contains the configuration information for the Extended Peripherals |
| * clocks(I2S, SAI, LTDC, RTC, TIM, UARTs, USARTs, LTPIM, SDMMC...). |
| * |
| * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select |
| * the RTC clock source; in this case the Backup domain will be reset in |
| * order to modify the RTC Clock source, as consequence RTC registers (including |
| * the backup registers) are set to their reset values. |
| * |
| * @retval HAL status |
| */ |
| HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) |
| { |
| uint32_t tickstart = 0; |
| uint32_t tmpreg0 = 0; |
| uint32_t tmpreg1 = 0; |
| uint32_t plli2sused = 0; |
| uint32_t pllsaiused = 0; |
| |
| /* Check the parameters */ |
| assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); |
| |
| /*----------------------------------- I2S configuration ----------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == (RCC_PERIPHCLK_I2S)) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_I2SCLKSOURCE(PeriphClkInit->I2sClockSelection)); |
| |
| /* Configure I2S Clock source */ |
| __HAL_RCC_I2S_CONFIG(PeriphClkInit->I2sClockSelection); |
| |
| /* Enable the PLLI2S when it's used as clock source for I2S */ |
| if(PeriphClkInit->I2sClockSelection == RCC_I2SCLKSOURCE_PLLI2S) |
| { |
| plli2sused = 1; |
| } |
| } |
| |
| /*------------------------------------ SAI1 configuration --------------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == (RCC_PERIPHCLK_SAI1)) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_SAI1CLKSOURCE(PeriphClkInit->Sai1ClockSelection)); |
| |
| /* Configure SAI1 Clock source */ |
| __HAL_RCC_SAI1_CONFIG(PeriphClkInit->Sai1ClockSelection); |
| /* Enable the PLLI2S when it's used as clock source for SAI */ |
| if(PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLI2S) |
| { |
| plli2sused = 1; |
| } |
| /* Enable the PLLSAI when it's used as clock source for SAI */ |
| if(PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLSAI) |
| { |
| pllsaiused = 1; |
| } |
| } |
| |
| /*------------------------------------ SAI2 configuration --------------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == (RCC_PERIPHCLK_SAI2)) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_SAI2CLKSOURCE(PeriphClkInit->Sai2ClockSelection)); |
| |
| /* Configure SAI2 Clock source */ |
| __HAL_RCC_SAI2_CONFIG(PeriphClkInit->Sai2ClockSelection); |
| |
| /* Enable the PLLI2S when it's used as clock source for SAI */ |
| if(PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLI2S) |
| { |
| plli2sused = 1; |
| } |
| /* Enable the PLLSAI when it's used as clock source for SAI */ |
| if(PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLSAI) |
| { |
| pllsaiused = 1; |
| } |
| } |
| |
| /*-------------------------------------- SPDIF-RX Configuration -----------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SPDIFRX) == RCC_PERIPHCLK_SPDIFRX) |
| { |
| plli2sused = 1; |
| } |
| |
| /*------------------------------------ RTC configuration --------------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) |
| { |
| /* Check for RTC Parameters used to output RTCCLK */ |
| assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); |
| |
| /* Enable Power Clock*/ |
| __HAL_RCC_PWR_CLK_ENABLE(); |
| |
| /* Enable write access to Backup domain */ |
| PWR->CR1 |= PWR_CR1_DBP; |
| |
| /* Get Start Tick*/ |
| tickstart = HAL_GetTick(); |
| |
| /* Wait for Backup domain Write protection disable */ |
| while((PWR->CR1 & PWR_CR1_DBP) == RESET) |
| { |
| if((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) |
| { |
| return HAL_TIMEOUT; |
| } |
| } |
| |
| /* Reset the Backup domain only if the RTC Clock source selection is modified */ |
| tmpreg0 = (RCC->BDCR & RCC_BDCR_RTCSEL); |
| |
| if((tmpreg0 != 0x00000000U) && (tmpreg0 != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) |
| { |
| /* Store the content of BDCR register before the reset of Backup Domain */ |
| tmpreg0 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); |
| |
| /* RTC Clock selection can be changed only if the Backup Domain is reset */ |
| __HAL_RCC_BACKUPRESET_FORCE(); |
| __HAL_RCC_BACKUPRESET_RELEASE(); |
| |
| /* Restore the Content of BDCR register */ |
| RCC->BDCR = tmpreg0; |
| |
| /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ |
| if (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) |
| { |
| /* Get Start Tick*/ |
| tickstart = HAL_GetTick(); |
| |
| /* Wait till LSE is ready */ |
| while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) |
| { |
| if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) |
| { |
| return HAL_TIMEOUT; |
| } |
| } |
| } |
| } |
| __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); |
| } |
| |
| /*------------------------------------ TIM configuration --------------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_TIMPRES(PeriphClkInit->TIMPresSelection)); |
| |
| /* Configure Timer Prescaler */ |
| __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); |
| } |
| |
| /*-------------------------------------- I2C1 Configuration -----------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C1) == RCC_PERIPHCLK_I2C1) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_I2C1CLKSOURCE(PeriphClkInit->I2c1ClockSelection)); |
| |
| /* Configure the I2C1 clock source */ |
| __HAL_RCC_I2C1_CONFIG(PeriphClkInit->I2c1ClockSelection); |
| } |
| |
| /*-------------------------------------- I2C2 Configuration -----------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C2) == RCC_PERIPHCLK_I2C2) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_I2C2CLKSOURCE(PeriphClkInit->I2c2ClockSelection)); |
| |
| /* Configure the I2C2 clock source */ |
| __HAL_RCC_I2C2_CONFIG(PeriphClkInit->I2c2ClockSelection); |
| } |
| |
| /*-------------------------------------- I2C3 Configuration -----------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C3) == RCC_PERIPHCLK_I2C3) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_I2C3CLKSOURCE(PeriphClkInit->I2c3ClockSelection)); |
| |
| /* Configure the I2C3 clock source */ |
| __HAL_RCC_I2C3_CONFIG(PeriphClkInit->I2c3ClockSelection); |
| } |
| |
| /*-------------------------------------- I2C4 Configuration -----------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C4) == RCC_PERIPHCLK_I2C4) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_I2C4CLKSOURCE(PeriphClkInit->I2c4ClockSelection)); |
| |
| /* Configure the I2C4 clock source */ |
| __HAL_RCC_I2C4_CONFIG(PeriphClkInit->I2c4ClockSelection); |
| } |
| |
| /*-------------------------------------- USART1 Configuration -----------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USART1) == RCC_PERIPHCLK_USART1) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_USART1CLKSOURCE(PeriphClkInit->Usart1ClockSelection)); |
| |
| /* Configure the USART1 clock source */ |
| __HAL_RCC_USART1_CONFIG(PeriphClkInit->Usart1ClockSelection); |
| } |
| |
| /*-------------------------------------- USART2 Configuration -----------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USART2) == RCC_PERIPHCLK_USART2) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_USART2CLKSOURCE(PeriphClkInit->Usart2ClockSelection)); |
| |
| /* Configure the USART2 clock source */ |
| __HAL_RCC_USART2_CONFIG(PeriphClkInit->Usart2ClockSelection); |
| } |
| |
| /*-------------------------------------- USART3 Configuration -----------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USART3) == RCC_PERIPHCLK_USART3) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_USART3CLKSOURCE(PeriphClkInit->Usart3ClockSelection)); |
| |
| /* Configure the USART3 clock source */ |
| __HAL_RCC_USART3_CONFIG(PeriphClkInit->Usart3ClockSelection); |
| } |
| |
| /*-------------------------------------- UART4 Configuration -----------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_UART4) == RCC_PERIPHCLK_UART4) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_UART4CLKSOURCE(PeriphClkInit->Uart4ClockSelection)); |
| |
| /* Configure the UART4 clock source */ |
| __HAL_RCC_UART4_CONFIG(PeriphClkInit->Uart4ClockSelection); |
| } |
| |
| /*-------------------------------------- UART5 Configuration -----------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_UART5) == RCC_PERIPHCLK_UART5) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_UART5CLKSOURCE(PeriphClkInit->Uart5ClockSelection)); |
| |
| /* Configure the UART5 clock source */ |
| __HAL_RCC_UART5_CONFIG(PeriphClkInit->Uart5ClockSelection); |
| } |
| |
| /*-------------------------------------- USART6 Configuration -----------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USART6) == RCC_PERIPHCLK_USART6) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_USART6CLKSOURCE(PeriphClkInit->Usart6ClockSelection)); |
| |
| /* Configure the USART6 clock source */ |
| __HAL_RCC_USART6_CONFIG(PeriphClkInit->Usart6ClockSelection); |
| } |
| |
| /*-------------------------------------- UART7 Configuration -----------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_UART7) == RCC_PERIPHCLK_UART7) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_UART7CLKSOURCE(PeriphClkInit->Uart7ClockSelection)); |
| |
| /* Configure the UART7 clock source */ |
| __HAL_RCC_UART7_CONFIG(PeriphClkInit->Uart7ClockSelection); |
| } |
| |
| /*-------------------------------------- UART8 Configuration -----------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_UART8) == RCC_PERIPHCLK_UART8) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_UART8CLKSOURCE(PeriphClkInit->Uart8ClockSelection)); |
| |
| /* Configure the UART8 clock source */ |
| __HAL_RCC_UART8_CONFIG(PeriphClkInit->Uart8ClockSelection); |
| } |
| |
| /*--------------------------------------- CEC Configuration -----------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CEC) == RCC_PERIPHCLK_CEC) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_CECCLKSOURCE(PeriphClkInit->CecClockSelection)); |
| |
| /* Configure the CEC clock source */ |
| __HAL_RCC_CEC_CONFIG(PeriphClkInit->CecClockSelection); |
| } |
| |
| /*-------------------------------------- CK48 Configuration -----------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_CLK48SOURCE(PeriphClkInit->Clk48ClockSelection)); |
| |
| /* Configure the CLK48 source */ |
| __HAL_RCC_CLK48_CONFIG(PeriphClkInit->Clk48ClockSelection); |
| |
| /* Enable the PLLSAI when it's used as clock source for CK48 */ |
| if(PeriphClkInit->Clk48ClockSelection == RCC_CLK48SOURCE_PLLSAIP) |
| { |
| pllsaiused = 1; |
| } |
| } |
| |
| /*-------------------------------------- LTDC Configuration -----------------------------------*/ |
| #if defined(STM32F746xx) || defined(STM32F756xx) || defined (STM32F767xx) || defined (STM32F769xx) || defined (STM32F777xx) || defined (STM32F779xx) || defined (STM32F750xx) |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == RCC_PERIPHCLK_LTDC) |
| { |
| pllsaiused = 1; |
| } |
| #endif /* STM32F746xx || STM32F756xx || STM32F767xx || STM32F769xx || STM32F777xx || STM32F779xx || STM32F750xx */ |
| |
| /*-------------------------------------- LPTIM1 Configuration -----------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPTIM1) == RCC_PERIPHCLK_LPTIM1) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_LPTIM1CLK(PeriphClkInit->Lptim1ClockSelection)); |
| |
| /* Configure the LTPIM1 clock source */ |
| __HAL_RCC_LPTIM1_CONFIG(PeriphClkInit->Lptim1ClockSelection); |
| } |
| |
| /*------------------------------------- SDMMC1 Configuration ------------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDMMC1) == RCC_PERIPHCLK_SDMMC1) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_SDMMC1CLKSOURCE(PeriphClkInit->Sdmmc1ClockSelection)); |
| |
| /* Configure the SDMMC1 clock source */ |
| __HAL_RCC_SDMMC1_CONFIG(PeriphClkInit->Sdmmc1ClockSelection); |
| } |
| |
| #if defined (STM32F765xx) || defined (STM32F767xx) || defined (STM32F769xx) || defined (STM32F777xx) || defined (STM32F779xx) |
| /*------------------------------------- SDMMC2 Configuration ------------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDMMC2) == RCC_PERIPHCLK_SDMMC2) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_SDMMC2CLKSOURCE(PeriphClkInit->Sdmmc2ClockSelection)); |
| |
| /* Configure the SDMMC2 clock source */ |
| __HAL_RCC_SDMMC2_CONFIG(PeriphClkInit->Sdmmc2ClockSelection); |
| } |
| |
| /*------------------------------------- DFSDM1 Configuration -------------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM1) == RCC_PERIPHCLK_DFSDM1) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_DFSDM1CLKSOURCE(PeriphClkInit->Dfsdm1ClockSelection)); |
| |
| /* Configure the DFSDM1 interface clock source */ |
| __HAL_RCC_DFSDM1_CONFIG(PeriphClkInit->Dfsdm1ClockSelection); |
| } |
| |
| /*------------------------------------- DFSDM AUDIO Configuration -------------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM1_AUDIO) == RCC_PERIPHCLK_DFSDM1_AUDIO) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_DFSDM1AUDIOCLKSOURCE(PeriphClkInit->Dfsdm1AudioClockSelection)); |
| |
| /* Configure the DFSDM interface clock source */ |
| __HAL_RCC_DFSDM1AUDIO_CONFIG(PeriphClkInit->Dfsdm1AudioClockSelection); |
| } |
| #endif /* STM32F767xx || STM32F769xx || STM32F777xx || STM32F779xx */ |
| |
| /*-------------------------------------- PLLI2S Configuration ---------------------------------*/ |
| /* PLLI2S is configured when a peripheral will use it as source clock : SAI1, SAI2, I2S or SPDIF-RX */ |
| if((plli2sused == 1) || ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S)) |
| { |
| /* Disable the PLLI2S */ |
| __HAL_RCC_PLLI2S_DISABLE(); |
| |
| /* Get Start Tick*/ |
| tickstart = HAL_GetTick(); |
| |
| /* Wait till PLLI2S is disabled */ |
| while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) |
| { |
| if((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) |
| { |
| /* return in case of Timeout detected */ |
| return HAL_TIMEOUT; |
| } |
| } |
| |
| /* check for common PLLI2S Parameters */ |
| assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); |
| |
| /*----------------- In Case of PLLI2S is selected as source clock for I2S -------------------*/ |
| if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) && (PeriphClkInit->I2sClockSelection == RCC_I2SCLKSOURCE_PLLI2S))) |
| { |
| /* check for Parameters */ |
| assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); |
| |
| /* Read PLLI2SP and PLLI2SQ value from PLLI2SCFGR register (this value is not needed for I2S configuration) */ |
| tmpreg0 = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos); |
| tmpreg1 = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); |
| /* Configure the PLLI2S division factors */ |
| /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) x (PLLI2SN/PLLM) */ |
| /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ |
| __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , tmpreg0, tmpreg1, PeriphClkInit->PLLI2S.PLLI2SR); |
| } |
| |
| /*----------------- In Case of PLLI2S is selected as source clock for SAI -------------------*/ |
| if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == RCC_PERIPHCLK_SAI1) && (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLI2S)) || |
| ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == RCC_PERIPHCLK_SAI2) && (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLI2S))) |
| { |
| /* Check for PLLI2S Parameters */ |
| assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); |
| /* Check for PLLI2S/DIVQ parameters */ |
| assert_param(IS_RCC_PLLI2S_DIVQ_VALUE(PeriphClkInit->PLLI2SDivQ)); |
| |
| /* Read PLLI2SP and PLLI2SR values from PLLI2SCFGR register (this value is not needed for SAI configuration) */ |
| tmpreg0 = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos); |
| tmpreg1 = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); |
| /* Configure the PLLI2S division factors */ |
| /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ |
| /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ |
| /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ |
| __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, tmpreg0, PeriphClkInit->PLLI2S.PLLI2SQ, tmpreg1); |
| |
| /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ |
| __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLI2SDivQ); |
| } |
| |
| /*----------------- In Case of PLLI2S is selected as source clock for SPDIF-RX -------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SPDIFRX) == RCC_PERIPHCLK_SPDIFRX) |
| { |
| /* check for Parameters */ |
| assert_param(IS_RCC_PLLI2SP_VALUE(PeriphClkInit->PLLI2S.PLLI2SP)); |
| |
| /* Read PLLI2SR value from PLLI2SCFGR register (this value is not needed for SPDIF-RX configuration) */ |
| tmpreg0 = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); |
| tmpreg1 = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); |
| /* Configure the PLLI2S division factors */ |
| /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) x (PLLI2SN/PLLM) */ |
| /* SPDIFCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SP */ |
| __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SP, tmpreg0, tmpreg1); |
| } |
| |
| /*----------------- In Case of PLLI2S is just selected -----------------*/ |
| if((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) |
| { |
| /* Check for Parameters */ |
| assert_param(IS_RCC_PLLI2SP_VALUE(PeriphClkInit->PLLI2S.PLLI2SP)); |
| assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); |
| assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); |
| |
| /* Configure the PLLI2S division factors */ |
| /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) x (PLLI2SN/PLLI2SM) */ |
| /* SPDIFRXCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SP */ |
| __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SP, PeriphClkInit->PLLI2S.PLLI2SQ, PeriphClkInit->PLLI2S.PLLI2SR); |
| } |
| |
| /* Enable the PLLI2S */ |
| __HAL_RCC_PLLI2S_ENABLE(); |
| |
| /* Get Start Tick*/ |
| tickstart = HAL_GetTick(); |
| |
| /* Wait till PLLI2S is ready */ |
| while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) |
| { |
| if((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) |
| { |
| /* return in case of Timeout detected */ |
| return HAL_TIMEOUT; |
| } |
| } |
| } |
| |
| /*-------------------------------------- PLLSAI Configuration ---------------------------------*/ |
| /* PLLSAI is configured when a peripheral will use it as source clock : SAI1, SAI2, LTDC or CK48 */ |
| if(pllsaiused == 1) |
| { |
| /* Disable PLLSAI Clock */ |
| __HAL_RCC_PLLSAI_DISABLE(); |
| |
| /* Get Start Tick*/ |
| tickstart = HAL_GetTick(); |
| |
| /* Wait till PLLSAI is disabled */ |
| while(__HAL_RCC_PLLSAI_GET_FLAG() != RESET) |
| { |
| if((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) |
| { |
| /* return in case of Timeout detected */ |
| return HAL_TIMEOUT; |
| } |
| } |
| |
| /* Check the PLLSAI division factors */ |
| assert_param(IS_RCC_PLLSAIN_VALUE(PeriphClkInit->PLLSAI.PLLSAIN)); |
| |
| /*----------------- In Case of PLLSAI is selected as source clock for SAI -------------------*/ |
| if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == RCC_PERIPHCLK_SAI1) && (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLSAI)) ||\ |
| ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == RCC_PERIPHCLK_SAI2) && (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLSAI))) |
| { |
| /* check for PLLSAIQ Parameter */ |
| assert_param(IS_RCC_PLLSAIQ_VALUE(PeriphClkInit->PLLSAI.PLLSAIQ)); |
| /* check for PLLSAI/DIVQ Parameter */ |
| assert_param(IS_RCC_PLLSAI_DIVQ_VALUE(PeriphClkInit->PLLSAIDivQ)); |
| |
| /* Read PLLSAIP value from PLLSAICFGR register (this value is not needed for SAI configuration) */ |
| tmpreg0 = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos); |
| tmpreg1 = ((RCC->PLLSAICFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); |
| /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ |
| /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ |
| /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ |
| __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN , tmpreg0, PeriphClkInit->PLLSAI.PLLSAIQ, tmpreg1); |
| |
| /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ |
| __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLSAIDivQ); |
| } |
| |
| /*----------------- In Case of PLLSAI is selected as source clock for CLK48 -------------------*/ |
| /* In Case of PLLI2S is selected as source clock for CK48 */ |
| if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) && (PeriphClkInit->Clk48ClockSelection == RCC_CLK48SOURCE_PLLSAIP)) |
| { |
| /* check for Parameters */ |
| assert_param(IS_RCC_PLLSAIP_VALUE(PeriphClkInit->PLLSAI.PLLSAIP)); |
| /* Read PLLSAIQ and PLLSAIR value from PLLSAICFGR register (this value is not needed for CK48 configuration) */ |
| tmpreg0 = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); |
| tmpreg1 = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); |
| |
| /* Configure the PLLSAI division factors */ |
| /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) x (PLLI2SN/PLLM) */ |
| /* 48CLK = f(PLLSAI clock output) = f(VCO clock) / PLLSAIP */ |
| __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN , PeriphClkInit->PLLSAI.PLLSAIP, tmpreg0, tmpreg1); |
| } |
| |
| #if defined(STM32F746xx) || defined(STM32F756xx) || defined (STM32F767xx) || defined (STM32F769xx) || defined (STM32F777xx) || defined (STM32F779xx) || defined (STM32F750xx) |
| /*---------------------------- LTDC configuration -------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == (RCC_PERIPHCLK_LTDC)) |
| { |
| assert_param(IS_RCC_PLLSAIR_VALUE(PeriphClkInit->PLLSAI.PLLSAIR)); |
| assert_param(IS_RCC_PLLSAI_DIVR_VALUE(PeriphClkInit->PLLSAIDivR)); |
| |
| /* Read PLLSAIP and PLLSAIQ value from PLLSAICFGR register (these value are not needed for LTDC configuration) */ |
| tmpreg0 = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); |
| tmpreg1 = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos); |
| |
| /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ |
| /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ |
| /* LTDC_CLK(first level) = PLLSAI_VCO Output/PLLSAIR */ |
| __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN , tmpreg1, tmpreg0, PeriphClkInit->PLLSAI.PLLSAIR); |
| |
| /* LTDC_CLK = LTDC_CLK(first level)/PLLSAIDIVR */ |
| __HAL_RCC_PLLSAI_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLSAIDivR); |
| } |
| #endif /* STM32F746xx || STM32F756xx || STM32F767xx || STM32F769xx || STM32F777xx || STM32F779xx || STM32F750xx */ |
| |
| /* Enable PLLSAI Clock */ |
| __HAL_RCC_PLLSAI_ENABLE(); |
| |
| /* Get Start Tick*/ |
| tickstart = HAL_GetTick(); |
| |
| /* Wait till PLLSAI is ready */ |
| while(__HAL_RCC_PLLSAI_GET_FLAG() == RESET) |
| { |
| if((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) |
| { |
| /* return in case of Timeout detected */ |
| return HAL_TIMEOUT; |
| } |
| } |
| } |
| return HAL_OK; |
| } |
| |
| /** |
| * @brief Get the RCC_PeriphCLKInitTypeDef according to the internal |
| * RCC configuration registers. |
| * @param PeriphClkInit pointer to the configured RCC_PeriphCLKInitTypeDef structure |
| * @retval None |
| */ |
| void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) |
| { |
| uint32_t tempreg = 0; |
| |
| /* Set all possible values for the extended clock type parameter------------*/ |
| #if defined (STM32F765xx) || defined (STM32F767xx) || defined (STM32F769xx) || defined (STM32F777xx) || defined (STM32F779xx) |
| PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_LPTIM1 |\ |
| RCC_PERIPHCLK_SAI1 | RCC_PERIPHCLK_SAI2 |\ |
| RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC |\ |
| RCC_PERIPHCLK_CEC | RCC_PERIPHCLK_I2C4 |\ |
| RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_I2C2 |\ |
| RCC_PERIPHCLK_I2C3 | RCC_PERIPHCLK_USART1 |\ |
| RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 |\ |
| RCC_PERIPHCLK_UART4 | RCC_PERIPHCLK_UART5 |\ |
| RCC_PERIPHCLK_USART6 | RCC_PERIPHCLK_UART7 |\ |
| RCC_PERIPHCLK_UART8 | RCC_PERIPHCLK_SDMMC1 |\ |
| RCC_PERIPHCLK_CLK48 | RCC_PERIPHCLK_SDMMC2 |\ |
| RCC_PERIPHCLK_DFSDM1 | RCC_PERIPHCLK_DFSDM1_AUDIO; |
| #else |
| PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_LPTIM1 |\ |
| RCC_PERIPHCLK_SAI1 | RCC_PERIPHCLK_SAI2 |\ |
| RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC |\ |
| RCC_PERIPHCLK_CEC | RCC_PERIPHCLK_I2C4 |\ |
| RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_I2C2 |\ |
| RCC_PERIPHCLK_I2C3 | RCC_PERIPHCLK_USART1 |\ |
| RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 |\ |
| RCC_PERIPHCLK_UART4 | RCC_PERIPHCLK_UART5 |\ |
| RCC_PERIPHCLK_USART6 | RCC_PERIPHCLK_UART7 |\ |
| RCC_PERIPHCLK_UART8 | RCC_PERIPHCLK_SDMMC1 |\ |
| RCC_PERIPHCLK_CLK48; |
| #endif /* STM32F767xx || STM32F769xx || STM32F777xx || STM32F779xx */ |
| |
| /* Get the PLLI2S Clock configuration -----------------------------------------------*/ |
| PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); |
| PeriphClkInit->PLLI2S.PLLI2SP = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos); |
| PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); |
| PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); |
| |
| /* Get the PLLSAI Clock configuration -----------------------------------------------*/ |
| PeriphClkInit->PLLSAI.PLLSAIN = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); |
| PeriphClkInit->PLLSAI.PLLSAIP = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos); |
| PeriphClkInit->PLLSAI.PLLSAIQ = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); |
| PeriphClkInit->PLLSAI.PLLSAIR = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); |
| |
| /* Get the PLLSAI/PLLI2S division factors -------------------------------------------*/ |
| PeriphClkInit->PLLI2SDivQ = (uint32_t)((RCC->DCKCFGR1 & RCC_DCKCFGR1_PLLI2SDIVQ) >> RCC_DCKCFGR1_PLLI2SDIVQ_Pos); |
| PeriphClkInit->PLLSAIDivQ = (uint32_t)((RCC->DCKCFGR1 & RCC_DCKCFGR1_PLLSAIDIVQ) >> RCC_DCKCFGR1_PLLSAIDIVQ_Pos); |
| PeriphClkInit->PLLSAIDivR = (uint32_t)((RCC->DCKCFGR1 & RCC_DCKCFGR1_PLLSAIDIVR) >> RCC_DCKCFGR1_PLLSAIDIVR_Pos); |
| |
| /* Get the SAI1 clock configuration ----------------------------------------------*/ |
| PeriphClkInit->Sai1ClockSelection = __HAL_RCC_GET_SAI1_SOURCE(); |
| |
| /* Get the SAI2 clock configuration ----------------------------------------------*/ |
| PeriphClkInit->Sai2ClockSelection = __HAL_RCC_GET_SAI2_SOURCE(); |
| |
| /* Get the I2S clock configuration ------------------------------------------*/ |
| PeriphClkInit->I2sClockSelection = __HAL_RCC_GET_I2SCLKSOURCE(); |
| |
| /* Get the I2C1 clock configuration ------------------------------------------*/ |
| PeriphClkInit->I2c1ClockSelection = __HAL_RCC_GET_I2C1_SOURCE(); |
| |
| /* Get the I2C2 clock configuration ------------------------------------------*/ |
| PeriphClkInit->I2c2ClockSelection = __HAL_RCC_GET_I2C2_SOURCE(); |
| |
| /* Get the I2C3 clock configuration ------------------------------------------*/ |
| PeriphClkInit->I2c3ClockSelection = __HAL_RCC_GET_I2C3_SOURCE(); |
| |
| /* Get the I2C4 clock configuration ------------------------------------------*/ |
| PeriphClkInit->I2c4ClockSelection = __HAL_RCC_GET_I2C4_SOURCE(); |
| |
| /* Get the USART1 clock configuration ------------------------------------------*/ |
| PeriphClkInit->Usart1ClockSelection = __HAL_RCC_GET_USART1_SOURCE(); |
| |
| /* Get the USART2 clock configuration ------------------------------------------*/ |
| PeriphClkInit->Usart2ClockSelection = __HAL_RCC_GET_USART2_SOURCE(); |
| |
| /* Get the USART3 clock configuration ------------------------------------------*/ |
| PeriphClkInit->Usart3ClockSelection = __HAL_RCC_GET_USART3_SOURCE(); |
| |
| /* Get the UART4 clock configuration ------------------------------------------*/ |
| PeriphClkInit->Uart4ClockSelection = __HAL_RCC_GET_UART4_SOURCE(); |
| |
| /* Get the UART5 clock configuration ------------------------------------------*/ |
| PeriphClkInit->Uart5ClockSelection = __HAL_RCC_GET_UART5_SOURCE(); |
| |
| /* Get the USART6 clock configuration ------------------------------------------*/ |
| PeriphClkInit->Usart6ClockSelection = __HAL_RCC_GET_USART6_SOURCE(); |
| |
| /* Get the UART7 clock configuration ------------------------------------------*/ |
| PeriphClkInit->Uart7ClockSelection = __HAL_RCC_GET_UART7_SOURCE(); |
| |
| /* Get the UART8 clock configuration ------------------------------------------*/ |
| PeriphClkInit->Uart8ClockSelection = __HAL_RCC_GET_UART8_SOURCE(); |
| |
| /* Get the LPTIM1 clock configuration ------------------------------------------*/ |
| PeriphClkInit->Lptim1ClockSelection = __HAL_RCC_GET_LPTIM1_SOURCE(); |
| |
| /* Get the CEC clock configuration -----------------------------------------------*/ |
| PeriphClkInit->CecClockSelection = __HAL_RCC_GET_CEC_SOURCE(); |
| |
| /* Get the CK48 clock configuration -----------------------------------------------*/ |
| PeriphClkInit->Clk48ClockSelection = __HAL_RCC_GET_CLK48_SOURCE(); |
| |
| /* Get the SDMMC1 clock configuration -----------------------------------------------*/ |
| PeriphClkInit->Sdmmc1ClockSelection = __HAL_RCC_GET_SDMMC1_SOURCE(); |
| |
| #if defined (STM32F765xx) || defined (STM32F767xx) || defined (STM32F769xx) || defined (STM32F777xx) || defined (STM32F779xx) |
| /* Get the SDMMC2 clock configuration -----------------------------------------------*/ |
| PeriphClkInit->Sdmmc2ClockSelection = __HAL_RCC_GET_SDMMC2_SOURCE(); |
| |
| /* Get the DFSDM clock configuration -----------------------------------------------*/ |
| PeriphClkInit->Dfsdm1ClockSelection = __HAL_RCC_GET_DFSDM1_SOURCE(); |
| |
| /* Get the DFSDM AUDIO clock configuration -----------------------------------------------*/ |
| PeriphClkInit->Dfsdm1AudioClockSelection = __HAL_RCC_GET_DFSDM1AUDIO_SOURCE(); |
| #endif /* STM32F767xx || STM32F769xx || STM32F777xx || STM32F779xx */ |
| |
| /* Get the RTC Clock configuration -----------------------------------------------*/ |
| tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); |
| PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); |
| |
| /* Get the TIM Prescaler configuration --------------------------------------------*/ |
| if ((RCC->DCKCFGR1 & RCC_DCKCFGR1_TIMPRE) == RESET) |
| { |
| PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; |
| } |
| else |
| { |
| PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; |
| } |
| } |
| #endif /* STM32F745xx || STM32F746xx || STM32F756xx || STM32F765xx || STM32F767xx || STM32F769xx || STM32F777xx || STM32F779xx || STM32F750xx */ |
| |
| #if defined (STM32F722xx) || defined (STM32F723xx) || defined (STM32F732xx) || defined (STM32F733xx) || defined (STM32F730xx) |
| /** |
| * @brief Initializes the RCC extended peripherals clocks according to the specified |
| * parameters in the RCC_PeriphCLKInitTypeDef. |
| * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that |
| * contains the configuration information for the Extended Peripherals |
| * clocks(I2S, SAI, RTC, TIM, UARTs, USARTs, LTPIM, SDMMC...). |
| * |
| * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select |
| * the RTC clock source; in this case the Backup domain will be reset in |
| * order to modify the RTC Clock source, as consequence RTC registers (including |
| * the backup registers) are set to their reset values. |
| * |
| * @retval HAL status |
| */ |
| HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) |
| { |
| uint32_t tickstart = 0; |
| uint32_t tmpreg0 = 0; |
| uint32_t plli2sused = 0; |
| uint32_t pllsaiused = 0; |
| |
| /* Check the parameters */ |
| assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); |
| |
| /*----------------------------------- I2S configuration ----------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == (RCC_PERIPHCLK_I2S)) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_I2SCLKSOURCE(PeriphClkInit->I2sClockSelection)); |
| |
| /* Configure I2S Clock source */ |
| __HAL_RCC_I2S_CONFIG(PeriphClkInit->I2sClockSelection); |
| |
| /* Enable the PLLI2S when it's used as clock source for I2S */ |
| if(PeriphClkInit->I2sClockSelection == RCC_I2SCLKSOURCE_PLLI2S) |
| { |
| plli2sused = 1; |
| } |
| } |
| |
| /*------------------------------------ SAI1 configuration --------------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == (RCC_PERIPHCLK_SAI1)) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_SAI1CLKSOURCE(PeriphClkInit->Sai1ClockSelection)); |
| |
| /* Configure SAI1 Clock source */ |
| __HAL_RCC_SAI1_CONFIG(PeriphClkInit->Sai1ClockSelection); |
| /* Enable the PLLI2S when it's used as clock source for SAI */ |
| if(PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLI2S) |
| { |
| plli2sused = 1; |
| } |
| /* Enable the PLLSAI when it's used as clock source for SAI */ |
| if(PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLSAI) |
| { |
| pllsaiused = 1; |
| } |
| } |
| |
| /*------------------------------------ SAI2 configuration --------------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == (RCC_PERIPHCLK_SAI2)) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_SAI2CLKSOURCE(PeriphClkInit->Sai2ClockSelection)); |
| |
| /* Configure SAI2 Clock source */ |
| __HAL_RCC_SAI2_CONFIG(PeriphClkInit->Sai2ClockSelection); |
| |
| /* Enable the PLLI2S when it's used as clock source for SAI */ |
| if(PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLI2S) |
| { |
| plli2sused = 1; |
| } |
| /* Enable the PLLSAI when it's used as clock source for SAI */ |
| if(PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLSAI) |
| { |
| pllsaiused = 1; |
| } |
| } |
| |
| /*------------------------------------ RTC configuration --------------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) |
| { |
| /* Check for RTC Parameters used to output RTCCLK */ |
| assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); |
| |
| /* Enable Power Clock*/ |
| __HAL_RCC_PWR_CLK_ENABLE(); |
| |
| /* Enable write access to Backup domain */ |
| PWR->CR1 |= PWR_CR1_DBP; |
| |
| /* Get Start Tick*/ |
| tickstart = HAL_GetTick(); |
| |
| /* Wait for Backup domain Write protection disable */ |
| while((PWR->CR1 & PWR_CR1_DBP) == RESET) |
| { |
| if((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) |
| { |
| return HAL_TIMEOUT; |
| } |
| } |
| |
| /* Reset the Backup domain only if the RTC Clock source selection is modified */ |
| tmpreg0 = (RCC->BDCR & RCC_BDCR_RTCSEL); |
| |
| if((tmpreg0 != 0x00000000U) && (tmpreg0 != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) |
| { |
| /* Store the content of BDCR register before the reset of Backup Domain */ |
| tmpreg0 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); |
| |
| /* RTC Clock selection can be changed only if the Backup Domain is reset */ |
| __HAL_RCC_BACKUPRESET_FORCE(); |
| __HAL_RCC_BACKUPRESET_RELEASE(); |
| |
| /* Restore the Content of BDCR register */ |
| RCC->BDCR = tmpreg0; |
| |
| /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ |
| if (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) |
| { |
| /* Get Start Tick*/ |
| tickstart = HAL_GetTick(); |
| |
| /* Wait till LSE is ready */ |
| while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) |
| { |
| if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) |
| { |
| return HAL_TIMEOUT; |
| } |
| } |
| } |
| } |
| __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); |
| } |
| |
| /*------------------------------------ TIM configuration --------------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_TIMPRES(PeriphClkInit->TIMPresSelection)); |
| |
| /* Configure Timer Prescaler */ |
| __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); |
| } |
| |
| /*-------------------------------------- I2C1 Configuration -----------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C1) == RCC_PERIPHCLK_I2C1) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_I2C1CLKSOURCE(PeriphClkInit->I2c1ClockSelection)); |
| |
| /* Configure the I2C1 clock source */ |
| __HAL_RCC_I2C1_CONFIG(PeriphClkInit->I2c1ClockSelection); |
| } |
| |
| /*-------------------------------------- I2C2 Configuration -----------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C2) == RCC_PERIPHCLK_I2C2) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_I2C2CLKSOURCE(PeriphClkInit->I2c2ClockSelection)); |
| |
| /* Configure the I2C2 clock source */ |
| __HAL_RCC_I2C2_CONFIG(PeriphClkInit->I2c2ClockSelection); |
| } |
| |
| /*-------------------------------------- I2C3 Configuration -----------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C3) == RCC_PERIPHCLK_I2C3) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_I2C3CLKSOURCE(PeriphClkInit->I2c3ClockSelection)); |
| |
| /* Configure the I2C3 clock source */ |
| __HAL_RCC_I2C3_CONFIG(PeriphClkInit->I2c3ClockSelection); |
| } |
| |
| /*-------------------------------------- USART1 Configuration -----------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USART1) == RCC_PERIPHCLK_USART1) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_USART1CLKSOURCE(PeriphClkInit->Usart1ClockSelection)); |
| |
| /* Configure the USART1 clock source */ |
| __HAL_RCC_USART1_CONFIG(PeriphClkInit->Usart1ClockSelection); |
| } |
| |
| /*-------------------------------------- USART2 Configuration -----------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USART2) == RCC_PERIPHCLK_USART2) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_USART2CLKSOURCE(PeriphClkInit->Usart2ClockSelection)); |
| |
| /* Configure the USART2 clock source */ |
| __HAL_RCC_USART2_CONFIG(PeriphClkInit->Usart2ClockSelection); |
| } |
| |
| /*-------------------------------------- USART3 Configuration -----------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USART3) == RCC_PERIPHCLK_USART3) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_USART3CLKSOURCE(PeriphClkInit->Usart3ClockSelection)); |
| |
| /* Configure the USART3 clock source */ |
| __HAL_RCC_USART3_CONFIG(PeriphClkInit->Usart3ClockSelection); |
| } |
| |
| /*-------------------------------------- UART4 Configuration -----------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_UART4) == RCC_PERIPHCLK_UART4) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_UART4CLKSOURCE(PeriphClkInit->Uart4ClockSelection)); |
| |
| /* Configure the UART4 clock source */ |
| __HAL_RCC_UART4_CONFIG(PeriphClkInit->Uart4ClockSelection); |
| } |
| |
| /*-------------------------------------- UART5 Configuration -----------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_UART5) == RCC_PERIPHCLK_UART5) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_UART5CLKSOURCE(PeriphClkInit->Uart5ClockSelection)); |
| |
| /* Configure the UART5 clock source */ |
| __HAL_RCC_UART5_CONFIG(PeriphClkInit->Uart5ClockSelection); |
| } |
| |
| /*-------------------------------------- USART6 Configuration -----------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USART6) == RCC_PERIPHCLK_USART6) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_USART6CLKSOURCE(PeriphClkInit->Usart6ClockSelection)); |
| |
| /* Configure the USART6 clock source */ |
| __HAL_RCC_USART6_CONFIG(PeriphClkInit->Usart6ClockSelection); |
| } |
| |
| /*-------------------------------------- UART7 Configuration -----------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_UART7) == RCC_PERIPHCLK_UART7) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_UART7CLKSOURCE(PeriphClkInit->Uart7ClockSelection)); |
| |
| /* Configure the UART7 clock source */ |
| __HAL_RCC_UART7_CONFIG(PeriphClkInit->Uart7ClockSelection); |
| } |
| |
| /*-------------------------------------- UART8 Configuration -----------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_UART8) == RCC_PERIPHCLK_UART8) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_UART8CLKSOURCE(PeriphClkInit->Uart8ClockSelection)); |
| |
| /* Configure the UART8 clock source */ |
| __HAL_RCC_UART8_CONFIG(PeriphClkInit->Uart8ClockSelection); |
| } |
| |
| /*-------------------------------------- CK48 Configuration -----------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_CLK48SOURCE(PeriphClkInit->Clk48ClockSelection)); |
| |
| /* Configure the CLK48 source */ |
| __HAL_RCC_CLK48_CONFIG(PeriphClkInit->Clk48ClockSelection); |
| |
| /* Enable the PLLSAI when it's used as clock source for CK48 */ |
| if(PeriphClkInit->Clk48ClockSelection == RCC_CLK48SOURCE_PLLSAIP) |
| { |
| pllsaiused = 1; |
| } |
| } |
| |
| /*-------------------------------------- LPTIM1 Configuration -----------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPTIM1) == RCC_PERIPHCLK_LPTIM1) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_LPTIM1CLK(PeriphClkInit->Lptim1ClockSelection)); |
| |
| /* Configure the LTPIM1 clock source */ |
| __HAL_RCC_LPTIM1_CONFIG(PeriphClkInit->Lptim1ClockSelection); |
| } |
| |
| /*------------------------------------- SDMMC1 Configuration ------------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDMMC1) == RCC_PERIPHCLK_SDMMC1) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_SDMMC1CLKSOURCE(PeriphClkInit->Sdmmc1ClockSelection)); |
| |
| /* Configure the SDMMC1 clock source */ |
| __HAL_RCC_SDMMC1_CONFIG(PeriphClkInit->Sdmmc1ClockSelection); |
| } |
| |
| /*------------------------------------- SDMMC2 Configuration ------------------------------------*/ |
| if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDMMC2) == RCC_PERIPHCLK_SDMMC2) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RCC_SDMMC2CLKSOURCE(PeriphClkInit->Sdmmc2ClockSelection)); |
| |
| /* Configure the SDMMC2 clock source */ |
| __HAL_RCC_SDMMC2_CONFIG(PeriphClkInit->Sdmmc2ClockSelection); |
| } |
| |
| /*-------------------------------------- PLLI2S Configuration ---------------------------------*/ |
| /* PLLI2S is configured when a peripheral will use it as source clock : SAI1, SAI2 or I2S */ |
| if((plli2sused == 1) || ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S)) |
| { |
| /* Disable the PLLI2S */ |
| __HAL_RCC_PLLI2S_DISABLE(); |
| |
| /* Get Start Tick*/ |
| tickstart = HAL_GetTick(); |
| |
| /* Wait till PLLI2S is disabled */ |
| while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) |
| { |
| if((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) |
| { |
| /* return in case of Timeout detected */ |
| return HAL_TIMEOUT; |
| } |
| } |
| |
| /* check for common PLLI2S Parameters */ |
| assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); |
| |
| /*----------------- In Case of PLLI2S is selected as source clock for I2S -------------------*/ |
| if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) && (PeriphClkInit->I2sClockSelection == RCC_I2SCLKSOURCE_PLLI2S))) |
| { |
| /* check for Parameters */ |
| assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); |
| |
| /* Read PLLI2SQ value from PLLI2SCFGR register (this value is not needed for I2S configuration) */ |
| tmpreg0 = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); |
| /* Configure the PLLI2S division factors */ |
| /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) x (PLLI2SN/PLLM) */ |
| /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ |
| __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , tmpreg0, PeriphClkInit->PLLI2S.PLLI2SR); |
| } |
| |
| /*----------------- In Case of PLLI2S is selected as source clock for SAI -------------------*/ |
| if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == RCC_PERIPHCLK_SAI1) && (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLI2S)) || |
| ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == RCC_PERIPHCLK_SAI2) && (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLI2S))) |
| { |
| /* Check for PLLI2S Parameters */ |
| assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); |
| /* Check for PLLI2S/DIVQ parameters */ |
| assert_param(IS_RCC_PLLI2S_DIVQ_VALUE(PeriphClkInit->PLLI2SDivQ)); |
| |
| /* Read PLLI2SP and PLLI2SR values from PLLI2SCFGR register (this value is not needed for SAI configuration) */ |
| tmpreg0 = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); |
| /* Configure the PLLI2S division factors */ |
| /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ |
| /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ |
| /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ |
| __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, tmpreg0); |
| |
| /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ |
| __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLI2SDivQ); |
| } |
| |
| /*----------------- In Case of PLLI2S is just selected -----------------*/ |
| if((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) |
| { |
| /* Check for Parameters */ |
| assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); |
| assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); |
| |
| /* Configure the PLLI2S division factors */ |
| /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) x (PLLI2SN/PLLI2SM) */ |
| __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SQ, PeriphClkInit->PLLI2S.PLLI2SR); |
| } |
| |
| /* Enable the PLLI2S */ |
| __HAL_RCC_PLLI2S_ENABLE(); |
| |
| /* Get Start Tick*/ |
| tickstart = HAL_GetTick(); |
| |
| /* Wait till PLLI2S is ready */ |
| while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) |
| { |
| if((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) |
| { |
| /* return in case of Timeout detected */ |
| return HAL_TIMEOUT; |
| } |
| } |
| } |
| |
| /*-------------------------------------- PLLSAI Configuration ---------------------------------*/ |
| /* PLLSAI is configured when a peripheral will use it as source clock : SAI1, SAI2, LTDC or CK48 */ |
| if(pllsaiused == 1) |
| { |
| /* Disable PLLSAI Clock */ |
| __HAL_RCC_PLLSAI_DISABLE(); |
| |
| /* Get Start Tick*/ |
| tickstart = HAL_GetTick(); |
| |
| /* Wait till PLLSAI is disabled */ |
| while(__HAL_RCC_PLLSAI_GET_FLAG() != RESET) |
| { |
| if((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) |
| { |
| /* return in case of Timeout detected */ |
| return HAL_TIMEOUT; |
| } |
| } |
| |
| /* Check the PLLSAI division factors */ |
| assert_param(IS_RCC_PLLSAIN_VALUE(PeriphClkInit->PLLSAI.PLLSAIN)); |
| |
| /*----------------- In Case of PLLSAI is selected as source clock for SAI -------------------*/ |
| if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == RCC_PERIPHCLK_SAI1) && (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLSAI)) ||\ |
| ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == RCC_PERIPHCLK_SAI2) && (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLSAI))) |
| { |
| /* check for PLLSAIQ Parameter */ |
| assert_param(IS_RCC_PLLSAIQ_VALUE(PeriphClkInit->PLLSAI.PLLSAIQ)); |
| /* check for PLLSAI/DIVQ Parameter */ |
| assert_param(IS_RCC_PLLSAI_DIVQ_VALUE(PeriphClkInit->PLLSAIDivQ)); |
| |
| /* Read PLLSAIP value from PLLSAICFGR register (this value is not needed for SAI configuration) */ |
| tmpreg0 = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos); |
| /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ |
| /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ |
| /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ |
| __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN , tmpreg0, PeriphClkInit->PLLSAI.PLLSAIQ); |
| |
| /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ |
| __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLSAIDivQ); |
| } |
| |
| /*----------------- In Case of PLLSAI is selected as source clock for CLK48 -------------------*/ |
| /* In Case of PLLI2S is selected as source clock for CK48 */ |
| if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) && (PeriphClkInit->Clk48ClockSelection == RCC_CLK48SOURCE_PLLSAIP)) |
| { |
| /* check for Parameters */ |
| assert_param(IS_RCC_PLLSAIP_VALUE(PeriphClkInit->PLLSAI.PLLSAIP)); |
| /* Read PLLSAIQ and PLLSAIR value from PLLSAICFGR register (this value is not needed for CK48 configuration) */ |
| tmpreg0 = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); |
| |
| /* Configure the PLLSAI division factors */ |
| /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) x (PLLI2SN/PLLM) */ |
| /* 48CLK = f(PLLSAI clock output) = f(VCO clock) / PLLSAIP */ |
| __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN , PeriphClkInit->PLLSAI.PLLSAIP, tmpreg0); |
| } |
| |
| /* Enable PLLSAI Clock */ |
| __HAL_RCC_PLLSAI_ENABLE(); |
| |
| /* Get Start Tick*/ |
| tickstart = HAL_GetTick(); |
| |
| /* Wait till PLLSAI is ready */ |
| while(__HAL_RCC_PLLSAI_GET_FLAG() == RESET) |
| { |
| if((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) |
| { |
| /* return in case of Timeout detected */ |
| return HAL_TIMEOUT; |
| } |
| } |
| } |
| return HAL_OK; |
| } |
| |
| /** |
| * @brief Get the RCC_PeriphCLKInitTypeDef according to the internal |
| * RCC configuration registers. |
| * @param PeriphClkInit pointer to the configured RCC_PeriphCLKInitTypeDef structure |
| * @retval None |
| */ |
| void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) |
| { |
| uint32_t tempreg = 0; |
| |
| /* Set all possible values for the extended clock type parameter------------*/ |
| PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_LPTIM1 |\ |
| RCC_PERIPHCLK_SAI1 | RCC_PERIPHCLK_SAI2 |\ |
| RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC |\ |
| RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_I2C2 |\ |
| RCC_PERIPHCLK_I2C3 | RCC_PERIPHCLK_USART1 |\ |
| RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 |\ |
| RCC_PERIPHCLK_UART4 | RCC_PERIPHCLK_UART5 |\ |
| RCC_PERIPHCLK_USART6 | RCC_PERIPHCLK_UART7 |\ |
| RCC_PERIPHCLK_UART8 | RCC_PERIPHCLK_SDMMC1 |\ |
| RCC_PERIPHCLK_CLK48 | RCC_PERIPHCLK_SDMMC2; |
| |
| /* Get the PLLI2S Clock configuration -----------------------------------------------*/ |
| PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); |
| PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); |
| PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); |
| |
| /* Get the PLLSAI Clock configuration -----------------------------------------------*/ |
| PeriphClkInit->PLLSAI.PLLSAIN = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); |
| PeriphClkInit->PLLSAI.PLLSAIP = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos); |
| PeriphClkInit->PLLSAI.PLLSAIQ = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); |
| |
| /* Get the PLLSAI/PLLI2S division factors -------------------------------------------*/ |
| PeriphClkInit->PLLI2SDivQ = (uint32_t)((RCC->DCKCFGR1 & RCC_DCKCFGR1_PLLI2SDIVQ) >> RCC_DCKCFGR1_PLLI2SDIVQ_Pos); |
| PeriphClkInit->PLLSAIDivQ = (uint32_t)((RCC->DCKCFGR1 & RCC_DCKCFGR1_PLLSAIDIVQ) >> RCC_DCKCFGR1_PLLSAIDIVQ_Pos); |
| |
| /* Get the SAI1 clock configuration ----------------------------------------------*/ |
| PeriphClkInit->Sai1ClockSelection = __HAL_RCC_GET_SAI1_SOURCE(); |
| |
| /* Get the SAI2 clock configuration ----------------------------------------------*/ |
| PeriphClkInit->Sai2ClockSelection = __HAL_RCC_GET_SAI2_SOURCE(); |
| |
| /* Get the I2S clock configuration ------------------------------------------*/ |
| PeriphClkInit->I2sClockSelection = __HAL_RCC_GET_I2SCLKSOURCE(); |
| |
| /* Get the I2C1 clock configuration ------------------------------------------*/ |
| PeriphClkInit->I2c1ClockSelection = __HAL_RCC_GET_I2C1_SOURCE(); |
| |
| /* Get the I2C2 clock configuration ------------------------------------------*/ |
| PeriphClkInit->I2c2ClockSelection = __HAL_RCC_GET_I2C2_SOURCE(); |
| |
| /* Get the I2C3 clock configuration ------------------------------------------*/ |
| PeriphClkInit->I2c3ClockSelection = __HAL_RCC_GET_I2C3_SOURCE(); |
| |
| /* Get the USART1 clock configuration ------------------------------------------*/ |
| PeriphClkInit->Usart1ClockSelection = __HAL_RCC_GET_USART1_SOURCE(); |
| |
| /* Get the USART2 clock configuration ------------------------------------------*/ |
| PeriphClkInit->Usart2ClockSelection = __HAL_RCC_GET_USART2_SOURCE(); |
| |
| /* Get the USART3 clock configuration ------------------------------------------*/ |
| PeriphClkInit->Usart3ClockSelection = __HAL_RCC_GET_USART3_SOURCE(); |
| |
| /* Get the UART4 clock configuration ------------------------------------------*/ |
| PeriphClkInit->Uart4ClockSelection = __HAL_RCC_GET_UART4_SOURCE(); |
| |
| /* Get the UART5 clock configuration ------------------------------------------*/ |
| PeriphClkInit->Uart5ClockSelection = __HAL_RCC_GET_UART5_SOURCE(); |
| |
| /* Get the USART6 clock configuration ------------------------------------------*/ |
| PeriphClkInit->Usart6ClockSelection = __HAL_RCC_GET_USART6_SOURCE(); |
| |
| /* Get the UART7 clock configuration ------------------------------------------*/ |
| PeriphClkInit->Uart7ClockSelection = __HAL_RCC_GET_UART7_SOURCE(); |
| |
| /* Get the UART8 clock configuration ------------------------------------------*/ |
| PeriphClkInit->Uart8ClockSelection = __HAL_RCC_GET_UART8_SOURCE(); |
| |
| /* Get the LPTIM1 clock configuration ------------------------------------------*/ |
| PeriphClkInit->Lptim1ClockSelection = __HAL_RCC_GET_LPTIM1_SOURCE(); |
| |
| /* Get the CK48 clock configuration -----------------------------------------------*/ |
| PeriphClkInit->Clk48ClockSelection = __HAL_RCC_GET_CLK48_SOURCE(); |
| |
| /* Get the SDMMC1 clock configuration -----------------------------------------------*/ |
| PeriphClkInit->Sdmmc1ClockSelection = __HAL_RCC_GET_SDMMC1_SOURCE(); |
| |
| /* Get the SDMMC2 clock configuration -----------------------------------------------*/ |
| PeriphClkInit->Sdmmc2ClockSelection = __HAL_RCC_GET_SDMMC2_SOURCE(); |
| |
| /* Get the RTC Clock configuration -----------------------------------------------*/ |
| tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); |
| PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); |
| |
| /* Get the TIM Prescaler configuration --------------------------------------------*/ |
| if ((RCC->DCKCFGR1 & RCC_DCKCFGR1_TIMPRE) == RESET) |
| { |
| PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; |
| } |
| else |
| { |
| PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; |
| } |
| } |
| #endif /* STM32F722xx || STM32F723xx || STM32F732xx || STM32F733xx || STM32F730xx */ |
| |
| /** |
| * @brief Return the peripheral clock frequency for a given peripheral(SAI..) |
| * @note Return 0 if peripheral clock identifier not managed by this API |
| * @param PeriphClk Peripheral clock identifier |
| * This parameter can be one of the following values: |
| * @arg RCC_PERIPHCLK_SAI1: SAI1 peripheral clock |
| * @arg RCC_PERIPHCLK_SAI2: SAI2 peripheral clock |
| * @retval Frequency in KHz |
| */ |
| uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) |
| { |
| uint32_t tmpreg = 0; |
| /* This variable is used to store the SAI clock frequency (value in Hz) */ |
| uint32_t frequency = 0; |
| /* This variable is used to store the VCO Input (value in Hz) */ |
| uint32_t vcoinput = 0; |
| /* This variable is used to store the SAI clock source */ |
| uint32_t saiclocksource = 0; |
| |
| if (PeriphClk == RCC_PERIPHCLK_SAI1) |
| { |
| saiclocksource = RCC->DCKCFGR1; |
| saiclocksource &= RCC_DCKCFGR1_SAI1SEL; |
| switch (saiclocksource) |
| { |
| case 0: /* PLLSAI is the clock source for SAI1 */ |
| { |
| /* Configure the PLLSAI division factor */ |
| /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ |
| if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) |
| { |
| /* In Case the PLL Source is HSI (Internal Clock) */ |
| vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); |
| } |
| else |
| { |
| /* In Case the PLL Source is HSE (External Clock) */ |
| vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM))); |
| } |
| /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ |
| /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ |
| tmpreg = (RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> 24; |
| frequency = (vcoinput * ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> 6))/(tmpreg); |
| |
| /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ |
| tmpreg = (((RCC->DCKCFGR1 & RCC_DCKCFGR1_PLLSAIDIVQ) >> 8) + 1); |
| frequency = frequency/(tmpreg); |
| break; |
| } |
| case RCC_DCKCFGR1_SAI1SEL_0: /* PLLI2S is the clock source for SAI1 */ |
| { |
| /* Configure the PLLI2S division factor */ |
| /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ |
| if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) |
| { |
| /* In Case the PLL Source is HSI (Internal Clock) */ |
| vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); |
| } |
| else |
| { |
| /* In Case the PLL Source is HSE (External Clock) */ |
| vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM))); |
| } |
| |
| /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ |
| /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ |
| tmpreg = (RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> 24; |
| frequency = (vcoinput * ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6))/(tmpreg); |
| |
| /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ |
| tmpreg = ((RCC->DCKCFGR1 & RCC_DCKCFGR1_PLLI2SDIVQ) + 1); |
| frequency = frequency/(tmpreg); |
| break; |
| } |
| case RCC_DCKCFGR1_SAI1SEL_1: /* External clock is the clock source for SAI1 */ |
| { |
| frequency = EXTERNAL_CLOCK_VALUE; |
| break; |
| } |
| #if defined (STM32F765xx) || defined (STM32F767xx) || defined (STM32F769xx) || defined (STM32F777xx) || defined (STM32F779xx) |
| case RCC_DCKCFGR1_SAI1SEL: /* HSI or HSE is the clock source for SAI*/ |
| { |
| if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) |
| { |
| /* In Case the main PLL Source is HSI */ |
| frequency = HSI_VALUE; |
| } |
| else |
| { |
| /* In Case the main PLL Source is HSE */ |
| frequency = HSE_VALUE; |
| } |
| break; |
| } |
| #endif /* STM32F767xx || STM32F769xx || STM32F777xx || STM32F779xx */ |
| default : |
| { |
| break; |
| } |
| } |
| } |
| |
| if (PeriphClk == RCC_PERIPHCLK_SAI2) |
| { |
| saiclocksource = RCC->DCKCFGR1; |
| saiclocksource &= RCC_DCKCFGR1_SAI2SEL; |
| switch (saiclocksource) |
| { |
| case 0: /* PLLSAI is the clock source for SAI*/ |
| { |
| /* Configure the PLLSAI division factor */ |
| /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ |
| if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) |
| { |
| /* In Case the PLL Source is HSI (Internal Clock) */ |
| vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); |
| } |
| else |
| { |
| /* In Case the PLL Source is HSE (External Clock) */ |
| vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM))); |
| } |
| /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ |
| /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ |
| tmpreg = (RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> 24; |
| frequency = (vcoinput * ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> 6))/(tmpreg); |
| |
| /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ |
| tmpreg = (((RCC->DCKCFGR1 & RCC_DCKCFGR1_PLLSAIDIVQ) >> 8) + 1); |
| frequency = frequency/(tmpreg); |
| break; |
| } |
| case RCC_DCKCFGR1_SAI2SEL_0: /* PLLI2S is the clock source for SAI2 */ |
| { |
| /* Configure the PLLI2S division factor */ |
| /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ |
| if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) |
| { |
| /* In Case the PLL Source is HSI (Internal Clock) */ |
| vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); |
| } |
| else |
| { |
| /* In Case the PLL Source is HSE (External Clock) */ |
| vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM))); |
| } |
| |
| /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ |
| /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ |
| tmpreg = (RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> 24; |
| frequency = (vcoinput * ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6))/(tmpreg); |
| |
| /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ |
| tmpreg = ((RCC->DCKCFGR1 & RCC_DCKCFGR1_PLLI2SDIVQ) + 1); |
| frequency = frequency/(tmpreg); |
| break; |
| } |
| case RCC_DCKCFGR1_SAI2SEL_1: /* External clock is the clock source for SAI2 */ |
| { |
| frequency = EXTERNAL_CLOCK_VALUE; |
| break; |
| } |
| #if defined (STM32F765xx) || defined (STM32F767xx) || defined (STM32F769xx) || defined (STM32F777xx) || defined (STM32F779xx) |
| case RCC_DCKCFGR1_SAI2SEL: /* HSI or HSE is the clock source for SAI2 */ |
| { |
| if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) |
| { |
| /* In Case the main PLL Source is HSI */ |
| frequency = HSI_VALUE; |
| } |
| else |
| { |
| /* In Case the main PLL Source is HSE */ |
| frequency = HSE_VALUE; |
| } |
| break; |
| } |
| #endif /* STM32F767xx || STM32F769xx || STM32F777xx || STM32F779xx */ |
| default : |
| { |
| break; |
| } |
| } |
| } |
| |
| return frequency; |
| } |
| |
| /** |
| * @} |
| */ |
| |
| /** @defgroup RCCEx_Exported_Functions_Group2 Extended Clock management functions |
| * @brief Extended Clock management functions |
| * |
| @verbatim |
| =============================================================================== |
| ##### Extended clock management functions ##### |
| =============================================================================== |
| [..] |
| This subsection provides a set of functions allowing to control the |
| activation or deactivation of PLLI2S, PLLSAI. |
| @endverbatim |
| * @{ |
| */ |
| |
| /** |
| * @brief Enable PLLI2S. |
| * @param PLLI2SInit pointer to an RCC_PLLI2SInitTypeDef structure that |
| * contains the configuration information for the PLLI2S |
| * @retval HAL status |
| */ |
| HAL_StatusTypeDef HAL_RCCEx_EnablePLLI2S(RCC_PLLI2SInitTypeDef *PLLI2SInit) |
| { |
| uint32_t tickstart; |
| |
| /* Check for parameters */ |
| assert_param(IS_RCC_PLLI2SN_VALUE(PLLI2SInit->PLLI2SN)); |
| assert_param(IS_RCC_PLLI2SR_VALUE(PLLI2SInit->PLLI2SR)); |
| assert_param(IS_RCC_PLLI2SQ_VALUE(PLLI2SInit->PLLI2SQ)); |
| #if defined(RCC_PLLI2SCFGR_PLLI2SP) |
| assert_param(IS_RCC_PLLI2SP_VALUE(PLLI2SInit->PLLI2SP)); |
| #endif /* RCC_PLLI2SCFGR_PLLI2SP */ |
| |
| /* Disable the PLLI2S */ |
| __HAL_RCC_PLLI2S_DISABLE(); |
| |
| /* Wait till PLLI2S is disabled */ |
| tickstart = HAL_GetTick(); |
| while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) |
| { |
| if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) |
| { |
| /* return in case of Timeout detected */ |
| return HAL_TIMEOUT; |
| } |
| } |
| |
| /* Configure the PLLI2S division factors */ |
| #if defined (STM32F722xx) || defined (STM32F723xx) || defined (STM32F732xx) || defined (STM32F733xx) || defined (STM32F730xx) |
| /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * PLLI2SN */ |
| /* I2SQCLK = PLLI2S_VCO / PLLI2SQ */ |
| /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ |
| __HAL_RCC_PLLI2S_CONFIG(PLLI2SInit->PLLI2SN, PLLI2SInit->PLLI2SQ, PLLI2SInit->PLLI2SR); |
| #else |
| /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * PLLI2SN */ |
| /* I2SPCLK = PLLI2S_VCO / PLLI2SP */ |
| /* I2SQCLK = PLLI2S_VCO / PLLI2SQ */ |
| /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ |
| __HAL_RCC_PLLI2S_CONFIG(PLLI2SInit->PLLI2SN, PLLI2SInit->PLLI2SP, PLLI2SInit->PLLI2SQ, PLLI2SInit->PLLI2SR); |
| #endif /* STM32F722xx || STM32F723xx || STM32F732xx || STM32F733xx || STM32F730xx */ |
| |
| /* Enable the PLLI2S */ |
| __HAL_RCC_PLLI2S_ENABLE(); |
| |
| /* Wait till PLLI2S is ready */ |
| tickstart = HAL_GetTick(); |
| while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) |
| { |
| if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) |
| { |
| /* return in case of Timeout detected */ |
| return HAL_TIMEOUT; |
| } |
| } |
| |
| return HAL_OK; |
| } |
| |
| /** |
| * @brief Disable PLLI2S. |
| * @retval HAL status |
| */ |
| HAL_StatusTypeDef HAL_RCCEx_DisablePLLI2S(void) |
| { |
| uint32_t tickstart; |
| |
| /* Disable the PLLI2S */ |
| __HAL_RCC_PLLI2S_DISABLE(); |
| |
| /* Wait till PLLI2S is disabled */ |
| tickstart = HAL_GetTick(); |
| while(READ_BIT(RCC->CR, RCC_CR_PLLI2SRDY) != RESET) |
| { |
| if((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) |
| { |
| /* return in case of Timeout detected */ |
| return HAL_TIMEOUT; |
| } |
| } |
| |
| return HAL_OK; |
| } |
| |
| /** |
| * @brief Enable PLLSAI. |
| * @param PLLSAIInit pointer to an RCC_PLLSAIInitTypeDef structure that |
| * contains the configuration information for the PLLSAI |
| * @retval HAL status |
| */ |
| HAL_StatusTypeDef HAL_RCCEx_EnablePLLSAI(RCC_PLLSAIInitTypeDef *PLLSAIInit) |
| { |
| uint32_t tickstart; |
| |
| /* Check for parameters */ |
| assert_param(IS_RCC_PLLSAIN_VALUE(PLLSAIInit->PLLSAIN)); |
| assert_param(IS_RCC_PLLSAIQ_VALUE(PLLSAIInit->PLLSAIQ)); |
| assert_param(IS_RCC_PLLSAIP_VALUE(PLLSAIInit->PLLSAIP)); |
| #if defined(RCC_PLLSAICFGR_PLLSAIR) |
| assert_param(IS_RCC_PLLSAIR_VALUE(PLLSAIInit->PLLSAIR)); |
| #endif /* RCC_PLLSAICFGR_PLLSAIR */ |
| |
| /* Disable the PLLSAI */ |
| __HAL_RCC_PLLSAI_DISABLE(); |
| |
| /* Wait till PLLSAI is disabled */ |
| tickstart = HAL_GetTick(); |
| while(__HAL_RCC_PLLSAI_GET_FLAG() != RESET) |
| { |
| if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) |
| { |
| /* return in case of Timeout detected */ |
| return HAL_TIMEOUT; |
| } |
| } |
| |
| /* Configure the PLLSAI division factors */ |
| #if defined (STM32F722xx) || defined (STM32F723xx) || defined (STM32F732xx) || defined (STM32F733xx) || defined (STM32F730xx) |
| /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) * PLLSAIN */ |
| /* SAIPCLK = PLLSAI_VCO / PLLSAIP */ |
| /* SAIQCLK = PLLSAI_VCO / PLLSAIQ */ |
| __HAL_RCC_PLLSAI_CONFIG(PLLSAIInit->PLLSAIN, PLLSAIInit->PLLSAIP, PLLSAIInit->PLLSAIQ); |
| #else |
| /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) * PLLSAIN */ |
| /* SAIPCLK = PLLSAI_VCO / PLLSAIP */ |
| /* SAIQCLK = PLLSAI_VCO / PLLSAIQ */ |
| /* SAIRCLK = PLLSAI_VCO / PLLSAIR */ |
| __HAL_RCC_PLLSAI_CONFIG(PLLSAIInit->PLLSAIN, PLLSAIInit->PLLSAIP, \ |
| PLLSAIInit->PLLSAIQ, PLLSAIInit->PLLSAIR); |
| #endif /* STM32F722xx || STM32F723xx || STM32F732xx || STM32F733xx || STM32F730xx */ |
| |
| /* Enable the PLLSAI */ |
| __HAL_RCC_PLLSAI_ENABLE(); |
| |
| /* Wait till PLLSAI is ready */ |
| tickstart = HAL_GetTick(); |
| while(__HAL_RCC_PLLSAI_GET_FLAG() == RESET) |
| { |
| if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) |
| { |
| /* return in case of Timeout detected */ |
| return HAL_TIMEOUT; |
| } |
| } |
| |
| return HAL_OK; |
| } |
| |
| /** |
| * @brief Disable PLLSAI. |
| * @retval HAL status |
| */ |
| HAL_StatusTypeDef HAL_RCCEx_DisablePLLSAI(void) |
| { |
| uint32_t tickstart; |
| |
| /* Disable the PLLSAI */ |
| __HAL_RCC_PLLSAI_DISABLE(); |
| |
| /* Wait till PLLSAI is disabled */ |
| tickstart = HAL_GetTick(); |
| while(__HAL_RCC_PLLSAI_GET_FLAG() != RESET) |
| { |
| if((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) |
| { |
| /* return in case of Timeout detected */ |
| return HAL_TIMEOUT; |
| } |
| } |
| |
| return HAL_OK; |
| } |
| |
| /** |
| * @} |
| */ |
| |
| /** |
| * @} |
| */ |
| |
| #endif /* HAL_RCC_MODULE_ENABLED */ |
| /** |
| * @} |
| */ |
| |
| /** |
| * @} |
| */ |
| |