inport from local
Dependents: Hobbyking_Cheetah_0511
targets/TARGET_STM/TARGET_STM32F4/device/stm32f4xx_hal_rcc_ex.c@0:85b3fd62ea1a, 2020-03-16 (annotated)
- Committer:
- NYX
- Date:
- Mon Mar 16 06:35:48 2020 +0000
- Revision:
- 0:85b3fd62ea1a
reinport to mbed;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
NYX | 0:85b3fd62ea1a | 1 | /** |
NYX | 0:85b3fd62ea1a | 2 | ****************************************************************************** |
NYX | 0:85b3fd62ea1a | 3 | * @file stm32f4xx_hal_rcc_ex.c |
NYX | 0:85b3fd62ea1a | 4 | * @author MCD Application Team |
NYX | 0:85b3fd62ea1a | 5 | * @version V1.7.1 |
NYX | 0:85b3fd62ea1a | 6 | * @date 14-April-2017 |
NYX | 0:85b3fd62ea1a | 7 | * @brief Extension RCC HAL module driver. |
NYX | 0:85b3fd62ea1a | 8 | * This file provides firmware functions to manage the following |
NYX | 0:85b3fd62ea1a | 9 | * functionalities RCC extension peripheral: |
NYX | 0:85b3fd62ea1a | 10 | * + Extended Peripheral Control functions |
NYX | 0:85b3fd62ea1a | 11 | * |
NYX | 0:85b3fd62ea1a | 12 | ****************************************************************************** |
NYX | 0:85b3fd62ea1a | 13 | * @attention |
NYX | 0:85b3fd62ea1a | 14 | * |
NYX | 0:85b3fd62ea1a | 15 | * <h2><center>© COPYRIGHT(c) 2017 STMicroelectronics</center></h2> |
NYX | 0:85b3fd62ea1a | 16 | * |
NYX | 0:85b3fd62ea1a | 17 | * Redistribution and use in source and binary forms, with or without modification, |
NYX | 0:85b3fd62ea1a | 18 | * are permitted provided that the following conditions are met: |
NYX | 0:85b3fd62ea1a | 19 | * 1. Redistributions of source code must retain the above copyright notice, |
NYX | 0:85b3fd62ea1a | 20 | * this list of conditions and the following disclaimer. |
NYX | 0:85b3fd62ea1a | 21 | * 2. Redistributions in binary form must reproduce the above copyright notice, |
NYX | 0:85b3fd62ea1a | 22 | * this list of conditions and the following disclaimer in the documentation |
NYX | 0:85b3fd62ea1a | 23 | * and/or other materials provided with the distribution. |
NYX | 0:85b3fd62ea1a | 24 | * 3. Neither the name of STMicroelectronics nor the names of its contributors |
NYX | 0:85b3fd62ea1a | 25 | * may be used to endorse or promote products derived from this software |
NYX | 0:85b3fd62ea1a | 26 | * without specific prior written permission. |
NYX | 0:85b3fd62ea1a | 27 | * |
NYX | 0:85b3fd62ea1a | 28 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
NYX | 0:85b3fd62ea1a | 29 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
NYX | 0:85b3fd62ea1a | 30 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
NYX | 0:85b3fd62ea1a | 31 | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE |
NYX | 0:85b3fd62ea1a | 32 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
NYX | 0:85b3fd62ea1a | 33 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
NYX | 0:85b3fd62ea1a | 34 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
NYX | 0:85b3fd62ea1a | 35 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
NYX | 0:85b3fd62ea1a | 36 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
NYX | 0:85b3fd62ea1a | 37 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
NYX | 0:85b3fd62ea1a | 38 | * |
NYX | 0:85b3fd62ea1a | 39 | ****************************************************************************** |
NYX | 0:85b3fd62ea1a | 40 | */ |
NYX | 0:85b3fd62ea1a | 41 | |
NYX | 0:85b3fd62ea1a | 42 | /* Includes ------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 43 | #include "stm32f4xx_hal.h" |
NYX | 0:85b3fd62ea1a | 44 | |
NYX | 0:85b3fd62ea1a | 45 | /** @addtogroup STM32F4xx_HAL_Driver |
NYX | 0:85b3fd62ea1a | 46 | * @{ |
NYX | 0:85b3fd62ea1a | 47 | */ |
NYX | 0:85b3fd62ea1a | 48 | |
NYX | 0:85b3fd62ea1a | 49 | /** @defgroup RCCEx RCCEx |
NYX | 0:85b3fd62ea1a | 50 | * @brief RCCEx HAL module driver |
NYX | 0:85b3fd62ea1a | 51 | * @{ |
NYX | 0:85b3fd62ea1a | 52 | */ |
NYX | 0:85b3fd62ea1a | 53 | |
NYX | 0:85b3fd62ea1a | 54 | #ifdef HAL_RCC_MODULE_ENABLED |
NYX | 0:85b3fd62ea1a | 55 | |
NYX | 0:85b3fd62ea1a | 56 | /* Private typedef -----------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 57 | /* Private define ------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 58 | /** @addtogroup RCCEx_Private_Constants |
NYX | 0:85b3fd62ea1a | 59 | * @{ |
NYX | 0:85b3fd62ea1a | 60 | */ |
NYX | 0:85b3fd62ea1a | 61 | /** |
NYX | 0:85b3fd62ea1a | 62 | * @} |
NYX | 0:85b3fd62ea1a | 63 | */ |
NYX | 0:85b3fd62ea1a | 64 | /* Private macro -------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 65 | /* Private variables ---------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 66 | /* Private function prototypes -----------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 67 | /* Private functions ---------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 68 | /** @defgroup RCCEx_Exported_Functions RCCEx Exported Functions |
NYX | 0:85b3fd62ea1a | 69 | * @{ |
NYX | 0:85b3fd62ea1a | 70 | */ |
NYX | 0:85b3fd62ea1a | 71 | |
NYX | 0:85b3fd62ea1a | 72 | /** @defgroup RCCEx_Exported_Functions_Group1 Extended Peripheral Control functions |
NYX | 0:85b3fd62ea1a | 73 | * @brief Extended Peripheral Control functions |
NYX | 0:85b3fd62ea1a | 74 | * |
NYX | 0:85b3fd62ea1a | 75 | @verbatim |
NYX | 0:85b3fd62ea1a | 76 | =============================================================================== |
NYX | 0:85b3fd62ea1a | 77 | ##### Extended Peripheral Control functions ##### |
NYX | 0:85b3fd62ea1a | 78 | =============================================================================== |
NYX | 0:85b3fd62ea1a | 79 | [..] |
NYX | 0:85b3fd62ea1a | 80 | This subsection provides a set of functions allowing to control the RCC Clocks |
NYX | 0:85b3fd62ea1a | 81 | frequencies. |
NYX | 0:85b3fd62ea1a | 82 | [..] |
NYX | 0:85b3fd62ea1a | 83 | (@) Important note: Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to |
NYX | 0:85b3fd62ea1a | 84 | select the RTC clock source; in this case the Backup domain will be reset in |
NYX | 0:85b3fd62ea1a | 85 | order to modify the RTC Clock source, as consequence RTC registers (including |
NYX | 0:85b3fd62ea1a | 86 | the backup registers) and RCC_BDCR register are set to their reset values. |
NYX | 0:85b3fd62ea1a | 87 | |
NYX | 0:85b3fd62ea1a | 88 | @endverbatim |
NYX | 0:85b3fd62ea1a | 89 | * @{ |
NYX | 0:85b3fd62ea1a | 90 | */ |
NYX | 0:85b3fd62ea1a | 91 | |
NYX | 0:85b3fd62ea1a | 92 | #if defined(STM32F446xx) |
NYX | 0:85b3fd62ea1a | 93 | /** |
NYX | 0:85b3fd62ea1a | 94 | * @brief Initializes the RCC extended peripherals clocks according to the specified |
NYX | 0:85b3fd62ea1a | 95 | * parameters in the RCC_PeriphCLKInitTypeDef. |
NYX | 0:85b3fd62ea1a | 96 | * @param PeriphClkInit: pointer to an RCC_PeriphCLKInitTypeDef structure that |
NYX | 0:85b3fd62ea1a | 97 | * contains the configuration information for the Extended Peripherals |
NYX | 0:85b3fd62ea1a | 98 | * clocks(I2S, SAI, LTDC RTC and TIM). |
NYX | 0:85b3fd62ea1a | 99 | * |
NYX | 0:85b3fd62ea1a | 100 | * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select |
NYX | 0:85b3fd62ea1a | 101 | * the RTC clock source; in this case the Backup domain will be reset in |
NYX | 0:85b3fd62ea1a | 102 | * order to modify the RTC Clock source, as consequence RTC registers (including |
NYX | 0:85b3fd62ea1a | 103 | * the backup registers) and RCC_BDCR register are set to their reset values. |
NYX | 0:85b3fd62ea1a | 104 | * |
NYX | 0:85b3fd62ea1a | 105 | * @retval HAL status |
NYX | 0:85b3fd62ea1a | 106 | */ |
NYX | 0:85b3fd62ea1a | 107 | HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) |
NYX | 0:85b3fd62ea1a | 108 | { |
NYX | 0:85b3fd62ea1a | 109 | uint32_t tickstart = 0U; |
NYX | 0:85b3fd62ea1a | 110 | uint32_t tmpreg1 = 0U; |
NYX | 0:85b3fd62ea1a | 111 | uint32_t plli2sp = 0U; |
NYX | 0:85b3fd62ea1a | 112 | uint32_t plli2sq = 0U; |
NYX | 0:85b3fd62ea1a | 113 | uint32_t plli2sr = 0U; |
NYX | 0:85b3fd62ea1a | 114 | uint32_t pllsaip = 0U; |
NYX | 0:85b3fd62ea1a | 115 | uint32_t pllsaiq = 0U; |
NYX | 0:85b3fd62ea1a | 116 | uint32_t plli2sused = 0U; |
NYX | 0:85b3fd62ea1a | 117 | uint32_t pllsaiused = 0U; |
NYX | 0:85b3fd62ea1a | 118 | |
NYX | 0:85b3fd62ea1a | 119 | /* Check the peripheral clock selection parameters */ |
NYX | 0:85b3fd62ea1a | 120 | assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); |
NYX | 0:85b3fd62ea1a | 121 | |
NYX | 0:85b3fd62ea1a | 122 | /*------------------------ I2S APB1 configuration --------------------------*/ |
NYX | 0:85b3fd62ea1a | 123 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == (RCC_PERIPHCLK_I2S_APB1)) |
NYX | 0:85b3fd62ea1a | 124 | { |
NYX | 0:85b3fd62ea1a | 125 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 126 | assert_param(IS_RCC_I2SAPB1CLKSOURCE(PeriphClkInit->I2sApb1ClockSelection)); |
NYX | 0:85b3fd62ea1a | 127 | |
NYX | 0:85b3fd62ea1a | 128 | /* Configure I2S Clock source */ |
NYX | 0:85b3fd62ea1a | 129 | __HAL_RCC_I2S_APB1_CONFIG(PeriphClkInit->I2sApb1ClockSelection); |
NYX | 0:85b3fd62ea1a | 130 | /* Enable the PLLI2S when it's used as clock source for I2S */ |
NYX | 0:85b3fd62ea1a | 131 | if(PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S) |
NYX | 0:85b3fd62ea1a | 132 | { |
NYX | 0:85b3fd62ea1a | 133 | plli2sused = 1U; |
NYX | 0:85b3fd62ea1a | 134 | } |
NYX | 0:85b3fd62ea1a | 135 | } |
NYX | 0:85b3fd62ea1a | 136 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 137 | |
NYX | 0:85b3fd62ea1a | 138 | /*---------------------------- I2S APB2 configuration ----------------------*/ |
NYX | 0:85b3fd62ea1a | 139 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == (RCC_PERIPHCLK_I2S_APB2)) |
NYX | 0:85b3fd62ea1a | 140 | { |
NYX | 0:85b3fd62ea1a | 141 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 142 | assert_param(IS_RCC_I2SAPB2CLKSOURCE(PeriphClkInit->I2sApb2ClockSelection)); |
NYX | 0:85b3fd62ea1a | 143 | |
NYX | 0:85b3fd62ea1a | 144 | /* Configure I2S Clock source */ |
NYX | 0:85b3fd62ea1a | 145 | __HAL_RCC_I2S_APB2_CONFIG(PeriphClkInit->I2sApb2ClockSelection); |
NYX | 0:85b3fd62ea1a | 146 | /* Enable the PLLI2S when it's used as clock source for I2S */ |
NYX | 0:85b3fd62ea1a | 147 | if(PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S) |
NYX | 0:85b3fd62ea1a | 148 | { |
NYX | 0:85b3fd62ea1a | 149 | plli2sused = 1U; |
NYX | 0:85b3fd62ea1a | 150 | } |
NYX | 0:85b3fd62ea1a | 151 | } |
NYX | 0:85b3fd62ea1a | 152 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 153 | |
NYX | 0:85b3fd62ea1a | 154 | /*--------------------------- SAI1 configuration ---------------------------*/ |
NYX | 0:85b3fd62ea1a | 155 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == (RCC_PERIPHCLK_SAI1)) |
NYX | 0:85b3fd62ea1a | 156 | { |
NYX | 0:85b3fd62ea1a | 157 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 158 | assert_param(IS_RCC_SAI1CLKSOURCE(PeriphClkInit->Sai1ClockSelection)); |
NYX | 0:85b3fd62ea1a | 159 | |
NYX | 0:85b3fd62ea1a | 160 | /* Configure SAI1 Clock source */ |
NYX | 0:85b3fd62ea1a | 161 | __HAL_RCC_SAI1_CONFIG(PeriphClkInit->Sai1ClockSelection); |
NYX | 0:85b3fd62ea1a | 162 | /* Enable the PLLI2S when it's used as clock source for SAI */ |
NYX | 0:85b3fd62ea1a | 163 | if(PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLI2S) |
NYX | 0:85b3fd62ea1a | 164 | { |
NYX | 0:85b3fd62ea1a | 165 | plli2sused = 1U; |
NYX | 0:85b3fd62ea1a | 166 | } |
NYX | 0:85b3fd62ea1a | 167 | /* Enable the PLLSAI when it's used as clock source for SAI */ |
NYX | 0:85b3fd62ea1a | 168 | if(PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLSAI) |
NYX | 0:85b3fd62ea1a | 169 | { |
NYX | 0:85b3fd62ea1a | 170 | pllsaiused = 1U; |
NYX | 0:85b3fd62ea1a | 171 | } |
NYX | 0:85b3fd62ea1a | 172 | } |
NYX | 0:85b3fd62ea1a | 173 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 174 | |
NYX | 0:85b3fd62ea1a | 175 | /*-------------------------- SAI2 configuration ----------------------------*/ |
NYX | 0:85b3fd62ea1a | 176 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == (RCC_PERIPHCLK_SAI2)) |
NYX | 0:85b3fd62ea1a | 177 | { |
NYX | 0:85b3fd62ea1a | 178 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 179 | assert_param(IS_RCC_SAI2CLKSOURCE(PeriphClkInit->Sai2ClockSelection)); |
NYX | 0:85b3fd62ea1a | 180 | |
NYX | 0:85b3fd62ea1a | 181 | /* Configure SAI2 Clock source */ |
NYX | 0:85b3fd62ea1a | 182 | __HAL_RCC_SAI2_CONFIG(PeriphClkInit->Sai2ClockSelection); |
NYX | 0:85b3fd62ea1a | 183 | |
NYX | 0:85b3fd62ea1a | 184 | /* Enable the PLLI2S when it's used as clock source for SAI */ |
NYX | 0:85b3fd62ea1a | 185 | if(PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLI2S) |
NYX | 0:85b3fd62ea1a | 186 | { |
NYX | 0:85b3fd62ea1a | 187 | plli2sused = 1U; |
NYX | 0:85b3fd62ea1a | 188 | } |
NYX | 0:85b3fd62ea1a | 189 | /* Enable the PLLSAI when it's used as clock source for SAI */ |
NYX | 0:85b3fd62ea1a | 190 | if(PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLSAI) |
NYX | 0:85b3fd62ea1a | 191 | { |
NYX | 0:85b3fd62ea1a | 192 | pllsaiused = 1U; |
NYX | 0:85b3fd62ea1a | 193 | } |
NYX | 0:85b3fd62ea1a | 194 | } |
NYX | 0:85b3fd62ea1a | 195 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 196 | |
NYX | 0:85b3fd62ea1a | 197 | /*----------------------------- RTC configuration --------------------------*/ |
NYX | 0:85b3fd62ea1a | 198 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) |
NYX | 0:85b3fd62ea1a | 199 | { |
NYX | 0:85b3fd62ea1a | 200 | /* Check for RTC Parameters used to output RTCCLK */ |
NYX | 0:85b3fd62ea1a | 201 | assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); |
NYX | 0:85b3fd62ea1a | 202 | |
NYX | 0:85b3fd62ea1a | 203 | /* Enable Power Clock*/ |
NYX | 0:85b3fd62ea1a | 204 | __HAL_RCC_PWR_CLK_ENABLE(); |
NYX | 0:85b3fd62ea1a | 205 | |
NYX | 0:85b3fd62ea1a | 206 | /* Enable write access to Backup domain */ |
NYX | 0:85b3fd62ea1a | 207 | PWR->CR |= PWR_CR_DBP; |
NYX | 0:85b3fd62ea1a | 208 | |
NYX | 0:85b3fd62ea1a | 209 | /* Get tick */ |
NYX | 0:85b3fd62ea1a | 210 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 211 | |
NYX | 0:85b3fd62ea1a | 212 | while((PWR->CR & PWR_CR_DBP) == RESET) |
NYX | 0:85b3fd62ea1a | 213 | { |
NYX | 0:85b3fd62ea1a | 214 | if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 215 | { |
NYX | 0:85b3fd62ea1a | 216 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 217 | } |
NYX | 0:85b3fd62ea1a | 218 | } |
NYX | 0:85b3fd62ea1a | 219 | /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ |
NYX | 0:85b3fd62ea1a | 220 | tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); |
NYX | 0:85b3fd62ea1a | 221 | if((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) |
NYX | 0:85b3fd62ea1a | 222 | { |
NYX | 0:85b3fd62ea1a | 223 | /* Store the content of BDCR register before the reset of Backup Domain */ |
NYX | 0:85b3fd62ea1a | 224 | tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); |
NYX | 0:85b3fd62ea1a | 225 | /* RTC Clock selection can be changed only if the Backup Domain is reset */ |
NYX | 0:85b3fd62ea1a | 226 | __HAL_RCC_BACKUPRESET_FORCE(); |
NYX | 0:85b3fd62ea1a | 227 | __HAL_RCC_BACKUPRESET_RELEASE(); |
NYX | 0:85b3fd62ea1a | 228 | /* Restore the Content of BDCR register */ |
NYX | 0:85b3fd62ea1a | 229 | RCC->BDCR = tmpreg1; |
NYX | 0:85b3fd62ea1a | 230 | |
NYX | 0:85b3fd62ea1a | 231 | /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ |
NYX | 0:85b3fd62ea1a | 232 | if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) |
NYX | 0:85b3fd62ea1a | 233 | { |
NYX | 0:85b3fd62ea1a | 234 | /* Get tick */ |
NYX | 0:85b3fd62ea1a | 235 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 236 | |
NYX | 0:85b3fd62ea1a | 237 | /* Wait till LSE is ready */ |
NYX | 0:85b3fd62ea1a | 238 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) |
NYX | 0:85b3fd62ea1a | 239 | { |
NYX | 0:85b3fd62ea1a | 240 | if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 241 | { |
NYX | 0:85b3fd62ea1a | 242 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 243 | } |
NYX | 0:85b3fd62ea1a | 244 | } |
NYX | 0:85b3fd62ea1a | 245 | } |
NYX | 0:85b3fd62ea1a | 246 | } |
NYX | 0:85b3fd62ea1a | 247 | __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); |
NYX | 0:85b3fd62ea1a | 248 | } |
NYX | 0:85b3fd62ea1a | 249 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 250 | |
NYX | 0:85b3fd62ea1a | 251 | /*---------------------------- TIM configuration ---------------------------*/ |
NYX | 0:85b3fd62ea1a | 252 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) |
NYX | 0:85b3fd62ea1a | 253 | { |
NYX | 0:85b3fd62ea1a | 254 | /* Configure Timer Prescaler */ |
NYX | 0:85b3fd62ea1a | 255 | __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); |
NYX | 0:85b3fd62ea1a | 256 | } |
NYX | 0:85b3fd62ea1a | 257 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 258 | |
NYX | 0:85b3fd62ea1a | 259 | /*---------------------------- FMPI2C1 Configuration -----------------------*/ |
NYX | 0:85b3fd62ea1a | 260 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_FMPI2C1) == RCC_PERIPHCLK_FMPI2C1) |
NYX | 0:85b3fd62ea1a | 261 | { |
NYX | 0:85b3fd62ea1a | 262 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 263 | assert_param(IS_RCC_FMPI2C1CLKSOURCE(PeriphClkInit->Fmpi2c1ClockSelection)); |
NYX | 0:85b3fd62ea1a | 264 | |
NYX | 0:85b3fd62ea1a | 265 | /* Configure the FMPI2C1 clock source */ |
NYX | 0:85b3fd62ea1a | 266 | __HAL_RCC_FMPI2C1_CONFIG(PeriphClkInit->Fmpi2c1ClockSelection); |
NYX | 0:85b3fd62ea1a | 267 | } |
NYX | 0:85b3fd62ea1a | 268 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 269 | |
NYX | 0:85b3fd62ea1a | 270 | /*------------------------------ CEC Configuration -------------------------*/ |
NYX | 0:85b3fd62ea1a | 271 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CEC) == RCC_PERIPHCLK_CEC) |
NYX | 0:85b3fd62ea1a | 272 | { |
NYX | 0:85b3fd62ea1a | 273 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 274 | assert_param(IS_RCC_CECCLKSOURCE(PeriphClkInit->CecClockSelection)); |
NYX | 0:85b3fd62ea1a | 275 | |
NYX | 0:85b3fd62ea1a | 276 | /* Configure the CEC clock source */ |
NYX | 0:85b3fd62ea1a | 277 | __HAL_RCC_CEC_CONFIG(PeriphClkInit->CecClockSelection); |
NYX | 0:85b3fd62ea1a | 278 | } |
NYX | 0:85b3fd62ea1a | 279 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 280 | |
NYX | 0:85b3fd62ea1a | 281 | /*----------------------------- CLK48 Configuration ------------------------*/ |
NYX | 0:85b3fd62ea1a | 282 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) |
NYX | 0:85b3fd62ea1a | 283 | { |
NYX | 0:85b3fd62ea1a | 284 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 285 | assert_param(IS_RCC_CLK48CLKSOURCE(PeriphClkInit->Clk48ClockSelection)); |
NYX | 0:85b3fd62ea1a | 286 | |
NYX | 0:85b3fd62ea1a | 287 | /* Configure the CLK48 clock source */ |
NYX | 0:85b3fd62ea1a | 288 | __HAL_RCC_CLK48_CONFIG(PeriphClkInit->Clk48ClockSelection); |
NYX | 0:85b3fd62ea1a | 289 | |
NYX | 0:85b3fd62ea1a | 290 | /* Enable the PLLSAI when it's used as clock source for CLK48 */ |
NYX | 0:85b3fd62ea1a | 291 | if(PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP) |
NYX | 0:85b3fd62ea1a | 292 | { |
NYX | 0:85b3fd62ea1a | 293 | pllsaiused = 1U; |
NYX | 0:85b3fd62ea1a | 294 | } |
NYX | 0:85b3fd62ea1a | 295 | } |
NYX | 0:85b3fd62ea1a | 296 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 297 | |
NYX | 0:85b3fd62ea1a | 298 | /*----------------------------- SDIO Configuration -------------------------*/ |
NYX | 0:85b3fd62ea1a | 299 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) |
NYX | 0:85b3fd62ea1a | 300 | { |
NYX | 0:85b3fd62ea1a | 301 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 302 | assert_param(IS_RCC_SDIOCLKSOURCE(PeriphClkInit->SdioClockSelection)); |
NYX | 0:85b3fd62ea1a | 303 | |
NYX | 0:85b3fd62ea1a | 304 | /* Configure the SDIO clock source */ |
NYX | 0:85b3fd62ea1a | 305 | __HAL_RCC_SDIO_CONFIG(PeriphClkInit->SdioClockSelection); |
NYX | 0:85b3fd62ea1a | 306 | } |
NYX | 0:85b3fd62ea1a | 307 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 308 | |
NYX | 0:85b3fd62ea1a | 309 | /*------------------------------ SPDIFRX Configuration ---------------------*/ |
NYX | 0:85b3fd62ea1a | 310 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SPDIFRX) == RCC_PERIPHCLK_SPDIFRX) |
NYX | 0:85b3fd62ea1a | 311 | { |
NYX | 0:85b3fd62ea1a | 312 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 313 | assert_param(IS_RCC_SPDIFRXCLKSOURCE(PeriphClkInit->SpdifClockSelection)); |
NYX | 0:85b3fd62ea1a | 314 | |
NYX | 0:85b3fd62ea1a | 315 | /* Configure the SPDIFRX clock source */ |
NYX | 0:85b3fd62ea1a | 316 | __HAL_RCC_SPDIFRX_CONFIG(PeriphClkInit->SpdifClockSelection); |
NYX | 0:85b3fd62ea1a | 317 | /* Enable the PLLI2S when it's used as clock source for SPDIFRX */ |
NYX | 0:85b3fd62ea1a | 318 | if(PeriphClkInit->SpdifClockSelection == RCC_SPDIFRXCLKSOURCE_PLLI2SP) |
NYX | 0:85b3fd62ea1a | 319 | { |
NYX | 0:85b3fd62ea1a | 320 | plli2sused = 1U; |
NYX | 0:85b3fd62ea1a | 321 | } |
NYX | 0:85b3fd62ea1a | 322 | } |
NYX | 0:85b3fd62ea1a | 323 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 324 | |
NYX | 0:85b3fd62ea1a | 325 | /*---------------------------- PLLI2S Configuration ------------------------*/ |
NYX | 0:85b3fd62ea1a | 326 | /* PLLI2S is configured when a peripheral will use it as source clock : SAI1, SAI2, I2S on APB1, |
NYX | 0:85b3fd62ea1a | 327 | I2S on APB2 or SPDIFRX */ |
NYX | 0:85b3fd62ea1a | 328 | if((plli2sused == 1U) || (PeriphClkInit->PeriphClockSelection == RCC_PERIPHCLK_PLLI2S)) |
NYX | 0:85b3fd62ea1a | 329 | { |
NYX | 0:85b3fd62ea1a | 330 | /* Disable the PLLI2S */ |
NYX | 0:85b3fd62ea1a | 331 | __HAL_RCC_PLLI2S_DISABLE(); |
NYX | 0:85b3fd62ea1a | 332 | /* Get tick */ |
NYX | 0:85b3fd62ea1a | 333 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 334 | /* Wait till PLLI2S is disabled */ |
NYX | 0:85b3fd62ea1a | 335 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) |
NYX | 0:85b3fd62ea1a | 336 | { |
NYX | 0:85b3fd62ea1a | 337 | if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 338 | { |
NYX | 0:85b3fd62ea1a | 339 | /* return in case of Timeout detected */ |
NYX | 0:85b3fd62ea1a | 340 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 341 | } |
NYX | 0:85b3fd62ea1a | 342 | } |
NYX | 0:85b3fd62ea1a | 343 | |
NYX | 0:85b3fd62ea1a | 344 | /* check for common PLLI2S Parameters */ |
NYX | 0:85b3fd62ea1a | 345 | assert_param(IS_RCC_PLLI2SM_VALUE(PeriphClkInit->PLLI2S.PLLI2SM)); |
NYX | 0:85b3fd62ea1a | 346 | assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); |
NYX | 0:85b3fd62ea1a | 347 | |
NYX | 0:85b3fd62ea1a | 348 | /*------ In Case of PLLI2S is selected as source clock for I2S -----------*/ |
NYX | 0:85b3fd62ea1a | 349 | if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == RCC_PERIPHCLK_I2S_APB1) && (PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S)) || |
NYX | 0:85b3fd62ea1a | 350 | ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == RCC_PERIPHCLK_I2S_APB2) && (PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S))) |
NYX | 0:85b3fd62ea1a | 351 | { |
NYX | 0:85b3fd62ea1a | 352 | /* check for Parameters */ |
NYX | 0:85b3fd62ea1a | 353 | assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); |
NYX | 0:85b3fd62ea1a | 354 | |
NYX | 0:85b3fd62ea1a | 355 | /* Read PLLI2SP/PLLI2SQ value from PLLI2SCFGR register (this value is not needed for I2S configuration) */ |
NYX | 0:85b3fd62ea1a | 356 | plli2sp = ((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SP)) + 1U) << 1U); |
NYX | 0:85b3fd62ea1a | 357 | plli2sq = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SQ)); |
NYX | 0:85b3fd62ea1a | 358 | /* Configure the PLLI2S division factors */ |
NYX | 0:85b3fd62ea1a | 359 | /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ |
NYX | 0:85b3fd62ea1a | 360 | /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ |
NYX | 0:85b3fd62ea1a | 361 | __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , plli2sp, plli2sq, PeriphClkInit->PLLI2S.PLLI2SR); |
NYX | 0:85b3fd62ea1a | 362 | } |
NYX | 0:85b3fd62ea1a | 363 | |
NYX | 0:85b3fd62ea1a | 364 | /*------- In Case of PLLI2S is selected as source clock for SAI ----------*/ |
NYX | 0:85b3fd62ea1a | 365 | if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == RCC_PERIPHCLK_SAI1) && (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLI2S)) || |
NYX | 0:85b3fd62ea1a | 366 | ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == RCC_PERIPHCLK_SAI2) && (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLI2S))) |
NYX | 0:85b3fd62ea1a | 367 | { |
NYX | 0:85b3fd62ea1a | 368 | /* Check for PLLI2S Parameters */ |
NYX | 0:85b3fd62ea1a | 369 | assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); |
NYX | 0:85b3fd62ea1a | 370 | /* Check for PLLI2S/DIVQ parameters */ |
NYX | 0:85b3fd62ea1a | 371 | assert_param(IS_RCC_PLLI2S_DIVQ_VALUE(PeriphClkInit->PLLI2SDivQ)); |
NYX | 0:85b3fd62ea1a | 372 | |
NYX | 0:85b3fd62ea1a | 373 | /* Read PLLI2SP/PLLI2SR value from PLLI2SCFGR register (this value is not needed for SAI configuration) */ |
NYX | 0:85b3fd62ea1a | 374 | plli2sp = ((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SP)) + 1U) << 1U); |
NYX | 0:85b3fd62ea1a | 375 | plli2sr = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SR)); |
NYX | 0:85b3fd62ea1a | 376 | /* Configure the PLLI2S division factors */ |
NYX | 0:85b3fd62ea1a | 377 | /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ |
NYX | 0:85b3fd62ea1a | 378 | /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ |
NYX | 0:85b3fd62ea1a | 379 | /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ |
NYX | 0:85b3fd62ea1a | 380 | __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , plli2sp, PeriphClkInit->PLLI2S.PLLI2SQ, plli2sr); |
NYX | 0:85b3fd62ea1a | 381 | |
NYX | 0:85b3fd62ea1a | 382 | /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ |
NYX | 0:85b3fd62ea1a | 383 | __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLI2SDivQ); |
NYX | 0:85b3fd62ea1a | 384 | } |
NYX | 0:85b3fd62ea1a | 385 | |
NYX | 0:85b3fd62ea1a | 386 | /*------ In Case of PLLI2S is selected as source clock for SPDIFRX -------*/ |
NYX | 0:85b3fd62ea1a | 387 | if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SPDIFRX) == RCC_PERIPHCLK_SPDIFRX) && (PeriphClkInit->SpdifClockSelection == RCC_SPDIFRXCLKSOURCE_PLLI2SP)) |
NYX | 0:85b3fd62ea1a | 388 | { |
NYX | 0:85b3fd62ea1a | 389 | /* check for Parameters */ |
NYX | 0:85b3fd62ea1a | 390 | assert_param(IS_RCC_PLLI2SP_VALUE(PeriphClkInit->PLLI2S.PLLI2SP)); |
NYX | 0:85b3fd62ea1a | 391 | /* Read PLLI2SR value from PLLI2SCFGR register (this value is not need for SAI configuration) */ |
NYX | 0:85b3fd62ea1a | 392 | plli2sq = ((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SP)) + 1U) << 1U); |
NYX | 0:85b3fd62ea1a | 393 | plli2sr = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SR)); |
NYX | 0:85b3fd62ea1a | 394 | /* Configure the PLLI2S division factors */ |
NYX | 0:85b3fd62ea1a | 395 | /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ |
NYX | 0:85b3fd62ea1a | 396 | /* SPDIFRXCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SP */ |
NYX | 0:85b3fd62ea1a | 397 | __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SP, plli2sq, plli2sr); |
NYX | 0:85b3fd62ea1a | 398 | } |
NYX | 0:85b3fd62ea1a | 399 | |
NYX | 0:85b3fd62ea1a | 400 | /*----------------- In Case of PLLI2S is just selected -----------------*/ |
NYX | 0:85b3fd62ea1a | 401 | if((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) |
NYX | 0:85b3fd62ea1a | 402 | { |
NYX | 0:85b3fd62ea1a | 403 | /* Check for Parameters */ |
NYX | 0:85b3fd62ea1a | 404 | assert_param(IS_RCC_PLLI2SP_VALUE(PeriphClkInit->PLLI2S.PLLI2SP)); |
NYX | 0:85b3fd62ea1a | 405 | assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); |
NYX | 0:85b3fd62ea1a | 406 | assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); |
NYX | 0:85b3fd62ea1a | 407 | |
NYX | 0:85b3fd62ea1a | 408 | /* Configure the PLLI2S division factors */ |
NYX | 0:85b3fd62ea1a | 409 | /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ |
NYX | 0:85b3fd62ea1a | 410 | __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SP, PeriphClkInit->PLLI2S.PLLI2SQ, PeriphClkInit->PLLI2S.PLLI2SR); |
NYX | 0:85b3fd62ea1a | 411 | } |
NYX | 0:85b3fd62ea1a | 412 | |
NYX | 0:85b3fd62ea1a | 413 | /* Enable the PLLI2S */ |
NYX | 0:85b3fd62ea1a | 414 | __HAL_RCC_PLLI2S_ENABLE(); |
NYX | 0:85b3fd62ea1a | 415 | /* Get tick */ |
NYX | 0:85b3fd62ea1a | 416 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 417 | /* Wait till PLLI2S is ready */ |
NYX | 0:85b3fd62ea1a | 418 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) |
NYX | 0:85b3fd62ea1a | 419 | { |
NYX | 0:85b3fd62ea1a | 420 | if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 421 | { |
NYX | 0:85b3fd62ea1a | 422 | /* return in case of Timeout detected */ |
NYX | 0:85b3fd62ea1a | 423 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 424 | } |
NYX | 0:85b3fd62ea1a | 425 | } |
NYX | 0:85b3fd62ea1a | 426 | } |
NYX | 0:85b3fd62ea1a | 427 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 428 | |
NYX | 0:85b3fd62ea1a | 429 | /*----------------------------- PLLSAI Configuration -----------------------*/ |
NYX | 0:85b3fd62ea1a | 430 | /* PLLSAI is configured when a peripheral will use it as source clock : SAI1, SAI2, CLK48 or SDIO */ |
NYX | 0:85b3fd62ea1a | 431 | if(pllsaiused == 1U) |
NYX | 0:85b3fd62ea1a | 432 | { |
NYX | 0:85b3fd62ea1a | 433 | /* Disable PLLSAI Clock */ |
NYX | 0:85b3fd62ea1a | 434 | __HAL_RCC_PLLSAI_DISABLE(); |
NYX | 0:85b3fd62ea1a | 435 | /* Get tick */ |
NYX | 0:85b3fd62ea1a | 436 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 437 | /* Wait till PLLSAI is disabled */ |
NYX | 0:85b3fd62ea1a | 438 | while(__HAL_RCC_PLLSAI_GET_FLAG() != RESET) |
NYX | 0:85b3fd62ea1a | 439 | { |
NYX | 0:85b3fd62ea1a | 440 | if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 441 | { |
NYX | 0:85b3fd62ea1a | 442 | /* return in case of Timeout detected */ |
NYX | 0:85b3fd62ea1a | 443 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 444 | } |
NYX | 0:85b3fd62ea1a | 445 | } |
NYX | 0:85b3fd62ea1a | 446 | |
NYX | 0:85b3fd62ea1a | 447 | /* Check the PLLSAI division factors */ |
NYX | 0:85b3fd62ea1a | 448 | assert_param(IS_RCC_PLLSAIM_VALUE(PeriphClkInit->PLLSAI.PLLSAIM)); |
NYX | 0:85b3fd62ea1a | 449 | assert_param(IS_RCC_PLLSAIN_VALUE(PeriphClkInit->PLLSAI.PLLSAIN)); |
NYX | 0:85b3fd62ea1a | 450 | |
NYX | 0:85b3fd62ea1a | 451 | /*------ In Case of PLLSAI is selected as source clock for SAI -----------*/ |
NYX | 0:85b3fd62ea1a | 452 | if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == RCC_PERIPHCLK_SAI1) && (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLSAI)) || |
NYX | 0:85b3fd62ea1a | 453 | ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == RCC_PERIPHCLK_SAI2) && (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLSAI))) |
NYX | 0:85b3fd62ea1a | 454 | { |
NYX | 0:85b3fd62ea1a | 455 | /* check for PLLSAIQ Parameter */ |
NYX | 0:85b3fd62ea1a | 456 | assert_param(IS_RCC_PLLSAIQ_VALUE(PeriphClkInit->PLLSAI.PLLSAIQ)); |
NYX | 0:85b3fd62ea1a | 457 | /* check for PLLSAI/DIVQ Parameter */ |
NYX | 0:85b3fd62ea1a | 458 | assert_param(IS_RCC_PLLSAI_DIVQ_VALUE(PeriphClkInit->PLLSAIDivQ)); |
NYX | 0:85b3fd62ea1a | 459 | |
NYX | 0:85b3fd62ea1a | 460 | /* Read PLLSAIP value from PLLSAICFGR register (this value is not needed for SAI configuration) */ |
NYX | 0:85b3fd62ea1a | 461 | pllsaip = ((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> POSITION_VAL(RCC_PLLSAICFGR_PLLSAIP)) + 1U) << 1U); |
NYX | 0:85b3fd62ea1a | 462 | /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ |
NYX | 0:85b3fd62ea1a | 463 | /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ |
NYX | 0:85b3fd62ea1a | 464 | /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ |
NYX | 0:85b3fd62ea1a | 465 | __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIM, PeriphClkInit->PLLSAI.PLLSAIN , pllsaip, PeriphClkInit->PLLSAI.PLLSAIQ, 0U); |
NYX | 0:85b3fd62ea1a | 466 | |
NYX | 0:85b3fd62ea1a | 467 | /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ |
NYX | 0:85b3fd62ea1a | 468 | __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLSAIDivQ); |
NYX | 0:85b3fd62ea1a | 469 | } |
NYX | 0:85b3fd62ea1a | 470 | |
NYX | 0:85b3fd62ea1a | 471 | /*------ In Case of PLLSAI is selected as source clock for CLK48 ---------*/ |
NYX | 0:85b3fd62ea1a | 472 | /* In Case of PLLI2S is selected as source clock for CLK48 */ |
NYX | 0:85b3fd62ea1a | 473 | if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) && (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP)) |
NYX | 0:85b3fd62ea1a | 474 | { |
NYX | 0:85b3fd62ea1a | 475 | /* check for Parameters */ |
NYX | 0:85b3fd62ea1a | 476 | assert_param(IS_RCC_PLLSAIP_VALUE(PeriphClkInit->PLLSAI.PLLSAIP)); |
NYX | 0:85b3fd62ea1a | 477 | /* Read PLLSAIQ value from PLLI2SCFGR register (this value is not need for SAI configuration) */ |
NYX | 0:85b3fd62ea1a | 478 | pllsaiq = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> POSITION_VAL(RCC_PLLSAICFGR_PLLSAIQ)); |
NYX | 0:85b3fd62ea1a | 479 | /* Configure the PLLSAI division factors */ |
NYX | 0:85b3fd62ea1a | 480 | /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) * (PLLI2SN/PLLSAIM) */ |
NYX | 0:85b3fd62ea1a | 481 | /* 48CLK = f(PLLSAI clock output) = f(VCO clock) / PLLSAIP */ |
NYX | 0:85b3fd62ea1a | 482 | __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIM, PeriphClkInit->PLLSAI.PLLSAIN , PeriphClkInit->PLLSAI.PLLSAIP, pllsaiq, 0U); |
NYX | 0:85b3fd62ea1a | 483 | } |
NYX | 0:85b3fd62ea1a | 484 | |
NYX | 0:85b3fd62ea1a | 485 | /* Enable PLLSAI Clock */ |
NYX | 0:85b3fd62ea1a | 486 | __HAL_RCC_PLLSAI_ENABLE(); |
NYX | 0:85b3fd62ea1a | 487 | /* Get tick */ |
NYX | 0:85b3fd62ea1a | 488 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 489 | /* Wait till PLLSAI is ready */ |
NYX | 0:85b3fd62ea1a | 490 | while(__HAL_RCC_PLLSAI_GET_FLAG() == RESET) |
NYX | 0:85b3fd62ea1a | 491 | { |
NYX | 0:85b3fd62ea1a | 492 | if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 493 | { |
NYX | 0:85b3fd62ea1a | 494 | /* return in case of Timeout detected */ |
NYX | 0:85b3fd62ea1a | 495 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 496 | } |
NYX | 0:85b3fd62ea1a | 497 | } |
NYX | 0:85b3fd62ea1a | 498 | } |
NYX | 0:85b3fd62ea1a | 499 | return HAL_OK; |
NYX | 0:85b3fd62ea1a | 500 | } |
NYX | 0:85b3fd62ea1a | 501 | |
NYX | 0:85b3fd62ea1a | 502 | /** |
NYX | 0:85b3fd62ea1a | 503 | * @brief Get the RCC_PeriphCLKInitTypeDef according to the internal |
NYX | 0:85b3fd62ea1a | 504 | * RCC configuration registers. |
NYX | 0:85b3fd62ea1a | 505 | * @param PeriphClkInit: pointer to an RCC_PeriphCLKInitTypeDef structure that |
NYX | 0:85b3fd62ea1a | 506 | * will be configured. |
NYX | 0:85b3fd62ea1a | 507 | * @retval None |
NYX | 0:85b3fd62ea1a | 508 | */ |
NYX | 0:85b3fd62ea1a | 509 | void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) |
NYX | 0:85b3fd62ea1a | 510 | { |
NYX | 0:85b3fd62ea1a | 511 | uint32_t tempreg; |
NYX | 0:85b3fd62ea1a | 512 | |
NYX | 0:85b3fd62ea1a | 513 | /* Set all possible values for the extended clock type parameter------------*/ |
NYX | 0:85b3fd62ea1a | 514 | PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_I2S_APB2 |\ |
NYX | 0:85b3fd62ea1a | 515 | RCC_PERIPHCLK_SAI1 | RCC_PERIPHCLK_SAI2 |\ |
NYX | 0:85b3fd62ea1a | 516 | RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC |\ |
NYX | 0:85b3fd62ea1a | 517 | RCC_PERIPHCLK_CEC | RCC_PERIPHCLK_FMPI2C1 |\ |
NYX | 0:85b3fd62ea1a | 518 | RCC_PERIPHCLK_CLK48 | RCC_PERIPHCLK_SDIO |\ |
NYX | 0:85b3fd62ea1a | 519 | RCC_PERIPHCLK_SPDIFRX; |
NYX | 0:85b3fd62ea1a | 520 | |
NYX | 0:85b3fd62ea1a | 521 | /* Get the PLLI2S Clock configuration --------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 522 | PeriphClkInit->PLLI2S.PLLI2SM = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SM)); |
NYX | 0:85b3fd62ea1a | 523 | PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SN)); |
NYX | 0:85b3fd62ea1a | 524 | PeriphClkInit->PLLI2S.PLLI2SP = (uint32_t)((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SP)) + 1U) << 1U); |
NYX | 0:85b3fd62ea1a | 525 | PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SQ)); |
NYX | 0:85b3fd62ea1a | 526 | PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SR)); |
NYX | 0:85b3fd62ea1a | 527 | /* Get the PLLSAI Clock configuration --------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 528 | PeriphClkInit->PLLSAI.PLLSAIM = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM) >> POSITION_VAL(RCC_PLLSAICFGR_PLLSAIM)); |
NYX | 0:85b3fd62ea1a | 529 | PeriphClkInit->PLLSAI.PLLSAIN = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> POSITION_VAL(RCC_PLLSAICFGR_PLLSAIN)); |
NYX | 0:85b3fd62ea1a | 530 | PeriphClkInit->PLLSAI.PLLSAIP = (uint32_t)((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> POSITION_VAL(RCC_PLLSAICFGR_PLLSAIP)) + 1U) << 1U); |
NYX | 0:85b3fd62ea1a | 531 | PeriphClkInit->PLLSAI.PLLSAIQ = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> POSITION_VAL(RCC_PLLSAICFGR_PLLSAIQ)); |
NYX | 0:85b3fd62ea1a | 532 | /* Get the PLLSAI/PLLI2S division factors ----------------------------------*/ |
NYX | 0:85b3fd62ea1a | 533 | PeriphClkInit->PLLI2SDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) >> POSITION_VAL(RCC_DCKCFGR_PLLI2SDIVQ)); |
NYX | 0:85b3fd62ea1a | 534 | PeriphClkInit->PLLSAIDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> POSITION_VAL(RCC_DCKCFGR_PLLSAIDIVQ)); |
NYX | 0:85b3fd62ea1a | 535 | |
NYX | 0:85b3fd62ea1a | 536 | /* Get the SAI1 clock configuration ----------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 537 | PeriphClkInit->Sai1ClockSelection = __HAL_RCC_GET_SAI1_SOURCE(); |
NYX | 0:85b3fd62ea1a | 538 | |
NYX | 0:85b3fd62ea1a | 539 | /* Get the SAI2 clock configuration ----------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 540 | PeriphClkInit->Sai2ClockSelection = __HAL_RCC_GET_SAI2_SOURCE(); |
NYX | 0:85b3fd62ea1a | 541 | |
NYX | 0:85b3fd62ea1a | 542 | /* Get the I2S APB1 clock configuration ------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 543 | PeriphClkInit->I2sApb1ClockSelection = __HAL_RCC_GET_I2S_APB1_SOURCE(); |
NYX | 0:85b3fd62ea1a | 544 | |
NYX | 0:85b3fd62ea1a | 545 | /* Get the I2S APB2 clock configuration ------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 546 | PeriphClkInit->I2sApb2ClockSelection = __HAL_RCC_GET_I2S_APB2_SOURCE(); |
NYX | 0:85b3fd62ea1a | 547 | |
NYX | 0:85b3fd62ea1a | 548 | /* Get the RTC Clock configuration -----------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 549 | tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); |
NYX | 0:85b3fd62ea1a | 550 | PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); |
NYX | 0:85b3fd62ea1a | 551 | |
NYX | 0:85b3fd62ea1a | 552 | /* Get the CEC clock configuration -----------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 553 | PeriphClkInit->CecClockSelection = __HAL_RCC_GET_CEC_SOURCE(); |
NYX | 0:85b3fd62ea1a | 554 | |
NYX | 0:85b3fd62ea1a | 555 | /* Get the FMPI2C1 clock configuration -------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 556 | PeriphClkInit->Fmpi2c1ClockSelection = __HAL_RCC_GET_FMPI2C1_SOURCE(); |
NYX | 0:85b3fd62ea1a | 557 | |
NYX | 0:85b3fd62ea1a | 558 | /* Get the CLK48 clock configuration ----------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 559 | PeriphClkInit->Clk48ClockSelection = __HAL_RCC_GET_CLK48_SOURCE(); |
NYX | 0:85b3fd62ea1a | 560 | |
NYX | 0:85b3fd62ea1a | 561 | /* Get the SDIO clock configuration ----------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 562 | PeriphClkInit->SdioClockSelection = __HAL_RCC_GET_SDIO_SOURCE(); |
NYX | 0:85b3fd62ea1a | 563 | |
NYX | 0:85b3fd62ea1a | 564 | /* Get the SPDIFRX clock configuration -------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 565 | PeriphClkInit->SpdifClockSelection = __HAL_RCC_GET_SPDIFRX_SOURCE(); |
NYX | 0:85b3fd62ea1a | 566 | |
NYX | 0:85b3fd62ea1a | 567 | /* Get the TIM Prescaler configuration -------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 568 | if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) |
NYX | 0:85b3fd62ea1a | 569 | { |
NYX | 0:85b3fd62ea1a | 570 | PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; |
NYX | 0:85b3fd62ea1a | 571 | } |
NYX | 0:85b3fd62ea1a | 572 | else |
NYX | 0:85b3fd62ea1a | 573 | { |
NYX | 0:85b3fd62ea1a | 574 | PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; |
NYX | 0:85b3fd62ea1a | 575 | } |
NYX | 0:85b3fd62ea1a | 576 | } |
NYX | 0:85b3fd62ea1a | 577 | |
NYX | 0:85b3fd62ea1a | 578 | /** |
NYX | 0:85b3fd62ea1a | 579 | * @brief Return the peripheral clock frequency for a given peripheral(SAI..) |
NYX | 0:85b3fd62ea1a | 580 | * @note Return 0 if peripheral clock identifier not managed by this API |
NYX | 0:85b3fd62ea1a | 581 | * @param PeriphClk: Peripheral clock identifier |
NYX | 0:85b3fd62ea1a | 582 | * This parameter can be one of the following values: |
NYX | 0:85b3fd62ea1a | 583 | * @arg RCC_PERIPHCLK_SAI1: SAI1 peripheral clock |
NYX | 0:85b3fd62ea1a | 584 | * @arg RCC_PERIPHCLK_SAI2: SAI2 peripheral clock |
NYX | 0:85b3fd62ea1a | 585 | * @arg RCC_PERIPHCLK_I2S_APB1: I2S APB1 peripheral clock |
NYX | 0:85b3fd62ea1a | 586 | * @arg RCC_PERIPHCLK_I2S_APB2: I2S APB2 peripheral clock |
NYX | 0:85b3fd62ea1a | 587 | * @retval Frequency in KHz |
NYX | 0:85b3fd62ea1a | 588 | */ |
NYX | 0:85b3fd62ea1a | 589 | uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) |
NYX | 0:85b3fd62ea1a | 590 | { |
NYX | 0:85b3fd62ea1a | 591 | uint32_t tmpreg1 = 0U; |
NYX | 0:85b3fd62ea1a | 592 | /* This variable used to store the SAI clock frequency (value in Hz) */ |
NYX | 0:85b3fd62ea1a | 593 | uint32_t frequency = 0U; |
NYX | 0:85b3fd62ea1a | 594 | /* This variable used to store the VCO Input (value in Hz) */ |
NYX | 0:85b3fd62ea1a | 595 | uint32_t vcoinput = 0U; |
NYX | 0:85b3fd62ea1a | 596 | /* This variable used to store the SAI clock source */ |
NYX | 0:85b3fd62ea1a | 597 | uint32_t saiclocksource = 0U; |
NYX | 0:85b3fd62ea1a | 598 | uint32_t srcclk = 0U; |
NYX | 0:85b3fd62ea1a | 599 | /* This variable used to store the VCO Output (value in Hz) */ |
NYX | 0:85b3fd62ea1a | 600 | uint32_t vcooutput = 0U; |
NYX | 0:85b3fd62ea1a | 601 | switch (PeriphClk) |
NYX | 0:85b3fd62ea1a | 602 | { |
NYX | 0:85b3fd62ea1a | 603 | case RCC_PERIPHCLK_SAI1: |
NYX | 0:85b3fd62ea1a | 604 | case RCC_PERIPHCLK_SAI2: |
NYX | 0:85b3fd62ea1a | 605 | { |
NYX | 0:85b3fd62ea1a | 606 | saiclocksource = RCC->DCKCFGR; |
NYX | 0:85b3fd62ea1a | 607 | saiclocksource &= (RCC_DCKCFGR_SAI1SRC | RCC_DCKCFGR_SAI2SRC); |
NYX | 0:85b3fd62ea1a | 608 | switch (saiclocksource) |
NYX | 0:85b3fd62ea1a | 609 | { |
NYX | 0:85b3fd62ea1a | 610 | case 0U: /* PLLSAI is the clock source for SAI*/ |
NYX | 0:85b3fd62ea1a | 611 | { |
NYX | 0:85b3fd62ea1a | 612 | /* Configure the PLLSAI division factor */ |
NYX | 0:85b3fd62ea1a | 613 | /* PLLSAI_VCO Input = PLL_SOURCE/PLLSAIM */ |
NYX | 0:85b3fd62ea1a | 614 | if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) |
NYX | 0:85b3fd62ea1a | 615 | { |
NYX | 0:85b3fd62ea1a | 616 | /* In Case the PLL Source is HSI (Internal Clock) */ |
NYX | 0:85b3fd62ea1a | 617 | vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM)); |
NYX | 0:85b3fd62ea1a | 618 | } |
NYX | 0:85b3fd62ea1a | 619 | else |
NYX | 0:85b3fd62ea1a | 620 | { |
NYX | 0:85b3fd62ea1a | 621 | /* In Case the PLL Source is HSE (External Clock) */ |
NYX | 0:85b3fd62ea1a | 622 | vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM))); |
NYX | 0:85b3fd62ea1a | 623 | } |
NYX | 0:85b3fd62ea1a | 624 | /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ |
NYX | 0:85b3fd62ea1a | 625 | /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ |
NYX | 0:85b3fd62ea1a | 626 | tmpreg1 = (RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> 24U; |
NYX | 0:85b3fd62ea1a | 627 | frequency = (vcoinput * ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> 6U))/(tmpreg1); |
NYX | 0:85b3fd62ea1a | 628 | |
NYX | 0:85b3fd62ea1a | 629 | /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ |
NYX | 0:85b3fd62ea1a | 630 | tmpreg1 = (((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> 8U) + 1U); |
NYX | 0:85b3fd62ea1a | 631 | frequency = frequency/(tmpreg1); |
NYX | 0:85b3fd62ea1a | 632 | break; |
NYX | 0:85b3fd62ea1a | 633 | } |
NYX | 0:85b3fd62ea1a | 634 | case RCC_DCKCFGR_SAI1SRC_0: /* PLLI2S is the clock source for SAI*/ |
NYX | 0:85b3fd62ea1a | 635 | case RCC_DCKCFGR_SAI2SRC_0: /* PLLI2S is the clock source for SAI*/ |
NYX | 0:85b3fd62ea1a | 636 | { |
NYX | 0:85b3fd62ea1a | 637 | /* Configure the PLLI2S division factor */ |
NYX | 0:85b3fd62ea1a | 638 | /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ |
NYX | 0:85b3fd62ea1a | 639 | if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) |
NYX | 0:85b3fd62ea1a | 640 | { |
NYX | 0:85b3fd62ea1a | 641 | /* In Case the PLL Source is HSI (Internal Clock) */ |
NYX | 0:85b3fd62ea1a | 642 | vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); |
NYX | 0:85b3fd62ea1a | 643 | } |
NYX | 0:85b3fd62ea1a | 644 | else |
NYX | 0:85b3fd62ea1a | 645 | { |
NYX | 0:85b3fd62ea1a | 646 | /* In Case the PLL Source is HSE (External Clock) */ |
NYX | 0:85b3fd62ea1a | 647 | vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM))); |
NYX | 0:85b3fd62ea1a | 648 | } |
NYX | 0:85b3fd62ea1a | 649 | |
NYX | 0:85b3fd62ea1a | 650 | /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ |
NYX | 0:85b3fd62ea1a | 651 | /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ |
NYX | 0:85b3fd62ea1a | 652 | tmpreg1 = (RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> 24U; |
NYX | 0:85b3fd62ea1a | 653 | frequency = (vcoinput * ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U))/(tmpreg1); |
NYX | 0:85b3fd62ea1a | 654 | |
NYX | 0:85b3fd62ea1a | 655 | /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ |
NYX | 0:85b3fd62ea1a | 656 | tmpreg1 = ((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) + 1U); |
NYX | 0:85b3fd62ea1a | 657 | frequency = frequency/(tmpreg1); |
NYX | 0:85b3fd62ea1a | 658 | break; |
NYX | 0:85b3fd62ea1a | 659 | } |
NYX | 0:85b3fd62ea1a | 660 | case RCC_DCKCFGR_SAI1SRC_1: /* PLLR is the clock source for SAI*/ |
NYX | 0:85b3fd62ea1a | 661 | case RCC_DCKCFGR_SAI2SRC_1: /* PLLR is the clock source for SAI*/ |
NYX | 0:85b3fd62ea1a | 662 | { |
NYX | 0:85b3fd62ea1a | 663 | /* Configure the PLLI2S division factor */ |
NYX | 0:85b3fd62ea1a | 664 | /* PLL_VCO Input = PLL_SOURCE/PLLM */ |
NYX | 0:85b3fd62ea1a | 665 | if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) |
NYX | 0:85b3fd62ea1a | 666 | { |
NYX | 0:85b3fd62ea1a | 667 | /* In Case the PLL Source is HSI (Internal Clock) */ |
NYX | 0:85b3fd62ea1a | 668 | vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); |
NYX | 0:85b3fd62ea1a | 669 | } |
NYX | 0:85b3fd62ea1a | 670 | else |
NYX | 0:85b3fd62ea1a | 671 | { |
NYX | 0:85b3fd62ea1a | 672 | /* In Case the PLL Source is HSE (External Clock) */ |
NYX | 0:85b3fd62ea1a | 673 | vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM))); |
NYX | 0:85b3fd62ea1a | 674 | } |
NYX | 0:85b3fd62ea1a | 675 | |
NYX | 0:85b3fd62ea1a | 676 | /* PLL_VCO Output = PLL_VCO Input * PLLN */ |
NYX | 0:85b3fd62ea1a | 677 | /* SAI_CLK_x = PLL_VCO Output/PLLR */ |
NYX | 0:85b3fd62ea1a | 678 | tmpreg1 = (RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U; |
NYX | 0:85b3fd62ea1a | 679 | frequency = (vcoinput * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U))/(tmpreg1); |
NYX | 0:85b3fd62ea1a | 680 | break; |
NYX | 0:85b3fd62ea1a | 681 | } |
NYX | 0:85b3fd62ea1a | 682 | case RCC_DCKCFGR_SAI1SRC: /* External clock is the clock source for SAI*/ |
NYX | 0:85b3fd62ea1a | 683 | { |
NYX | 0:85b3fd62ea1a | 684 | frequency = EXTERNAL_CLOCK_VALUE; |
NYX | 0:85b3fd62ea1a | 685 | break; |
NYX | 0:85b3fd62ea1a | 686 | } |
NYX | 0:85b3fd62ea1a | 687 | case RCC_DCKCFGR_SAI2SRC: /* PLLSRC(HSE or HSI) is the clock source for SAI*/ |
NYX | 0:85b3fd62ea1a | 688 | { |
NYX | 0:85b3fd62ea1a | 689 | if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) |
NYX | 0:85b3fd62ea1a | 690 | { |
NYX | 0:85b3fd62ea1a | 691 | /* In Case the PLL Source is HSI (Internal Clock) */ |
NYX | 0:85b3fd62ea1a | 692 | frequency = (uint32_t)(HSI_VALUE); |
NYX | 0:85b3fd62ea1a | 693 | } |
NYX | 0:85b3fd62ea1a | 694 | else |
NYX | 0:85b3fd62ea1a | 695 | { |
NYX | 0:85b3fd62ea1a | 696 | /* In Case the PLL Source is HSE (External Clock) */ |
NYX | 0:85b3fd62ea1a | 697 | frequency = (uint32_t)(HSE_VALUE); |
NYX | 0:85b3fd62ea1a | 698 | } |
NYX | 0:85b3fd62ea1a | 699 | break; |
NYX | 0:85b3fd62ea1a | 700 | } |
NYX | 0:85b3fd62ea1a | 701 | default : |
NYX | 0:85b3fd62ea1a | 702 | { |
NYX | 0:85b3fd62ea1a | 703 | break; |
NYX | 0:85b3fd62ea1a | 704 | } |
NYX | 0:85b3fd62ea1a | 705 | } |
NYX | 0:85b3fd62ea1a | 706 | break; |
NYX | 0:85b3fd62ea1a | 707 | } |
NYX | 0:85b3fd62ea1a | 708 | case RCC_PERIPHCLK_I2S_APB1: |
NYX | 0:85b3fd62ea1a | 709 | { |
NYX | 0:85b3fd62ea1a | 710 | /* Get the current I2S source */ |
NYX | 0:85b3fd62ea1a | 711 | srcclk = __HAL_RCC_GET_I2S_APB1_SOURCE(); |
NYX | 0:85b3fd62ea1a | 712 | switch (srcclk) |
NYX | 0:85b3fd62ea1a | 713 | { |
NYX | 0:85b3fd62ea1a | 714 | /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ |
NYX | 0:85b3fd62ea1a | 715 | case RCC_I2SAPB1CLKSOURCE_EXT: |
NYX | 0:85b3fd62ea1a | 716 | { |
NYX | 0:85b3fd62ea1a | 717 | /* Set the I2S clock to the external clock value */ |
NYX | 0:85b3fd62ea1a | 718 | frequency = EXTERNAL_CLOCK_VALUE; |
NYX | 0:85b3fd62ea1a | 719 | break; |
NYX | 0:85b3fd62ea1a | 720 | } |
NYX | 0:85b3fd62ea1a | 721 | /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ |
NYX | 0:85b3fd62ea1a | 722 | case RCC_I2SAPB1CLKSOURCE_PLLI2S: |
NYX | 0:85b3fd62ea1a | 723 | { |
NYX | 0:85b3fd62ea1a | 724 | /* Configure the PLLI2S division factor */ |
NYX | 0:85b3fd62ea1a | 725 | /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ |
NYX | 0:85b3fd62ea1a | 726 | if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) |
NYX | 0:85b3fd62ea1a | 727 | { |
NYX | 0:85b3fd62ea1a | 728 | /* Get the I2S source clock value */ |
NYX | 0:85b3fd62ea1a | 729 | vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); |
NYX | 0:85b3fd62ea1a | 730 | } |
NYX | 0:85b3fd62ea1a | 731 | else |
NYX | 0:85b3fd62ea1a | 732 | { |
NYX | 0:85b3fd62ea1a | 733 | /* Get the I2S source clock value */ |
NYX | 0:85b3fd62ea1a | 734 | vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); |
NYX | 0:85b3fd62ea1a | 735 | } |
NYX | 0:85b3fd62ea1a | 736 | |
NYX | 0:85b3fd62ea1a | 737 | /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ |
NYX | 0:85b3fd62ea1a | 738 | vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); |
NYX | 0:85b3fd62ea1a | 739 | /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ |
NYX | 0:85b3fd62ea1a | 740 | frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); |
NYX | 0:85b3fd62ea1a | 741 | break; |
NYX | 0:85b3fd62ea1a | 742 | } |
NYX | 0:85b3fd62ea1a | 743 | /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ |
NYX | 0:85b3fd62ea1a | 744 | case RCC_I2SAPB1CLKSOURCE_PLLR: |
NYX | 0:85b3fd62ea1a | 745 | { |
NYX | 0:85b3fd62ea1a | 746 | /* Configure the PLL division factor R */ |
NYX | 0:85b3fd62ea1a | 747 | /* PLL_VCO Input = PLL_SOURCE/PLLM */ |
NYX | 0:85b3fd62ea1a | 748 | if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) |
NYX | 0:85b3fd62ea1a | 749 | { |
NYX | 0:85b3fd62ea1a | 750 | /* Get the I2S source clock value */ |
NYX | 0:85b3fd62ea1a | 751 | vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); |
NYX | 0:85b3fd62ea1a | 752 | } |
NYX | 0:85b3fd62ea1a | 753 | else |
NYX | 0:85b3fd62ea1a | 754 | { |
NYX | 0:85b3fd62ea1a | 755 | /* Get the I2S source clock value */ |
NYX | 0:85b3fd62ea1a | 756 | vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); |
NYX | 0:85b3fd62ea1a | 757 | } |
NYX | 0:85b3fd62ea1a | 758 | |
NYX | 0:85b3fd62ea1a | 759 | /* PLL_VCO Output = PLL_VCO Input * PLLN */ |
NYX | 0:85b3fd62ea1a | 760 | vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); |
NYX | 0:85b3fd62ea1a | 761 | /* I2S_CLK = PLL_VCO Output/PLLR */ |
NYX | 0:85b3fd62ea1a | 762 | frequency = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); |
NYX | 0:85b3fd62ea1a | 763 | break; |
NYX | 0:85b3fd62ea1a | 764 | } |
NYX | 0:85b3fd62ea1a | 765 | /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ |
NYX | 0:85b3fd62ea1a | 766 | case RCC_I2SAPB1CLKSOURCE_PLLSRC: |
NYX | 0:85b3fd62ea1a | 767 | { |
NYX | 0:85b3fd62ea1a | 768 | if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) |
NYX | 0:85b3fd62ea1a | 769 | { |
NYX | 0:85b3fd62ea1a | 770 | frequency = HSE_VALUE; |
NYX | 0:85b3fd62ea1a | 771 | } |
NYX | 0:85b3fd62ea1a | 772 | else |
NYX | 0:85b3fd62ea1a | 773 | { |
NYX | 0:85b3fd62ea1a | 774 | frequency = HSI_VALUE; |
NYX | 0:85b3fd62ea1a | 775 | } |
NYX | 0:85b3fd62ea1a | 776 | break; |
NYX | 0:85b3fd62ea1a | 777 | } |
NYX | 0:85b3fd62ea1a | 778 | /* Clock not enabled for I2S*/ |
NYX | 0:85b3fd62ea1a | 779 | default: |
NYX | 0:85b3fd62ea1a | 780 | { |
NYX | 0:85b3fd62ea1a | 781 | frequency = 0U; |
NYX | 0:85b3fd62ea1a | 782 | break; |
NYX | 0:85b3fd62ea1a | 783 | } |
NYX | 0:85b3fd62ea1a | 784 | } |
NYX | 0:85b3fd62ea1a | 785 | break; |
NYX | 0:85b3fd62ea1a | 786 | } |
NYX | 0:85b3fd62ea1a | 787 | case RCC_PERIPHCLK_I2S_APB2: |
NYX | 0:85b3fd62ea1a | 788 | { |
NYX | 0:85b3fd62ea1a | 789 | /* Get the current I2S source */ |
NYX | 0:85b3fd62ea1a | 790 | srcclk = __HAL_RCC_GET_I2S_APB2_SOURCE(); |
NYX | 0:85b3fd62ea1a | 791 | switch (srcclk) |
NYX | 0:85b3fd62ea1a | 792 | { |
NYX | 0:85b3fd62ea1a | 793 | /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ |
NYX | 0:85b3fd62ea1a | 794 | case RCC_I2SAPB2CLKSOURCE_EXT: |
NYX | 0:85b3fd62ea1a | 795 | { |
NYX | 0:85b3fd62ea1a | 796 | /* Set the I2S clock to the external clock value */ |
NYX | 0:85b3fd62ea1a | 797 | frequency = EXTERNAL_CLOCK_VALUE; |
NYX | 0:85b3fd62ea1a | 798 | break; |
NYX | 0:85b3fd62ea1a | 799 | } |
NYX | 0:85b3fd62ea1a | 800 | /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ |
NYX | 0:85b3fd62ea1a | 801 | case RCC_I2SAPB2CLKSOURCE_PLLI2S: |
NYX | 0:85b3fd62ea1a | 802 | { |
NYX | 0:85b3fd62ea1a | 803 | /* Configure the PLLI2S division factor */ |
NYX | 0:85b3fd62ea1a | 804 | /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ |
NYX | 0:85b3fd62ea1a | 805 | if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) |
NYX | 0:85b3fd62ea1a | 806 | { |
NYX | 0:85b3fd62ea1a | 807 | /* Get the I2S source clock value */ |
NYX | 0:85b3fd62ea1a | 808 | vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); |
NYX | 0:85b3fd62ea1a | 809 | } |
NYX | 0:85b3fd62ea1a | 810 | else |
NYX | 0:85b3fd62ea1a | 811 | { |
NYX | 0:85b3fd62ea1a | 812 | /* Get the I2S source clock value */ |
NYX | 0:85b3fd62ea1a | 813 | vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); |
NYX | 0:85b3fd62ea1a | 814 | } |
NYX | 0:85b3fd62ea1a | 815 | |
NYX | 0:85b3fd62ea1a | 816 | /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ |
NYX | 0:85b3fd62ea1a | 817 | vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); |
NYX | 0:85b3fd62ea1a | 818 | /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ |
NYX | 0:85b3fd62ea1a | 819 | frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); |
NYX | 0:85b3fd62ea1a | 820 | break; |
NYX | 0:85b3fd62ea1a | 821 | } |
NYX | 0:85b3fd62ea1a | 822 | /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ |
NYX | 0:85b3fd62ea1a | 823 | case RCC_I2SAPB2CLKSOURCE_PLLR: |
NYX | 0:85b3fd62ea1a | 824 | { |
NYX | 0:85b3fd62ea1a | 825 | /* Configure the PLL division factor R */ |
NYX | 0:85b3fd62ea1a | 826 | /* PLL_VCO Input = PLL_SOURCE/PLLM */ |
NYX | 0:85b3fd62ea1a | 827 | if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) |
NYX | 0:85b3fd62ea1a | 828 | { |
NYX | 0:85b3fd62ea1a | 829 | /* Get the I2S source clock value */ |
NYX | 0:85b3fd62ea1a | 830 | vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); |
NYX | 0:85b3fd62ea1a | 831 | } |
NYX | 0:85b3fd62ea1a | 832 | else |
NYX | 0:85b3fd62ea1a | 833 | { |
NYX | 0:85b3fd62ea1a | 834 | /* Get the I2S source clock value */ |
NYX | 0:85b3fd62ea1a | 835 | vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); |
NYX | 0:85b3fd62ea1a | 836 | } |
NYX | 0:85b3fd62ea1a | 837 | |
NYX | 0:85b3fd62ea1a | 838 | /* PLL_VCO Output = PLL_VCO Input * PLLN */ |
NYX | 0:85b3fd62ea1a | 839 | vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); |
NYX | 0:85b3fd62ea1a | 840 | /* I2S_CLK = PLL_VCO Output/PLLR */ |
NYX | 0:85b3fd62ea1a | 841 | frequency = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); |
NYX | 0:85b3fd62ea1a | 842 | break; |
NYX | 0:85b3fd62ea1a | 843 | } |
NYX | 0:85b3fd62ea1a | 844 | /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ |
NYX | 0:85b3fd62ea1a | 845 | case RCC_I2SAPB2CLKSOURCE_PLLSRC: |
NYX | 0:85b3fd62ea1a | 846 | { |
NYX | 0:85b3fd62ea1a | 847 | if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) |
NYX | 0:85b3fd62ea1a | 848 | { |
NYX | 0:85b3fd62ea1a | 849 | frequency = HSE_VALUE; |
NYX | 0:85b3fd62ea1a | 850 | } |
NYX | 0:85b3fd62ea1a | 851 | else |
NYX | 0:85b3fd62ea1a | 852 | { |
NYX | 0:85b3fd62ea1a | 853 | frequency = HSI_VALUE; |
NYX | 0:85b3fd62ea1a | 854 | } |
NYX | 0:85b3fd62ea1a | 855 | break; |
NYX | 0:85b3fd62ea1a | 856 | } |
NYX | 0:85b3fd62ea1a | 857 | /* Clock not enabled for I2S*/ |
NYX | 0:85b3fd62ea1a | 858 | default: |
NYX | 0:85b3fd62ea1a | 859 | { |
NYX | 0:85b3fd62ea1a | 860 | frequency = 0U; |
NYX | 0:85b3fd62ea1a | 861 | break; |
NYX | 0:85b3fd62ea1a | 862 | } |
NYX | 0:85b3fd62ea1a | 863 | } |
NYX | 0:85b3fd62ea1a | 864 | break; |
NYX | 0:85b3fd62ea1a | 865 | } |
NYX | 0:85b3fd62ea1a | 866 | } |
NYX | 0:85b3fd62ea1a | 867 | return frequency; |
NYX | 0:85b3fd62ea1a | 868 | } |
NYX | 0:85b3fd62ea1a | 869 | #endif /* STM32F446xx */ |
NYX | 0:85b3fd62ea1a | 870 | |
NYX | 0:85b3fd62ea1a | 871 | #if defined(STM32F469xx) || defined(STM32F479xx) |
NYX | 0:85b3fd62ea1a | 872 | /** |
NYX | 0:85b3fd62ea1a | 873 | * @brief Initializes the RCC extended peripherals clocks according to the specified |
NYX | 0:85b3fd62ea1a | 874 | * parameters in the RCC_PeriphCLKInitTypeDef. |
NYX | 0:85b3fd62ea1a | 875 | * @param PeriphClkInit: pointer to an RCC_PeriphCLKInitTypeDef structure that |
NYX | 0:85b3fd62ea1a | 876 | * contains the configuration information for the Extended Peripherals |
NYX | 0:85b3fd62ea1a | 877 | * clocks(I2S, SAI, LTDC, RTC and TIM). |
NYX | 0:85b3fd62ea1a | 878 | * |
NYX | 0:85b3fd62ea1a | 879 | * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select |
NYX | 0:85b3fd62ea1a | 880 | * the RTC clock source; in this case the Backup domain will be reset in |
NYX | 0:85b3fd62ea1a | 881 | * order to modify the RTC Clock source, as consequence RTC registers (including |
NYX | 0:85b3fd62ea1a | 882 | * the backup registers) and RCC_BDCR register are set to their reset values. |
NYX | 0:85b3fd62ea1a | 883 | * |
NYX | 0:85b3fd62ea1a | 884 | * @retval HAL status |
NYX | 0:85b3fd62ea1a | 885 | */ |
NYX | 0:85b3fd62ea1a | 886 | HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) |
NYX | 0:85b3fd62ea1a | 887 | { |
NYX | 0:85b3fd62ea1a | 888 | uint32_t tickstart = 0U; |
NYX | 0:85b3fd62ea1a | 889 | uint32_t tmpreg1 = 0U; |
NYX | 0:85b3fd62ea1a | 890 | uint32_t pllsaip = 0U; |
NYX | 0:85b3fd62ea1a | 891 | uint32_t pllsaiq = 0U; |
NYX | 0:85b3fd62ea1a | 892 | uint32_t pllsair = 0U; |
NYX | 0:85b3fd62ea1a | 893 | |
NYX | 0:85b3fd62ea1a | 894 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 895 | assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); |
NYX | 0:85b3fd62ea1a | 896 | |
NYX | 0:85b3fd62ea1a | 897 | /*--------------------------- CLK48 Configuration --------------------------*/ |
NYX | 0:85b3fd62ea1a | 898 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) |
NYX | 0:85b3fd62ea1a | 899 | { |
NYX | 0:85b3fd62ea1a | 900 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 901 | assert_param(IS_RCC_CLK48CLKSOURCE(PeriphClkInit->Clk48ClockSelection)); |
NYX | 0:85b3fd62ea1a | 902 | |
NYX | 0:85b3fd62ea1a | 903 | /* Configure the CLK48 clock source */ |
NYX | 0:85b3fd62ea1a | 904 | __HAL_RCC_CLK48_CONFIG(PeriphClkInit->Clk48ClockSelection); |
NYX | 0:85b3fd62ea1a | 905 | } |
NYX | 0:85b3fd62ea1a | 906 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 907 | |
NYX | 0:85b3fd62ea1a | 908 | /*------------------------------ SDIO Configuration ------------------------*/ |
NYX | 0:85b3fd62ea1a | 909 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) |
NYX | 0:85b3fd62ea1a | 910 | { |
NYX | 0:85b3fd62ea1a | 911 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 912 | assert_param(IS_RCC_SDIOCLKSOURCE(PeriphClkInit->SdioClockSelection)); |
NYX | 0:85b3fd62ea1a | 913 | |
NYX | 0:85b3fd62ea1a | 914 | /* Configure the SDIO clock source */ |
NYX | 0:85b3fd62ea1a | 915 | __HAL_RCC_SDIO_CONFIG(PeriphClkInit->SdioClockSelection); |
NYX | 0:85b3fd62ea1a | 916 | } |
NYX | 0:85b3fd62ea1a | 917 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 918 | |
NYX | 0:85b3fd62ea1a | 919 | /*----------------------- SAI/I2S Configuration (PLLI2S) -------------------*/ |
NYX | 0:85b3fd62ea1a | 920 | /*------------------- Common configuration SAI/I2S -------------------------*/ |
NYX | 0:85b3fd62ea1a | 921 | /* In Case of SAI or I2S Clock Configuration through PLLI2S, PLLI2SN division |
NYX | 0:85b3fd62ea1a | 922 | factor is common parameters for both peripherals */ |
NYX | 0:85b3fd62ea1a | 923 | if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) || |
NYX | 0:85b3fd62ea1a | 924 | (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == RCC_PERIPHCLK_SAI_PLLI2S) || |
NYX | 0:85b3fd62ea1a | 925 | (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S)) |
NYX | 0:85b3fd62ea1a | 926 | { |
NYX | 0:85b3fd62ea1a | 927 | /* check for Parameters */ |
NYX | 0:85b3fd62ea1a | 928 | assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); |
NYX | 0:85b3fd62ea1a | 929 | |
NYX | 0:85b3fd62ea1a | 930 | /* Disable the PLLI2S */ |
NYX | 0:85b3fd62ea1a | 931 | __HAL_RCC_PLLI2S_DISABLE(); |
NYX | 0:85b3fd62ea1a | 932 | /* Get tick */ |
NYX | 0:85b3fd62ea1a | 933 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 934 | /* Wait till PLLI2S is disabled */ |
NYX | 0:85b3fd62ea1a | 935 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) |
NYX | 0:85b3fd62ea1a | 936 | { |
NYX | 0:85b3fd62ea1a | 937 | if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 938 | { |
NYX | 0:85b3fd62ea1a | 939 | /* return in case of Timeout detected */ |
NYX | 0:85b3fd62ea1a | 940 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 941 | } |
NYX | 0:85b3fd62ea1a | 942 | } |
NYX | 0:85b3fd62ea1a | 943 | |
NYX | 0:85b3fd62ea1a | 944 | /*---------------------- I2S configuration -------------------------------*/ |
NYX | 0:85b3fd62ea1a | 945 | /* In Case of I2S Clock Configuration through PLLI2S, PLLI2SR must be added |
NYX | 0:85b3fd62ea1a | 946 | only for I2S configuration */ |
NYX | 0:85b3fd62ea1a | 947 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == (RCC_PERIPHCLK_I2S)) |
NYX | 0:85b3fd62ea1a | 948 | { |
NYX | 0:85b3fd62ea1a | 949 | /* check for Parameters */ |
NYX | 0:85b3fd62ea1a | 950 | assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); |
NYX | 0:85b3fd62ea1a | 951 | /* Configure the PLLI2S division factors */ |
NYX | 0:85b3fd62ea1a | 952 | /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) x (PLLI2SN/PLLM) */ |
NYX | 0:85b3fd62ea1a | 953 | /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ |
NYX | 0:85b3fd62ea1a | 954 | __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SR); |
NYX | 0:85b3fd62ea1a | 955 | } |
NYX | 0:85b3fd62ea1a | 956 | |
NYX | 0:85b3fd62ea1a | 957 | /*---------------------------- SAI configuration -------------------------*/ |
NYX | 0:85b3fd62ea1a | 958 | /* In Case of SAI Clock Configuration through PLLI2S, PLLI2SQ and PLLI2S_DIVQ must |
NYX | 0:85b3fd62ea1a | 959 | be added only for SAI configuration */ |
NYX | 0:85b3fd62ea1a | 960 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == (RCC_PERIPHCLK_SAI_PLLI2S)) |
NYX | 0:85b3fd62ea1a | 961 | { |
NYX | 0:85b3fd62ea1a | 962 | /* Check the PLLI2S division factors */ |
NYX | 0:85b3fd62ea1a | 963 | assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); |
NYX | 0:85b3fd62ea1a | 964 | assert_param(IS_RCC_PLLI2S_DIVQ_VALUE(PeriphClkInit->PLLI2SDivQ)); |
NYX | 0:85b3fd62ea1a | 965 | |
NYX | 0:85b3fd62ea1a | 966 | /* Read PLLI2SR value from PLLI2SCFGR register (this value is not need for SAI configuration) */ |
NYX | 0:85b3fd62ea1a | 967 | tmpreg1 = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SR)); |
NYX | 0:85b3fd62ea1a | 968 | /* Configure the PLLI2S division factors */ |
NYX | 0:85b3fd62ea1a | 969 | /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ |
NYX | 0:85b3fd62ea1a | 970 | /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ |
NYX | 0:85b3fd62ea1a | 971 | /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ |
NYX | 0:85b3fd62ea1a | 972 | __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SQ , tmpreg1); |
NYX | 0:85b3fd62ea1a | 973 | /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ |
NYX | 0:85b3fd62ea1a | 974 | __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLI2SDivQ); |
NYX | 0:85b3fd62ea1a | 975 | } |
NYX | 0:85b3fd62ea1a | 976 | |
NYX | 0:85b3fd62ea1a | 977 | /*----------------- In Case of PLLI2S is just selected -----------------*/ |
NYX | 0:85b3fd62ea1a | 978 | if((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) |
NYX | 0:85b3fd62ea1a | 979 | { |
NYX | 0:85b3fd62ea1a | 980 | /* Check for Parameters */ |
NYX | 0:85b3fd62ea1a | 981 | assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); |
NYX | 0:85b3fd62ea1a | 982 | assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); |
NYX | 0:85b3fd62ea1a | 983 | |
NYX | 0:85b3fd62ea1a | 984 | /* Configure the PLLI2S multiplication and division factors */ |
NYX | 0:85b3fd62ea1a | 985 | __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, PeriphClkInit->PLLI2S.PLLI2SR); |
NYX | 0:85b3fd62ea1a | 986 | } |
NYX | 0:85b3fd62ea1a | 987 | |
NYX | 0:85b3fd62ea1a | 988 | /* Enable the PLLI2S */ |
NYX | 0:85b3fd62ea1a | 989 | __HAL_RCC_PLLI2S_ENABLE(); |
NYX | 0:85b3fd62ea1a | 990 | /* Get tick */ |
NYX | 0:85b3fd62ea1a | 991 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 992 | /* Wait till PLLI2S is ready */ |
NYX | 0:85b3fd62ea1a | 993 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) |
NYX | 0:85b3fd62ea1a | 994 | { |
NYX | 0:85b3fd62ea1a | 995 | if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 996 | { |
NYX | 0:85b3fd62ea1a | 997 | /* return in case of Timeout detected */ |
NYX | 0:85b3fd62ea1a | 998 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 999 | } |
NYX | 0:85b3fd62ea1a | 1000 | } |
NYX | 0:85b3fd62ea1a | 1001 | } |
NYX | 0:85b3fd62ea1a | 1002 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1003 | |
NYX | 0:85b3fd62ea1a | 1004 | /*----------------------- SAI/LTDC Configuration (PLLSAI) ------------------*/ |
NYX | 0:85b3fd62ea1a | 1005 | /*----------------------- Common configuration SAI/LTDC --------------------*/ |
NYX | 0:85b3fd62ea1a | 1006 | /* In Case of SAI, LTDC or CLK48 Clock Configuration through PLLSAI, PLLSAIN division |
NYX | 0:85b3fd62ea1a | 1007 | factor is common parameters for these peripherals */ |
NYX | 0:85b3fd62ea1a | 1008 | if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == RCC_PERIPHCLK_SAI_PLLSAI) || |
NYX | 0:85b3fd62ea1a | 1009 | (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == RCC_PERIPHCLK_LTDC) || |
NYX | 0:85b3fd62ea1a | 1010 | ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) && |
NYX | 0:85b3fd62ea1a | 1011 | (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP))) |
NYX | 0:85b3fd62ea1a | 1012 | { |
NYX | 0:85b3fd62ea1a | 1013 | /* Check the PLLSAI division factors */ |
NYX | 0:85b3fd62ea1a | 1014 | assert_param(IS_RCC_PLLSAIN_VALUE(PeriphClkInit->PLLSAI.PLLSAIN)); |
NYX | 0:85b3fd62ea1a | 1015 | |
NYX | 0:85b3fd62ea1a | 1016 | /* Disable PLLSAI Clock */ |
NYX | 0:85b3fd62ea1a | 1017 | __HAL_RCC_PLLSAI_DISABLE(); |
NYX | 0:85b3fd62ea1a | 1018 | /* Get tick */ |
NYX | 0:85b3fd62ea1a | 1019 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 1020 | /* Wait till PLLSAI is disabled */ |
NYX | 0:85b3fd62ea1a | 1021 | while(__HAL_RCC_PLLSAI_GET_FLAG() != RESET) |
NYX | 0:85b3fd62ea1a | 1022 | { |
NYX | 0:85b3fd62ea1a | 1023 | if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 1024 | { |
NYX | 0:85b3fd62ea1a | 1025 | /* return in case of Timeout detected */ |
NYX | 0:85b3fd62ea1a | 1026 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 1027 | } |
NYX | 0:85b3fd62ea1a | 1028 | } |
NYX | 0:85b3fd62ea1a | 1029 | |
NYX | 0:85b3fd62ea1a | 1030 | /*---------------------------- SAI configuration -------------------------*/ |
NYX | 0:85b3fd62ea1a | 1031 | /* In Case of SAI Clock Configuration through PLLSAI, PLLSAIQ and PLLSAI_DIVQ must |
NYX | 0:85b3fd62ea1a | 1032 | be added only for SAI configuration */ |
NYX | 0:85b3fd62ea1a | 1033 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == (RCC_PERIPHCLK_SAI_PLLSAI)) |
NYX | 0:85b3fd62ea1a | 1034 | { |
NYX | 0:85b3fd62ea1a | 1035 | assert_param(IS_RCC_PLLSAIQ_VALUE(PeriphClkInit->PLLSAI.PLLSAIQ)); |
NYX | 0:85b3fd62ea1a | 1036 | assert_param(IS_RCC_PLLSAI_DIVQ_VALUE(PeriphClkInit->PLLSAIDivQ)); |
NYX | 0:85b3fd62ea1a | 1037 | |
NYX | 0:85b3fd62ea1a | 1038 | /* Read PLLSAIP value from PLLSAICFGR register (this value is not needed for SAI configuration) */ |
NYX | 0:85b3fd62ea1a | 1039 | pllsaip = ((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> POSITION_VAL(RCC_PLLSAICFGR_PLLSAIP)) + 1U) << 1U); |
NYX | 0:85b3fd62ea1a | 1040 | /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ |
NYX | 0:85b3fd62ea1a | 1041 | pllsair = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> POSITION_VAL(RCC_PLLSAICFGR_PLLSAIR)); |
NYX | 0:85b3fd62ea1a | 1042 | /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ |
NYX | 0:85b3fd62ea1a | 1043 | /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ |
NYX | 0:85b3fd62ea1a | 1044 | /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ |
NYX | 0:85b3fd62ea1a | 1045 | __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, pllsaip, PeriphClkInit->PLLSAI.PLLSAIQ, pllsair); |
NYX | 0:85b3fd62ea1a | 1046 | /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ |
NYX | 0:85b3fd62ea1a | 1047 | __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLSAIDivQ); |
NYX | 0:85b3fd62ea1a | 1048 | } |
NYX | 0:85b3fd62ea1a | 1049 | |
NYX | 0:85b3fd62ea1a | 1050 | /*---------------------------- LTDC configuration ------------------------*/ |
NYX | 0:85b3fd62ea1a | 1051 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == (RCC_PERIPHCLK_LTDC)) |
NYX | 0:85b3fd62ea1a | 1052 | { |
NYX | 0:85b3fd62ea1a | 1053 | assert_param(IS_RCC_PLLSAIR_VALUE(PeriphClkInit->PLLSAI.PLLSAIR)); |
NYX | 0:85b3fd62ea1a | 1054 | assert_param(IS_RCC_PLLSAI_DIVR_VALUE(PeriphClkInit->PLLSAIDivR)); |
NYX | 0:85b3fd62ea1a | 1055 | |
NYX | 0:85b3fd62ea1a | 1056 | /* Read PLLSAIP value from PLLSAICFGR register (this value is not needed for SAI configuration) */ |
NYX | 0:85b3fd62ea1a | 1057 | pllsaip = ((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> POSITION_VAL(RCC_PLLSAICFGR_PLLSAIP)) + 1U) << 1U); |
NYX | 0:85b3fd62ea1a | 1058 | /* Read PLLSAIQ value from PLLSAICFGR register (this value is not need for SAI configuration) */ |
NYX | 0:85b3fd62ea1a | 1059 | pllsaiq = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> POSITION_VAL(RCC_PLLSAICFGR_PLLSAIQ)); |
NYX | 0:85b3fd62ea1a | 1060 | /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ |
NYX | 0:85b3fd62ea1a | 1061 | /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ |
NYX | 0:85b3fd62ea1a | 1062 | /* LTDC_CLK(first level) = PLLSAI_VCO Output/PLLSAIR */ |
NYX | 0:85b3fd62ea1a | 1063 | __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, pllsaip, pllsaiq, PeriphClkInit->PLLSAI.PLLSAIR); |
NYX | 0:85b3fd62ea1a | 1064 | /* LTDC_CLK = LTDC_CLK(first level)/PLLSAIDIVR */ |
NYX | 0:85b3fd62ea1a | 1065 | __HAL_RCC_PLLSAI_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLSAIDivR); |
NYX | 0:85b3fd62ea1a | 1066 | } |
NYX | 0:85b3fd62ea1a | 1067 | |
NYX | 0:85b3fd62ea1a | 1068 | /*---------------------------- CLK48 configuration ------------------------*/ |
NYX | 0:85b3fd62ea1a | 1069 | /* Configure the PLLSAI when it is used as clock source for CLK48 */ |
NYX | 0:85b3fd62ea1a | 1070 | if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == (RCC_PERIPHCLK_CLK48)) && |
NYX | 0:85b3fd62ea1a | 1071 | (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP)) |
NYX | 0:85b3fd62ea1a | 1072 | { |
NYX | 0:85b3fd62ea1a | 1073 | assert_param(IS_RCC_PLLSAIP_VALUE(PeriphClkInit->PLLSAI.PLLSAIP)); |
NYX | 0:85b3fd62ea1a | 1074 | |
NYX | 0:85b3fd62ea1a | 1075 | /* Read PLLSAIQ value from PLLSAICFGR register (this value is not need for SAI configuration) */ |
NYX | 0:85b3fd62ea1a | 1076 | pllsaiq = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> POSITION_VAL(RCC_PLLSAICFGR_PLLSAIQ)); |
NYX | 0:85b3fd62ea1a | 1077 | /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ |
NYX | 0:85b3fd62ea1a | 1078 | pllsair = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> POSITION_VAL(RCC_PLLSAICFGR_PLLSAIR)); |
NYX | 0:85b3fd62ea1a | 1079 | /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ |
NYX | 0:85b3fd62ea1a | 1080 | /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ |
NYX | 0:85b3fd62ea1a | 1081 | /* CLK48_CLK(first level) = PLLSAI_VCO Output/PLLSAIP */ |
NYX | 0:85b3fd62ea1a | 1082 | __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, PeriphClkInit->PLLSAI.PLLSAIP, pllsaiq, pllsair); |
NYX | 0:85b3fd62ea1a | 1083 | } |
NYX | 0:85b3fd62ea1a | 1084 | |
NYX | 0:85b3fd62ea1a | 1085 | /* Enable PLLSAI Clock */ |
NYX | 0:85b3fd62ea1a | 1086 | __HAL_RCC_PLLSAI_ENABLE(); |
NYX | 0:85b3fd62ea1a | 1087 | /* Get tick */ |
NYX | 0:85b3fd62ea1a | 1088 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 1089 | /* Wait till PLLSAI is ready */ |
NYX | 0:85b3fd62ea1a | 1090 | while(__HAL_RCC_PLLSAI_GET_FLAG() == RESET) |
NYX | 0:85b3fd62ea1a | 1091 | { |
NYX | 0:85b3fd62ea1a | 1092 | if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 1093 | { |
NYX | 0:85b3fd62ea1a | 1094 | /* return in case of Timeout detected */ |
NYX | 0:85b3fd62ea1a | 1095 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 1096 | } |
NYX | 0:85b3fd62ea1a | 1097 | } |
NYX | 0:85b3fd62ea1a | 1098 | } |
NYX | 0:85b3fd62ea1a | 1099 | |
NYX | 0:85b3fd62ea1a | 1100 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1101 | |
NYX | 0:85b3fd62ea1a | 1102 | /*---------------------------- RTC configuration ---------------------------*/ |
NYX | 0:85b3fd62ea1a | 1103 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) |
NYX | 0:85b3fd62ea1a | 1104 | { |
NYX | 0:85b3fd62ea1a | 1105 | /* Check for RTC Parameters used to output RTCCLK */ |
NYX | 0:85b3fd62ea1a | 1106 | assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); |
NYX | 0:85b3fd62ea1a | 1107 | |
NYX | 0:85b3fd62ea1a | 1108 | /* Enable Power Clock*/ |
NYX | 0:85b3fd62ea1a | 1109 | __HAL_RCC_PWR_CLK_ENABLE(); |
NYX | 0:85b3fd62ea1a | 1110 | |
NYX | 0:85b3fd62ea1a | 1111 | /* Enable write access to Backup domain */ |
NYX | 0:85b3fd62ea1a | 1112 | PWR->CR |= PWR_CR_DBP; |
NYX | 0:85b3fd62ea1a | 1113 | |
NYX | 0:85b3fd62ea1a | 1114 | /* Get tick */ |
NYX | 0:85b3fd62ea1a | 1115 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 1116 | |
NYX | 0:85b3fd62ea1a | 1117 | while((PWR->CR & PWR_CR_DBP) == RESET) |
NYX | 0:85b3fd62ea1a | 1118 | { |
NYX | 0:85b3fd62ea1a | 1119 | if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 1120 | { |
NYX | 0:85b3fd62ea1a | 1121 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 1122 | } |
NYX | 0:85b3fd62ea1a | 1123 | } |
NYX | 0:85b3fd62ea1a | 1124 | /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ |
NYX | 0:85b3fd62ea1a | 1125 | tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); |
NYX | 0:85b3fd62ea1a | 1126 | if((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) |
NYX | 0:85b3fd62ea1a | 1127 | { |
NYX | 0:85b3fd62ea1a | 1128 | /* Store the content of BDCR register before the reset of Backup Domain */ |
NYX | 0:85b3fd62ea1a | 1129 | tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); |
NYX | 0:85b3fd62ea1a | 1130 | /* RTC Clock selection can be changed only if the Backup Domain is reset */ |
NYX | 0:85b3fd62ea1a | 1131 | __HAL_RCC_BACKUPRESET_FORCE(); |
NYX | 0:85b3fd62ea1a | 1132 | __HAL_RCC_BACKUPRESET_RELEASE(); |
NYX | 0:85b3fd62ea1a | 1133 | /* Restore the Content of BDCR register */ |
NYX | 0:85b3fd62ea1a | 1134 | RCC->BDCR = tmpreg1; |
NYX | 0:85b3fd62ea1a | 1135 | |
NYX | 0:85b3fd62ea1a | 1136 | /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ |
NYX | 0:85b3fd62ea1a | 1137 | if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) |
NYX | 0:85b3fd62ea1a | 1138 | { |
NYX | 0:85b3fd62ea1a | 1139 | /* Get tick */ |
NYX | 0:85b3fd62ea1a | 1140 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 1141 | |
NYX | 0:85b3fd62ea1a | 1142 | /* Wait till LSE is ready */ |
NYX | 0:85b3fd62ea1a | 1143 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) |
NYX | 0:85b3fd62ea1a | 1144 | { |
NYX | 0:85b3fd62ea1a | 1145 | if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 1146 | { |
NYX | 0:85b3fd62ea1a | 1147 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 1148 | } |
NYX | 0:85b3fd62ea1a | 1149 | } |
NYX | 0:85b3fd62ea1a | 1150 | } |
NYX | 0:85b3fd62ea1a | 1151 | } |
NYX | 0:85b3fd62ea1a | 1152 | __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); |
NYX | 0:85b3fd62ea1a | 1153 | } |
NYX | 0:85b3fd62ea1a | 1154 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1155 | |
NYX | 0:85b3fd62ea1a | 1156 | /*---------------------------- TIM configuration ---------------------------*/ |
NYX | 0:85b3fd62ea1a | 1157 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) |
NYX | 0:85b3fd62ea1a | 1158 | { |
NYX | 0:85b3fd62ea1a | 1159 | __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); |
NYX | 0:85b3fd62ea1a | 1160 | } |
NYX | 0:85b3fd62ea1a | 1161 | return HAL_OK; |
NYX | 0:85b3fd62ea1a | 1162 | } |
NYX | 0:85b3fd62ea1a | 1163 | |
NYX | 0:85b3fd62ea1a | 1164 | /** |
NYX | 0:85b3fd62ea1a | 1165 | * @brief Configures the RCC_PeriphCLKInitTypeDef according to the internal |
NYX | 0:85b3fd62ea1a | 1166 | * RCC configuration registers. |
NYX | 0:85b3fd62ea1a | 1167 | * @param PeriphClkInit: pointer to an RCC_PeriphCLKInitTypeDef structure that |
NYX | 0:85b3fd62ea1a | 1168 | * will be configured. |
NYX | 0:85b3fd62ea1a | 1169 | * @retval None |
NYX | 0:85b3fd62ea1a | 1170 | */ |
NYX | 0:85b3fd62ea1a | 1171 | void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) |
NYX | 0:85b3fd62ea1a | 1172 | { |
NYX | 0:85b3fd62ea1a | 1173 | uint32_t tempreg; |
NYX | 0:85b3fd62ea1a | 1174 | |
NYX | 0:85b3fd62ea1a | 1175 | /* Set all possible values for the extended clock type parameter------------*/ |
NYX | 0:85b3fd62ea1a | 1176 | PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_SAI_PLLSAI |\ |
NYX | 0:85b3fd62ea1a | 1177 | RCC_PERIPHCLK_SAI_PLLI2S | RCC_PERIPHCLK_LTDC |\ |
NYX | 0:85b3fd62ea1a | 1178 | RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC |\ |
NYX | 0:85b3fd62ea1a | 1179 | RCC_PERIPHCLK_CLK48 | RCC_PERIPHCLK_SDIO; |
NYX | 0:85b3fd62ea1a | 1180 | |
NYX | 0:85b3fd62ea1a | 1181 | /* Get the PLLI2S Clock configuration --------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1182 | PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SN)); |
NYX | 0:85b3fd62ea1a | 1183 | PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SR)); |
NYX | 0:85b3fd62ea1a | 1184 | PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SQ)); |
NYX | 0:85b3fd62ea1a | 1185 | /* Get the PLLSAI Clock configuration --------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1186 | PeriphClkInit->PLLSAI.PLLSAIN = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> POSITION_VAL(RCC_PLLSAICFGR_PLLSAIN)); |
NYX | 0:85b3fd62ea1a | 1187 | PeriphClkInit->PLLSAI.PLLSAIR = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> POSITION_VAL(RCC_PLLSAICFGR_PLLSAIR)); |
NYX | 0:85b3fd62ea1a | 1188 | PeriphClkInit->PLLSAI.PLLSAIQ = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> POSITION_VAL(RCC_PLLSAICFGR_PLLSAIQ)); |
NYX | 0:85b3fd62ea1a | 1189 | /* Get the PLLSAI/PLLI2S division factors ----------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1190 | PeriphClkInit->PLLI2SDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) >> POSITION_VAL(RCC_DCKCFGR_PLLI2SDIVQ)); |
NYX | 0:85b3fd62ea1a | 1191 | PeriphClkInit->PLLSAIDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> POSITION_VAL(RCC_DCKCFGR_PLLSAIDIVQ)); |
NYX | 0:85b3fd62ea1a | 1192 | PeriphClkInit->PLLSAIDivR = (uint32_t)(RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVR); |
NYX | 0:85b3fd62ea1a | 1193 | /* Get the RTC Clock configuration -----------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1194 | tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); |
NYX | 0:85b3fd62ea1a | 1195 | PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); |
NYX | 0:85b3fd62ea1a | 1196 | |
NYX | 0:85b3fd62ea1a | 1197 | /* Get the CLK48 clock configuration -------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1198 | PeriphClkInit->Clk48ClockSelection = __HAL_RCC_GET_CLK48_SOURCE(); |
NYX | 0:85b3fd62ea1a | 1199 | |
NYX | 0:85b3fd62ea1a | 1200 | /* Get the SDIO clock configuration ----------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1201 | PeriphClkInit->SdioClockSelection = __HAL_RCC_GET_SDIO_SOURCE(); |
NYX | 0:85b3fd62ea1a | 1202 | |
NYX | 0:85b3fd62ea1a | 1203 | if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) |
NYX | 0:85b3fd62ea1a | 1204 | { |
NYX | 0:85b3fd62ea1a | 1205 | PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; |
NYX | 0:85b3fd62ea1a | 1206 | } |
NYX | 0:85b3fd62ea1a | 1207 | else |
NYX | 0:85b3fd62ea1a | 1208 | { |
NYX | 0:85b3fd62ea1a | 1209 | PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; |
NYX | 0:85b3fd62ea1a | 1210 | } |
NYX | 0:85b3fd62ea1a | 1211 | } |
NYX | 0:85b3fd62ea1a | 1212 | |
NYX | 0:85b3fd62ea1a | 1213 | /** |
NYX | 0:85b3fd62ea1a | 1214 | * @brief Return the peripheral clock frequency for a given peripheral(SAI..) |
NYX | 0:85b3fd62ea1a | 1215 | * @note Return 0 if peripheral clock identifier not managed by this API |
NYX | 0:85b3fd62ea1a | 1216 | * @param PeriphClk: Peripheral clock identifier |
NYX | 0:85b3fd62ea1a | 1217 | * This parameter can be one of the following values: |
NYX | 0:85b3fd62ea1a | 1218 | * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock |
NYX | 0:85b3fd62ea1a | 1219 | * @retval Frequency in KHz |
NYX | 0:85b3fd62ea1a | 1220 | */ |
NYX | 0:85b3fd62ea1a | 1221 | uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) |
NYX | 0:85b3fd62ea1a | 1222 | { |
NYX | 0:85b3fd62ea1a | 1223 | /* This variable used to store the I2S clock frequency (value in Hz) */ |
NYX | 0:85b3fd62ea1a | 1224 | uint32_t frequency = 0U; |
NYX | 0:85b3fd62ea1a | 1225 | /* This variable used to store the VCO Input (value in Hz) */ |
NYX | 0:85b3fd62ea1a | 1226 | uint32_t vcoinput = 0U; |
NYX | 0:85b3fd62ea1a | 1227 | uint32_t srcclk = 0U; |
NYX | 0:85b3fd62ea1a | 1228 | /* This variable used to store the VCO Output (value in Hz) */ |
NYX | 0:85b3fd62ea1a | 1229 | uint32_t vcooutput = 0U; |
NYX | 0:85b3fd62ea1a | 1230 | switch (PeriphClk) |
NYX | 0:85b3fd62ea1a | 1231 | { |
NYX | 0:85b3fd62ea1a | 1232 | case RCC_PERIPHCLK_I2S: |
NYX | 0:85b3fd62ea1a | 1233 | { |
NYX | 0:85b3fd62ea1a | 1234 | /* Get the current I2S source */ |
NYX | 0:85b3fd62ea1a | 1235 | srcclk = __HAL_RCC_GET_I2S_SOURCE(); |
NYX | 0:85b3fd62ea1a | 1236 | switch (srcclk) |
NYX | 0:85b3fd62ea1a | 1237 | { |
NYX | 0:85b3fd62ea1a | 1238 | /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ |
NYX | 0:85b3fd62ea1a | 1239 | case RCC_I2SCLKSOURCE_EXT: |
NYX | 0:85b3fd62ea1a | 1240 | { |
NYX | 0:85b3fd62ea1a | 1241 | /* Set the I2S clock to the external clock value */ |
NYX | 0:85b3fd62ea1a | 1242 | frequency = EXTERNAL_CLOCK_VALUE; |
NYX | 0:85b3fd62ea1a | 1243 | break; |
NYX | 0:85b3fd62ea1a | 1244 | } |
NYX | 0:85b3fd62ea1a | 1245 | /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ |
NYX | 0:85b3fd62ea1a | 1246 | case RCC_I2SCLKSOURCE_PLLI2S: |
NYX | 0:85b3fd62ea1a | 1247 | { |
NYX | 0:85b3fd62ea1a | 1248 | /* Configure the PLLI2S division factor */ |
NYX | 0:85b3fd62ea1a | 1249 | /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ |
NYX | 0:85b3fd62ea1a | 1250 | if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) |
NYX | 0:85b3fd62ea1a | 1251 | { |
NYX | 0:85b3fd62ea1a | 1252 | /* Get the I2S source clock value */ |
NYX | 0:85b3fd62ea1a | 1253 | vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); |
NYX | 0:85b3fd62ea1a | 1254 | } |
NYX | 0:85b3fd62ea1a | 1255 | else |
NYX | 0:85b3fd62ea1a | 1256 | { |
NYX | 0:85b3fd62ea1a | 1257 | /* Get the I2S source clock value */ |
NYX | 0:85b3fd62ea1a | 1258 | vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); |
NYX | 0:85b3fd62ea1a | 1259 | } |
NYX | 0:85b3fd62ea1a | 1260 | |
NYX | 0:85b3fd62ea1a | 1261 | /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ |
NYX | 0:85b3fd62ea1a | 1262 | vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); |
NYX | 0:85b3fd62ea1a | 1263 | /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ |
NYX | 0:85b3fd62ea1a | 1264 | frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); |
NYX | 0:85b3fd62ea1a | 1265 | break; |
NYX | 0:85b3fd62ea1a | 1266 | } |
NYX | 0:85b3fd62ea1a | 1267 | /* Clock not enabled for I2S*/ |
NYX | 0:85b3fd62ea1a | 1268 | default: |
NYX | 0:85b3fd62ea1a | 1269 | { |
NYX | 0:85b3fd62ea1a | 1270 | frequency = 0U; |
NYX | 0:85b3fd62ea1a | 1271 | break; |
NYX | 0:85b3fd62ea1a | 1272 | } |
NYX | 0:85b3fd62ea1a | 1273 | } |
NYX | 0:85b3fd62ea1a | 1274 | break; |
NYX | 0:85b3fd62ea1a | 1275 | } |
NYX | 0:85b3fd62ea1a | 1276 | } |
NYX | 0:85b3fd62ea1a | 1277 | return frequency; |
NYX | 0:85b3fd62ea1a | 1278 | } |
NYX | 0:85b3fd62ea1a | 1279 | #endif /* STM32F469xx || STM32F479xx */ |
NYX | 0:85b3fd62ea1a | 1280 | |
NYX | 0:85b3fd62ea1a | 1281 | #if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) |
NYX | 0:85b3fd62ea1a | 1282 | /** |
NYX | 0:85b3fd62ea1a | 1283 | * @brief Initializes the RCC extended peripherals clocks according to the specified |
NYX | 0:85b3fd62ea1a | 1284 | * parameters in the RCC_PeriphCLKInitTypeDef. |
NYX | 0:85b3fd62ea1a | 1285 | * @param PeriphClkInit: pointer to an RCC_PeriphCLKInitTypeDef structure that |
NYX | 0:85b3fd62ea1a | 1286 | * contains the configuration information for the Extended Peripherals |
NYX | 0:85b3fd62ea1a | 1287 | * clocks(I2S, LTDC RTC and TIM). |
NYX | 0:85b3fd62ea1a | 1288 | * |
NYX | 0:85b3fd62ea1a | 1289 | * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select |
NYX | 0:85b3fd62ea1a | 1290 | * the RTC clock source; in this case the Backup domain will be reset in |
NYX | 0:85b3fd62ea1a | 1291 | * order to modify the RTC Clock source, as consequence RTC registers (including |
NYX | 0:85b3fd62ea1a | 1292 | * the backup registers) and RCC_BDCR register are set to their reset values. |
NYX | 0:85b3fd62ea1a | 1293 | * |
NYX | 0:85b3fd62ea1a | 1294 | * @retval HAL status |
NYX | 0:85b3fd62ea1a | 1295 | */ |
NYX | 0:85b3fd62ea1a | 1296 | HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) |
NYX | 0:85b3fd62ea1a | 1297 | { |
NYX | 0:85b3fd62ea1a | 1298 | uint32_t tickstart = 0U; |
NYX | 0:85b3fd62ea1a | 1299 | uint32_t tmpreg1 = 0U; |
NYX | 0:85b3fd62ea1a | 1300 | #if defined(STM32F413xx) || defined(STM32F423xx) |
NYX | 0:85b3fd62ea1a | 1301 | uint32_t plli2sq = 0U; |
NYX | 0:85b3fd62ea1a | 1302 | #endif /* STM32F413xx || STM32F423xx */ |
NYX | 0:85b3fd62ea1a | 1303 | uint32_t plli2sused = 0U; |
NYX | 0:85b3fd62ea1a | 1304 | |
NYX | 0:85b3fd62ea1a | 1305 | /* Check the peripheral clock selection parameters */ |
NYX | 0:85b3fd62ea1a | 1306 | assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); |
NYX | 0:85b3fd62ea1a | 1307 | |
NYX | 0:85b3fd62ea1a | 1308 | /*----------------------------------- I2S APB1 configuration ---------------*/ |
NYX | 0:85b3fd62ea1a | 1309 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == (RCC_PERIPHCLK_I2S_APB1)) |
NYX | 0:85b3fd62ea1a | 1310 | { |
NYX | 0:85b3fd62ea1a | 1311 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 1312 | assert_param(IS_RCC_I2SAPB1CLKSOURCE(PeriphClkInit->I2sApb1ClockSelection)); |
NYX | 0:85b3fd62ea1a | 1313 | |
NYX | 0:85b3fd62ea1a | 1314 | /* Configure I2S Clock source */ |
NYX | 0:85b3fd62ea1a | 1315 | __HAL_RCC_I2S_APB1_CONFIG(PeriphClkInit->I2sApb1ClockSelection); |
NYX | 0:85b3fd62ea1a | 1316 | /* Enable the PLLI2S when it's used as clock source for I2S */ |
NYX | 0:85b3fd62ea1a | 1317 | if(PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S) |
NYX | 0:85b3fd62ea1a | 1318 | { |
NYX | 0:85b3fd62ea1a | 1319 | plli2sused = 1U; |
NYX | 0:85b3fd62ea1a | 1320 | } |
NYX | 0:85b3fd62ea1a | 1321 | } |
NYX | 0:85b3fd62ea1a | 1322 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1323 | |
NYX | 0:85b3fd62ea1a | 1324 | /*----------------------------------- I2S APB2 configuration ---------------*/ |
NYX | 0:85b3fd62ea1a | 1325 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == (RCC_PERIPHCLK_I2S_APB2)) |
NYX | 0:85b3fd62ea1a | 1326 | { |
NYX | 0:85b3fd62ea1a | 1327 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 1328 | assert_param(IS_RCC_I2SAPB2CLKSOURCE(PeriphClkInit->I2sApb2ClockSelection)); |
NYX | 0:85b3fd62ea1a | 1329 | |
NYX | 0:85b3fd62ea1a | 1330 | /* Configure I2S Clock source */ |
NYX | 0:85b3fd62ea1a | 1331 | __HAL_RCC_I2S_APB2_CONFIG(PeriphClkInit->I2sApb2ClockSelection); |
NYX | 0:85b3fd62ea1a | 1332 | /* Enable the PLLI2S when it's used as clock source for I2S */ |
NYX | 0:85b3fd62ea1a | 1333 | if(PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S) |
NYX | 0:85b3fd62ea1a | 1334 | { |
NYX | 0:85b3fd62ea1a | 1335 | plli2sused = 1U; |
NYX | 0:85b3fd62ea1a | 1336 | } |
NYX | 0:85b3fd62ea1a | 1337 | } |
NYX | 0:85b3fd62ea1a | 1338 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1339 | |
NYX | 0:85b3fd62ea1a | 1340 | #if defined(STM32F413xx) || defined(STM32F423xx) |
NYX | 0:85b3fd62ea1a | 1341 | /*----------------------- SAI1 Block A configuration -----------------------*/ |
NYX | 0:85b3fd62ea1a | 1342 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIA) == (RCC_PERIPHCLK_SAIA)) |
NYX | 0:85b3fd62ea1a | 1343 | { |
NYX | 0:85b3fd62ea1a | 1344 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 1345 | assert_param(IS_RCC_SAIACLKSOURCE(PeriphClkInit->SaiAClockSelection)); |
NYX | 0:85b3fd62ea1a | 1346 | |
NYX | 0:85b3fd62ea1a | 1347 | /* Configure SAI1 Clock source */ |
NYX | 0:85b3fd62ea1a | 1348 | __HAL_RCC_SAI_BLOCKACLKSOURCE_CONFIG(PeriphClkInit->SaiAClockSelection); |
NYX | 0:85b3fd62ea1a | 1349 | /* Enable the PLLI2S when it's used as clock source for SAI */ |
NYX | 0:85b3fd62ea1a | 1350 | if(PeriphClkInit->SaiAClockSelection == RCC_SAIACLKSOURCE_PLLI2SR) |
NYX | 0:85b3fd62ea1a | 1351 | { |
NYX | 0:85b3fd62ea1a | 1352 | plli2sused = 1U; |
NYX | 0:85b3fd62ea1a | 1353 | } |
NYX | 0:85b3fd62ea1a | 1354 | /* Enable the PLLSAI when it's used as clock source for SAI */ |
NYX | 0:85b3fd62ea1a | 1355 | if(PeriphClkInit->SaiAClockSelection == RCC_SAIACLKSOURCE_PLLR) |
NYX | 0:85b3fd62ea1a | 1356 | { |
NYX | 0:85b3fd62ea1a | 1357 | /* Check for PLL/DIVR parameters */ |
NYX | 0:85b3fd62ea1a | 1358 | assert_param(IS_RCC_PLL_DIVR_VALUE(PeriphClkInit->PLLDivR)); |
NYX | 0:85b3fd62ea1a | 1359 | |
NYX | 0:85b3fd62ea1a | 1360 | /* SAI_CLK_x = SAI_CLK(first level)/PLLDIVR */ |
NYX | 0:85b3fd62ea1a | 1361 | __HAL_RCC_PLL_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLDivR); |
NYX | 0:85b3fd62ea1a | 1362 | } |
NYX | 0:85b3fd62ea1a | 1363 | } |
NYX | 0:85b3fd62ea1a | 1364 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1365 | |
NYX | 0:85b3fd62ea1a | 1366 | /*---------------------- SAI1 Block B configuration ------------------------*/ |
NYX | 0:85b3fd62ea1a | 1367 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIB) == (RCC_PERIPHCLK_SAIB)) |
NYX | 0:85b3fd62ea1a | 1368 | { |
NYX | 0:85b3fd62ea1a | 1369 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 1370 | assert_param(IS_RCC_SAIBCLKSOURCE(PeriphClkInit->SaiBClockSelection)); |
NYX | 0:85b3fd62ea1a | 1371 | |
NYX | 0:85b3fd62ea1a | 1372 | /* Configure SAI1 Clock source */ |
NYX | 0:85b3fd62ea1a | 1373 | __HAL_RCC_SAI_BLOCKBCLKSOURCE_CONFIG(PeriphClkInit->SaiBClockSelection); |
NYX | 0:85b3fd62ea1a | 1374 | /* Enable the PLLI2S when it's used as clock source for SAI */ |
NYX | 0:85b3fd62ea1a | 1375 | if(PeriphClkInit->SaiBClockSelection == RCC_SAIBCLKSOURCE_PLLI2SR) |
NYX | 0:85b3fd62ea1a | 1376 | { |
NYX | 0:85b3fd62ea1a | 1377 | plli2sused = 1U; |
NYX | 0:85b3fd62ea1a | 1378 | } |
NYX | 0:85b3fd62ea1a | 1379 | /* Enable the PLLSAI when it's used as clock source for SAI */ |
NYX | 0:85b3fd62ea1a | 1380 | if(PeriphClkInit->SaiBClockSelection == RCC_SAIBCLKSOURCE_PLLR) |
NYX | 0:85b3fd62ea1a | 1381 | { |
NYX | 0:85b3fd62ea1a | 1382 | /* Check for PLL/DIVR parameters */ |
NYX | 0:85b3fd62ea1a | 1383 | assert_param(IS_RCC_PLL_DIVR_VALUE(PeriphClkInit->PLLDivR)); |
NYX | 0:85b3fd62ea1a | 1384 | |
NYX | 0:85b3fd62ea1a | 1385 | /* SAI_CLK_x = SAI_CLK(first level)/PLLDIVR */ |
NYX | 0:85b3fd62ea1a | 1386 | __HAL_RCC_PLL_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLDivR); |
NYX | 0:85b3fd62ea1a | 1387 | } |
NYX | 0:85b3fd62ea1a | 1388 | } |
NYX | 0:85b3fd62ea1a | 1389 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1390 | #endif /* STM32F413xx || STM32F423xx */ |
NYX | 0:85b3fd62ea1a | 1391 | |
NYX | 0:85b3fd62ea1a | 1392 | /*------------------------------------ RTC configuration -------------------*/ |
NYX | 0:85b3fd62ea1a | 1393 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) |
NYX | 0:85b3fd62ea1a | 1394 | { |
NYX | 0:85b3fd62ea1a | 1395 | /* Check for RTC Parameters used to output RTCCLK */ |
NYX | 0:85b3fd62ea1a | 1396 | assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); |
NYX | 0:85b3fd62ea1a | 1397 | |
NYX | 0:85b3fd62ea1a | 1398 | /* Enable Power Clock*/ |
NYX | 0:85b3fd62ea1a | 1399 | __HAL_RCC_PWR_CLK_ENABLE(); |
NYX | 0:85b3fd62ea1a | 1400 | |
NYX | 0:85b3fd62ea1a | 1401 | /* Enable write access to Backup domain */ |
NYX | 0:85b3fd62ea1a | 1402 | PWR->CR |= PWR_CR_DBP; |
NYX | 0:85b3fd62ea1a | 1403 | |
NYX | 0:85b3fd62ea1a | 1404 | /* Get tick */ |
NYX | 0:85b3fd62ea1a | 1405 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 1406 | |
NYX | 0:85b3fd62ea1a | 1407 | while((PWR->CR & PWR_CR_DBP) == RESET) |
NYX | 0:85b3fd62ea1a | 1408 | { |
NYX | 0:85b3fd62ea1a | 1409 | if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 1410 | { |
NYX | 0:85b3fd62ea1a | 1411 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 1412 | } |
NYX | 0:85b3fd62ea1a | 1413 | } |
NYX | 0:85b3fd62ea1a | 1414 | /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ |
NYX | 0:85b3fd62ea1a | 1415 | tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); |
NYX | 0:85b3fd62ea1a | 1416 | if((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) |
NYX | 0:85b3fd62ea1a | 1417 | { |
NYX | 0:85b3fd62ea1a | 1418 | /* Store the content of BDCR register before the reset of Backup Domain */ |
NYX | 0:85b3fd62ea1a | 1419 | tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); |
NYX | 0:85b3fd62ea1a | 1420 | /* RTC Clock selection can be changed only if the Backup Domain is reset */ |
NYX | 0:85b3fd62ea1a | 1421 | __HAL_RCC_BACKUPRESET_FORCE(); |
NYX | 0:85b3fd62ea1a | 1422 | __HAL_RCC_BACKUPRESET_RELEASE(); |
NYX | 0:85b3fd62ea1a | 1423 | /* Restore the Content of BDCR register */ |
NYX | 0:85b3fd62ea1a | 1424 | RCC->BDCR = tmpreg1; |
NYX | 0:85b3fd62ea1a | 1425 | |
NYX | 0:85b3fd62ea1a | 1426 | /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ |
NYX | 0:85b3fd62ea1a | 1427 | if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) |
NYX | 0:85b3fd62ea1a | 1428 | { |
NYX | 0:85b3fd62ea1a | 1429 | /* Get tick */ |
NYX | 0:85b3fd62ea1a | 1430 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 1431 | |
NYX | 0:85b3fd62ea1a | 1432 | /* Wait till LSE is ready */ |
NYX | 0:85b3fd62ea1a | 1433 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) |
NYX | 0:85b3fd62ea1a | 1434 | { |
NYX | 0:85b3fd62ea1a | 1435 | if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 1436 | { |
NYX | 0:85b3fd62ea1a | 1437 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 1438 | } |
NYX | 0:85b3fd62ea1a | 1439 | } |
NYX | 0:85b3fd62ea1a | 1440 | } |
NYX | 0:85b3fd62ea1a | 1441 | } |
NYX | 0:85b3fd62ea1a | 1442 | __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); |
NYX | 0:85b3fd62ea1a | 1443 | } |
NYX | 0:85b3fd62ea1a | 1444 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1445 | |
NYX | 0:85b3fd62ea1a | 1446 | /*------------------------------------ TIM configuration -------------------*/ |
NYX | 0:85b3fd62ea1a | 1447 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) |
NYX | 0:85b3fd62ea1a | 1448 | { |
NYX | 0:85b3fd62ea1a | 1449 | /* Configure Timer Prescaler */ |
NYX | 0:85b3fd62ea1a | 1450 | __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); |
NYX | 0:85b3fd62ea1a | 1451 | } |
NYX | 0:85b3fd62ea1a | 1452 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1453 | |
NYX | 0:85b3fd62ea1a | 1454 | /*------------------------------------- FMPI2C1 Configuration --------------*/ |
NYX | 0:85b3fd62ea1a | 1455 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_FMPI2C1) == RCC_PERIPHCLK_FMPI2C1) |
NYX | 0:85b3fd62ea1a | 1456 | { |
NYX | 0:85b3fd62ea1a | 1457 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 1458 | assert_param(IS_RCC_FMPI2C1CLKSOURCE(PeriphClkInit->Fmpi2c1ClockSelection)); |
NYX | 0:85b3fd62ea1a | 1459 | |
NYX | 0:85b3fd62ea1a | 1460 | /* Configure the FMPI2C1 clock source */ |
NYX | 0:85b3fd62ea1a | 1461 | __HAL_RCC_FMPI2C1_CONFIG(PeriphClkInit->Fmpi2c1ClockSelection); |
NYX | 0:85b3fd62ea1a | 1462 | } |
NYX | 0:85b3fd62ea1a | 1463 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1464 | |
NYX | 0:85b3fd62ea1a | 1465 | /*------------------------------------- CLK48 Configuration ----------------*/ |
NYX | 0:85b3fd62ea1a | 1466 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) |
NYX | 0:85b3fd62ea1a | 1467 | { |
NYX | 0:85b3fd62ea1a | 1468 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 1469 | assert_param(IS_RCC_CLK48CLKSOURCE(PeriphClkInit->Clk48ClockSelection)); |
NYX | 0:85b3fd62ea1a | 1470 | |
NYX | 0:85b3fd62ea1a | 1471 | /* Configure the SDIO clock source */ |
NYX | 0:85b3fd62ea1a | 1472 | __HAL_RCC_CLK48_CONFIG(PeriphClkInit->Clk48ClockSelection); |
NYX | 0:85b3fd62ea1a | 1473 | |
NYX | 0:85b3fd62ea1a | 1474 | /* Enable the PLLI2S when it's used as clock source for CLK48 */ |
NYX | 0:85b3fd62ea1a | 1475 | if(PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLI2SQ) |
NYX | 0:85b3fd62ea1a | 1476 | { |
NYX | 0:85b3fd62ea1a | 1477 | plli2sused = 1U; |
NYX | 0:85b3fd62ea1a | 1478 | } |
NYX | 0:85b3fd62ea1a | 1479 | } |
NYX | 0:85b3fd62ea1a | 1480 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1481 | |
NYX | 0:85b3fd62ea1a | 1482 | /*------------------------------------- SDIO Configuration -----------------*/ |
NYX | 0:85b3fd62ea1a | 1483 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) |
NYX | 0:85b3fd62ea1a | 1484 | { |
NYX | 0:85b3fd62ea1a | 1485 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 1486 | assert_param(IS_RCC_SDIOCLKSOURCE(PeriphClkInit->SdioClockSelection)); |
NYX | 0:85b3fd62ea1a | 1487 | |
NYX | 0:85b3fd62ea1a | 1488 | /* Configure the SDIO clock source */ |
NYX | 0:85b3fd62ea1a | 1489 | __HAL_RCC_SDIO_CONFIG(PeriphClkInit->SdioClockSelection); |
NYX | 0:85b3fd62ea1a | 1490 | } |
NYX | 0:85b3fd62ea1a | 1491 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1492 | |
NYX | 0:85b3fd62ea1a | 1493 | /*-------------------------------------- PLLI2S Configuration --------------*/ |
NYX | 0:85b3fd62ea1a | 1494 | /* PLLI2S is configured when a peripheral will use it as source clock : I2S on APB1 or |
NYX | 0:85b3fd62ea1a | 1495 | I2S on APB2*/ |
NYX | 0:85b3fd62ea1a | 1496 | if((plli2sused == 1U) || (PeriphClkInit->PeriphClockSelection == RCC_PERIPHCLK_PLLI2S)) |
NYX | 0:85b3fd62ea1a | 1497 | { |
NYX | 0:85b3fd62ea1a | 1498 | /* Disable the PLLI2S */ |
NYX | 0:85b3fd62ea1a | 1499 | __HAL_RCC_PLLI2S_DISABLE(); |
NYX | 0:85b3fd62ea1a | 1500 | /* Get tick */ |
NYX | 0:85b3fd62ea1a | 1501 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 1502 | /* Wait till PLLI2S is disabled */ |
NYX | 0:85b3fd62ea1a | 1503 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) |
NYX | 0:85b3fd62ea1a | 1504 | { |
NYX | 0:85b3fd62ea1a | 1505 | if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 1506 | { |
NYX | 0:85b3fd62ea1a | 1507 | /* return in case of Timeout detected */ |
NYX | 0:85b3fd62ea1a | 1508 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 1509 | } |
NYX | 0:85b3fd62ea1a | 1510 | } |
NYX | 0:85b3fd62ea1a | 1511 | |
NYX | 0:85b3fd62ea1a | 1512 | /* check for common PLLI2S Parameters */ |
NYX | 0:85b3fd62ea1a | 1513 | assert_param(IS_RCC_PLLI2SCLKSOURCE(PeriphClkInit->PLLI2SSelection)); |
NYX | 0:85b3fd62ea1a | 1514 | assert_param(IS_RCC_PLLI2SM_VALUE(PeriphClkInit->PLLI2S.PLLI2SM)); |
NYX | 0:85b3fd62ea1a | 1515 | assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); |
NYX | 0:85b3fd62ea1a | 1516 | /*-------------------- Set the PLL I2S clock -----------------------------*/ |
NYX | 0:85b3fd62ea1a | 1517 | __HAL_RCC_PLL_I2S_CONFIG(PeriphClkInit->PLLI2SSelection); |
NYX | 0:85b3fd62ea1a | 1518 | |
NYX | 0:85b3fd62ea1a | 1519 | /*------- In Case of PLLI2S is selected as source clock for I2S ----------*/ |
NYX | 0:85b3fd62ea1a | 1520 | if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == RCC_PERIPHCLK_I2S_APB1) && (PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S)) || |
NYX | 0:85b3fd62ea1a | 1521 | ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == RCC_PERIPHCLK_I2S_APB2) && (PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S)) || |
NYX | 0:85b3fd62ea1a | 1522 | ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) && (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLI2SQ)) || |
NYX | 0:85b3fd62ea1a | 1523 | ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) && (PeriphClkInit->SdioClockSelection == RCC_SDIOCLKSOURCE_CLK48) && (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLI2SQ))) |
NYX | 0:85b3fd62ea1a | 1524 | { |
NYX | 0:85b3fd62ea1a | 1525 | /* check for Parameters */ |
NYX | 0:85b3fd62ea1a | 1526 | assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); |
NYX | 0:85b3fd62ea1a | 1527 | assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); |
NYX | 0:85b3fd62ea1a | 1528 | |
NYX | 0:85b3fd62ea1a | 1529 | /* Configure the PLLI2S division factors */ |
NYX | 0:85b3fd62ea1a | 1530 | /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM)*/ |
NYX | 0:85b3fd62ea1a | 1531 | /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ |
NYX | 0:85b3fd62ea1a | 1532 | __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SQ, PeriphClkInit->PLLI2S.PLLI2SR); |
NYX | 0:85b3fd62ea1a | 1533 | } |
NYX | 0:85b3fd62ea1a | 1534 | |
NYX | 0:85b3fd62ea1a | 1535 | #if defined(STM32F413xx) || defined(STM32F423xx) |
NYX | 0:85b3fd62ea1a | 1536 | /*------- In Case of PLLI2S is selected as source clock for SAI ----------*/ |
NYX | 0:85b3fd62ea1a | 1537 | if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIA) == RCC_PERIPHCLK_SAIA) && (PeriphClkInit->SaiAClockSelection == RCC_SAIACLKSOURCE_PLLI2SR)) || |
NYX | 0:85b3fd62ea1a | 1538 | ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIB) == RCC_PERIPHCLK_SAIB) && (PeriphClkInit->SaiBClockSelection == RCC_SAIBCLKSOURCE_PLLI2SR))) |
NYX | 0:85b3fd62ea1a | 1539 | { |
NYX | 0:85b3fd62ea1a | 1540 | /* Check for PLLI2S Parameters */ |
NYX | 0:85b3fd62ea1a | 1541 | assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); |
NYX | 0:85b3fd62ea1a | 1542 | /* Check for PLLI2S/DIVR parameters */ |
NYX | 0:85b3fd62ea1a | 1543 | assert_param(IS_RCC_PLLI2S_DIVR_VALUE(PeriphClkInit->PLLI2SDivR)); |
NYX | 0:85b3fd62ea1a | 1544 | |
NYX | 0:85b3fd62ea1a | 1545 | /* Read PLLI2SQ value from PLLI2SCFGR register (this value is not needed for SAI configuration) */ |
NYX | 0:85b3fd62ea1a | 1546 | plli2sq = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SQ)); |
NYX | 0:85b3fd62ea1a | 1547 | /* Configure the PLLI2S division factors */ |
NYX | 0:85b3fd62ea1a | 1548 | /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ |
NYX | 0:85b3fd62ea1a | 1549 | /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ |
NYX | 0:85b3fd62ea1a | 1550 | /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ |
NYX | 0:85b3fd62ea1a | 1551 | __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, plli2sq, PeriphClkInit->PLLI2S.PLLI2SR); |
NYX | 0:85b3fd62ea1a | 1552 | |
NYX | 0:85b3fd62ea1a | 1553 | /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVR */ |
NYX | 0:85b3fd62ea1a | 1554 | __HAL_RCC_PLLI2S_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLI2SDivR); |
NYX | 0:85b3fd62ea1a | 1555 | } |
NYX | 0:85b3fd62ea1a | 1556 | #endif /* STM32F413xx || STM32F423xx */ |
NYX | 0:85b3fd62ea1a | 1557 | |
NYX | 0:85b3fd62ea1a | 1558 | /*----------------- In Case of PLLI2S is just selected ------------------*/ |
NYX | 0:85b3fd62ea1a | 1559 | if((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) |
NYX | 0:85b3fd62ea1a | 1560 | { |
NYX | 0:85b3fd62ea1a | 1561 | /* Check for Parameters */ |
NYX | 0:85b3fd62ea1a | 1562 | assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); |
NYX | 0:85b3fd62ea1a | 1563 | assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); |
NYX | 0:85b3fd62ea1a | 1564 | |
NYX | 0:85b3fd62ea1a | 1565 | /* Configure the PLLI2S division factors */ |
NYX | 0:85b3fd62ea1a | 1566 | /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM)*/ |
NYX | 0:85b3fd62ea1a | 1567 | /* SPDIFRXCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SP */ |
NYX | 0:85b3fd62ea1a | 1568 | __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SQ, PeriphClkInit->PLLI2S.PLLI2SR); |
NYX | 0:85b3fd62ea1a | 1569 | } |
NYX | 0:85b3fd62ea1a | 1570 | |
NYX | 0:85b3fd62ea1a | 1571 | /* Enable the PLLI2S */ |
NYX | 0:85b3fd62ea1a | 1572 | __HAL_RCC_PLLI2S_ENABLE(); |
NYX | 0:85b3fd62ea1a | 1573 | /* Get tick */ |
NYX | 0:85b3fd62ea1a | 1574 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 1575 | /* Wait till PLLI2S is ready */ |
NYX | 0:85b3fd62ea1a | 1576 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) |
NYX | 0:85b3fd62ea1a | 1577 | { |
NYX | 0:85b3fd62ea1a | 1578 | if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 1579 | { |
NYX | 0:85b3fd62ea1a | 1580 | /* return in case of Timeout detected */ |
NYX | 0:85b3fd62ea1a | 1581 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 1582 | } |
NYX | 0:85b3fd62ea1a | 1583 | } |
NYX | 0:85b3fd62ea1a | 1584 | } |
NYX | 0:85b3fd62ea1a | 1585 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1586 | |
NYX | 0:85b3fd62ea1a | 1587 | /*-------------------- DFSDM1 clock source configuration -------------------*/ |
NYX | 0:85b3fd62ea1a | 1588 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM1) == RCC_PERIPHCLK_DFSDM1) |
NYX | 0:85b3fd62ea1a | 1589 | { |
NYX | 0:85b3fd62ea1a | 1590 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 1591 | assert_param(IS_RCC_DFSDM1CLKSOURCE(PeriphClkInit->Dfsdm1ClockSelection)); |
NYX | 0:85b3fd62ea1a | 1592 | |
NYX | 0:85b3fd62ea1a | 1593 | /* Configure the DFSDM1 interface clock source */ |
NYX | 0:85b3fd62ea1a | 1594 | __HAL_RCC_DFSDM1_CONFIG(PeriphClkInit->Dfsdm1ClockSelection); |
NYX | 0:85b3fd62ea1a | 1595 | } |
NYX | 0:85b3fd62ea1a | 1596 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1597 | |
NYX | 0:85b3fd62ea1a | 1598 | /*-------------------- DFSDM1 Audio clock source configuration -------------*/ |
NYX | 0:85b3fd62ea1a | 1599 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM1_AUDIO) == RCC_PERIPHCLK_DFSDM1_AUDIO) |
NYX | 0:85b3fd62ea1a | 1600 | { |
NYX | 0:85b3fd62ea1a | 1601 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 1602 | assert_param(IS_RCC_DFSDM1AUDIOCLKSOURCE(PeriphClkInit->Dfsdm1AudioClockSelection)); |
NYX | 0:85b3fd62ea1a | 1603 | |
NYX | 0:85b3fd62ea1a | 1604 | /* Configure the DFSDM1 Audio interface clock source */ |
NYX | 0:85b3fd62ea1a | 1605 | __HAL_RCC_DFSDM1AUDIO_CONFIG(PeriphClkInit->Dfsdm1AudioClockSelection); |
NYX | 0:85b3fd62ea1a | 1606 | } |
NYX | 0:85b3fd62ea1a | 1607 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1608 | |
NYX | 0:85b3fd62ea1a | 1609 | #if defined(STM32F413xx) || defined(STM32F423xx) |
NYX | 0:85b3fd62ea1a | 1610 | /*-------------------- DFSDM2 clock source configuration -------------------*/ |
NYX | 0:85b3fd62ea1a | 1611 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM2) == RCC_PERIPHCLK_DFSDM2) |
NYX | 0:85b3fd62ea1a | 1612 | { |
NYX | 0:85b3fd62ea1a | 1613 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 1614 | assert_param(IS_RCC_DFSDM2CLKSOURCE(PeriphClkInit->Dfsdm2ClockSelection)); |
NYX | 0:85b3fd62ea1a | 1615 | |
NYX | 0:85b3fd62ea1a | 1616 | /* Configure the DFSDM1 interface clock source */ |
NYX | 0:85b3fd62ea1a | 1617 | __HAL_RCC_DFSDM2_CONFIG(PeriphClkInit->Dfsdm2ClockSelection); |
NYX | 0:85b3fd62ea1a | 1618 | } |
NYX | 0:85b3fd62ea1a | 1619 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1620 | |
NYX | 0:85b3fd62ea1a | 1621 | /*-------------------- DFSDM2 Audio clock source configuration -------------*/ |
NYX | 0:85b3fd62ea1a | 1622 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM2_AUDIO) == RCC_PERIPHCLK_DFSDM2_AUDIO) |
NYX | 0:85b3fd62ea1a | 1623 | { |
NYX | 0:85b3fd62ea1a | 1624 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 1625 | assert_param(IS_RCC_DFSDM2AUDIOCLKSOURCE(PeriphClkInit->Dfsdm2AudioClockSelection)); |
NYX | 0:85b3fd62ea1a | 1626 | |
NYX | 0:85b3fd62ea1a | 1627 | /* Configure the DFSDM1 Audio interface clock source */ |
NYX | 0:85b3fd62ea1a | 1628 | __HAL_RCC_DFSDM2AUDIO_CONFIG(PeriphClkInit->Dfsdm2AudioClockSelection); |
NYX | 0:85b3fd62ea1a | 1629 | } |
NYX | 0:85b3fd62ea1a | 1630 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1631 | |
NYX | 0:85b3fd62ea1a | 1632 | /*---------------------------- LPTIM1 Configuration ------------------------*/ |
NYX | 0:85b3fd62ea1a | 1633 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPTIM1) == RCC_PERIPHCLK_LPTIM1) |
NYX | 0:85b3fd62ea1a | 1634 | { |
NYX | 0:85b3fd62ea1a | 1635 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 1636 | assert_param(IS_RCC_LPTIM1CLKSOURCE(PeriphClkInit->Lptim1ClockSelection)); |
NYX | 0:85b3fd62ea1a | 1637 | |
NYX | 0:85b3fd62ea1a | 1638 | /* Configure the LPTIM1 clock source */ |
NYX | 0:85b3fd62ea1a | 1639 | __HAL_RCC_LPTIM1_CONFIG(PeriphClkInit->Lptim1ClockSelection); |
NYX | 0:85b3fd62ea1a | 1640 | } |
NYX | 0:85b3fd62ea1a | 1641 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1642 | #endif /* STM32F413xx || STM32F423xx */ |
NYX | 0:85b3fd62ea1a | 1643 | |
NYX | 0:85b3fd62ea1a | 1644 | return HAL_OK; |
NYX | 0:85b3fd62ea1a | 1645 | } |
NYX | 0:85b3fd62ea1a | 1646 | |
NYX | 0:85b3fd62ea1a | 1647 | /** |
NYX | 0:85b3fd62ea1a | 1648 | * @brief Get the RCC_PeriphCLKInitTypeDef according to the internal |
NYX | 0:85b3fd62ea1a | 1649 | * RCC configuration registers. |
NYX | 0:85b3fd62ea1a | 1650 | * @param PeriphClkInit: pointer to an RCC_PeriphCLKInitTypeDef structure that |
NYX | 0:85b3fd62ea1a | 1651 | * will be configured. |
NYX | 0:85b3fd62ea1a | 1652 | * @retval None |
NYX | 0:85b3fd62ea1a | 1653 | */ |
NYX | 0:85b3fd62ea1a | 1654 | void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) |
NYX | 0:85b3fd62ea1a | 1655 | { |
NYX | 0:85b3fd62ea1a | 1656 | uint32_t tempreg; |
NYX | 0:85b3fd62ea1a | 1657 | |
NYX | 0:85b3fd62ea1a | 1658 | /* Set all possible values for the extended clock type parameter------------*/ |
NYX | 0:85b3fd62ea1a | 1659 | #if defined(STM32F413xx) || defined(STM32F423xx) |
NYX | 0:85b3fd62ea1a | 1660 | PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_I2S_APB2 |\ |
NYX | 0:85b3fd62ea1a | 1661 | RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC |\ |
NYX | 0:85b3fd62ea1a | 1662 | RCC_PERIPHCLK_FMPI2C1 | RCC_PERIPHCLK_CLK48 |\ |
NYX | 0:85b3fd62ea1a | 1663 | RCC_PERIPHCLK_SDIO | RCC_PERIPHCLK_DFSDM1 |\ |
NYX | 0:85b3fd62ea1a | 1664 | RCC_PERIPHCLK_DFSDM1_AUDIO | RCC_PERIPHCLK_DFSDM2 |\ |
NYX | 0:85b3fd62ea1a | 1665 | RCC_PERIPHCLK_DFSDM2_AUDIO | RCC_PERIPHCLK_LPTIM1 |\ |
NYX | 0:85b3fd62ea1a | 1666 | RCC_PERIPHCLK_SAIA | RCC_PERIPHCLK_SAIB; |
NYX | 0:85b3fd62ea1a | 1667 | #else /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ |
NYX | 0:85b3fd62ea1a | 1668 | PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_I2S_APB2 |\ |
NYX | 0:85b3fd62ea1a | 1669 | RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC |\ |
NYX | 0:85b3fd62ea1a | 1670 | RCC_PERIPHCLK_FMPI2C1 | RCC_PERIPHCLK_CLK48 |\ |
NYX | 0:85b3fd62ea1a | 1671 | RCC_PERIPHCLK_SDIO | RCC_PERIPHCLK_DFSDM1 |\ |
NYX | 0:85b3fd62ea1a | 1672 | RCC_PERIPHCLK_DFSDM1_AUDIO; |
NYX | 0:85b3fd62ea1a | 1673 | #endif /* STM32F413xx || STM32F423xx */ |
NYX | 0:85b3fd62ea1a | 1674 | |
NYX | 0:85b3fd62ea1a | 1675 | |
NYX | 0:85b3fd62ea1a | 1676 | |
NYX | 0:85b3fd62ea1a | 1677 | /* Get the PLLI2S Clock configuration --------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1678 | PeriphClkInit->PLLI2S.PLLI2SM = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SM)); |
NYX | 0:85b3fd62ea1a | 1679 | PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SN)); |
NYX | 0:85b3fd62ea1a | 1680 | PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SQ)); |
NYX | 0:85b3fd62ea1a | 1681 | PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SR)); |
NYX | 0:85b3fd62ea1a | 1682 | #if defined(STM32F413xx) || defined(STM32F423xx) |
NYX | 0:85b3fd62ea1a | 1683 | /* Get the PLL/PLLI2S division factors -------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1684 | PeriphClkInit->PLLI2SDivR = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVR) >> POSITION_VAL(RCC_DCKCFGR_PLLI2SDIVR)); |
NYX | 0:85b3fd62ea1a | 1685 | PeriphClkInit->PLLDivR = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLDIVR) >> POSITION_VAL(RCC_DCKCFGR_PLLDIVR)); |
NYX | 0:85b3fd62ea1a | 1686 | #endif /* STM32F413xx || STM32F423xx */ |
NYX | 0:85b3fd62ea1a | 1687 | |
NYX | 0:85b3fd62ea1a | 1688 | /* Get the I2S APB1 clock configuration ------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1689 | PeriphClkInit->I2sApb1ClockSelection = __HAL_RCC_GET_I2S_APB1_SOURCE(); |
NYX | 0:85b3fd62ea1a | 1690 | |
NYX | 0:85b3fd62ea1a | 1691 | /* Get the I2S APB2 clock configuration ------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1692 | PeriphClkInit->I2sApb2ClockSelection = __HAL_RCC_GET_I2S_APB2_SOURCE(); |
NYX | 0:85b3fd62ea1a | 1693 | |
NYX | 0:85b3fd62ea1a | 1694 | /* Get the RTC Clock configuration -----------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1695 | tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); |
NYX | 0:85b3fd62ea1a | 1696 | PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); |
NYX | 0:85b3fd62ea1a | 1697 | |
NYX | 0:85b3fd62ea1a | 1698 | /* Get the FMPI2C1 clock configuration -------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1699 | PeriphClkInit->Fmpi2c1ClockSelection = __HAL_RCC_GET_FMPI2C1_SOURCE(); |
NYX | 0:85b3fd62ea1a | 1700 | |
NYX | 0:85b3fd62ea1a | 1701 | /* Get the CLK48 clock configuration ---------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1702 | PeriphClkInit->Clk48ClockSelection = __HAL_RCC_GET_CLK48_SOURCE(); |
NYX | 0:85b3fd62ea1a | 1703 | |
NYX | 0:85b3fd62ea1a | 1704 | /* Get the SDIO clock configuration ----------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1705 | PeriphClkInit->SdioClockSelection = __HAL_RCC_GET_SDIO_SOURCE(); |
NYX | 0:85b3fd62ea1a | 1706 | |
NYX | 0:85b3fd62ea1a | 1707 | /* Get the DFSDM1 clock configuration --------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1708 | PeriphClkInit->Dfsdm1ClockSelection = __HAL_RCC_GET_DFSDM1_SOURCE(); |
NYX | 0:85b3fd62ea1a | 1709 | |
NYX | 0:85b3fd62ea1a | 1710 | /* Get the DFSDM1 Audio clock configuration --------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1711 | PeriphClkInit->Dfsdm1AudioClockSelection = __HAL_RCC_GET_DFSDM1AUDIO_SOURCE(); |
NYX | 0:85b3fd62ea1a | 1712 | |
NYX | 0:85b3fd62ea1a | 1713 | #if defined(STM32F413xx) || defined(STM32F423xx) |
NYX | 0:85b3fd62ea1a | 1714 | /* Get the DFSDM2 clock configuration --------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1715 | PeriphClkInit->Dfsdm2ClockSelection = __HAL_RCC_GET_DFSDM2_SOURCE(); |
NYX | 0:85b3fd62ea1a | 1716 | |
NYX | 0:85b3fd62ea1a | 1717 | /* Get the DFSDM2 Audio clock configuration --------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1718 | PeriphClkInit->Dfsdm2AudioClockSelection = __HAL_RCC_GET_DFSDM2AUDIO_SOURCE(); |
NYX | 0:85b3fd62ea1a | 1719 | |
NYX | 0:85b3fd62ea1a | 1720 | /* Get the LPTIM1 clock configuration --------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1721 | PeriphClkInit->Lptim1ClockSelection = __HAL_RCC_GET_LPTIM1_SOURCE(); |
NYX | 0:85b3fd62ea1a | 1722 | |
NYX | 0:85b3fd62ea1a | 1723 | /* Get the SAI1 Block Aclock configuration ---------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1724 | PeriphClkInit->SaiAClockSelection = __HAL_RCC_GET_SAI_BLOCKA_SOURCE(); |
NYX | 0:85b3fd62ea1a | 1725 | |
NYX | 0:85b3fd62ea1a | 1726 | /* Get the SAI1 Block B clock configuration --------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1727 | PeriphClkInit->SaiBClockSelection = __HAL_RCC_GET_SAI_BLOCKB_SOURCE(); |
NYX | 0:85b3fd62ea1a | 1728 | #endif /* STM32F413xx || STM32F423xx */ |
NYX | 0:85b3fd62ea1a | 1729 | |
NYX | 0:85b3fd62ea1a | 1730 | /* Get the TIM Prescaler configuration -------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 1731 | if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) |
NYX | 0:85b3fd62ea1a | 1732 | { |
NYX | 0:85b3fd62ea1a | 1733 | PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; |
NYX | 0:85b3fd62ea1a | 1734 | } |
NYX | 0:85b3fd62ea1a | 1735 | else |
NYX | 0:85b3fd62ea1a | 1736 | { |
NYX | 0:85b3fd62ea1a | 1737 | PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; |
NYX | 0:85b3fd62ea1a | 1738 | } |
NYX | 0:85b3fd62ea1a | 1739 | } |
NYX | 0:85b3fd62ea1a | 1740 | |
NYX | 0:85b3fd62ea1a | 1741 | /** |
NYX | 0:85b3fd62ea1a | 1742 | * @brief Return the peripheral clock frequency for a given peripheral(I2S..) |
NYX | 0:85b3fd62ea1a | 1743 | * @note Return 0 if peripheral clock identifier not managed by this API |
NYX | 0:85b3fd62ea1a | 1744 | * @param PeriphClk: Peripheral clock identifier |
NYX | 0:85b3fd62ea1a | 1745 | * This parameter can be one of the following values: |
NYX | 0:85b3fd62ea1a | 1746 | * @arg RCC_PERIPHCLK_I2S_APB1: I2S APB1 peripheral clock |
NYX | 0:85b3fd62ea1a | 1747 | * @arg RCC_PERIPHCLK_I2S_APB2: I2S APB2 peripheral clock |
NYX | 0:85b3fd62ea1a | 1748 | * @retval Frequency in KHz |
NYX | 0:85b3fd62ea1a | 1749 | */ |
NYX | 0:85b3fd62ea1a | 1750 | uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) |
NYX | 0:85b3fd62ea1a | 1751 | { |
NYX | 0:85b3fd62ea1a | 1752 | /* This variable used to store the I2S clock frequency (value in Hz) */ |
NYX | 0:85b3fd62ea1a | 1753 | uint32_t frequency = 0U; |
NYX | 0:85b3fd62ea1a | 1754 | /* This variable used to store the VCO Input (value in Hz) */ |
NYX | 0:85b3fd62ea1a | 1755 | uint32_t vcoinput = 0U; |
NYX | 0:85b3fd62ea1a | 1756 | uint32_t srcclk = 0U; |
NYX | 0:85b3fd62ea1a | 1757 | /* This variable used to store the VCO Output (value in Hz) */ |
NYX | 0:85b3fd62ea1a | 1758 | uint32_t vcooutput = 0U; |
NYX | 0:85b3fd62ea1a | 1759 | switch (PeriphClk) |
NYX | 0:85b3fd62ea1a | 1760 | { |
NYX | 0:85b3fd62ea1a | 1761 | case RCC_PERIPHCLK_I2S_APB1: |
NYX | 0:85b3fd62ea1a | 1762 | { |
NYX | 0:85b3fd62ea1a | 1763 | /* Get the current I2S source */ |
NYX | 0:85b3fd62ea1a | 1764 | srcclk = __HAL_RCC_GET_I2S_APB1_SOURCE(); |
NYX | 0:85b3fd62ea1a | 1765 | switch (srcclk) |
NYX | 0:85b3fd62ea1a | 1766 | { |
NYX | 0:85b3fd62ea1a | 1767 | /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ |
NYX | 0:85b3fd62ea1a | 1768 | case RCC_I2SAPB1CLKSOURCE_EXT: |
NYX | 0:85b3fd62ea1a | 1769 | { |
NYX | 0:85b3fd62ea1a | 1770 | /* Set the I2S clock to the external clock value */ |
NYX | 0:85b3fd62ea1a | 1771 | frequency = EXTERNAL_CLOCK_VALUE; |
NYX | 0:85b3fd62ea1a | 1772 | break; |
NYX | 0:85b3fd62ea1a | 1773 | } |
NYX | 0:85b3fd62ea1a | 1774 | /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ |
NYX | 0:85b3fd62ea1a | 1775 | case RCC_I2SAPB1CLKSOURCE_PLLI2S: |
NYX | 0:85b3fd62ea1a | 1776 | { |
NYX | 0:85b3fd62ea1a | 1777 | if((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SSRC) == RCC_PLLI2SCFGR_PLLI2SSRC) |
NYX | 0:85b3fd62ea1a | 1778 | { |
NYX | 0:85b3fd62ea1a | 1779 | /* Get the I2S source clock value */ |
NYX | 0:85b3fd62ea1a | 1780 | vcoinput = (uint32_t)(EXTERNAL_CLOCK_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); |
NYX | 0:85b3fd62ea1a | 1781 | } |
NYX | 0:85b3fd62ea1a | 1782 | else |
NYX | 0:85b3fd62ea1a | 1783 | { |
NYX | 0:85b3fd62ea1a | 1784 | /* Configure the PLLI2S division factor */ |
NYX | 0:85b3fd62ea1a | 1785 | /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ |
NYX | 0:85b3fd62ea1a | 1786 | if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) |
NYX | 0:85b3fd62ea1a | 1787 | { |
NYX | 0:85b3fd62ea1a | 1788 | /* Get the I2S source clock value */ |
NYX | 0:85b3fd62ea1a | 1789 | vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); |
NYX | 0:85b3fd62ea1a | 1790 | } |
NYX | 0:85b3fd62ea1a | 1791 | else |
NYX | 0:85b3fd62ea1a | 1792 | { |
NYX | 0:85b3fd62ea1a | 1793 | /* Get the I2S source clock value */ |
NYX | 0:85b3fd62ea1a | 1794 | vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); |
NYX | 0:85b3fd62ea1a | 1795 | } |
NYX | 0:85b3fd62ea1a | 1796 | } |
NYX | 0:85b3fd62ea1a | 1797 | /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ |
NYX | 0:85b3fd62ea1a | 1798 | vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); |
NYX | 0:85b3fd62ea1a | 1799 | /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ |
NYX | 0:85b3fd62ea1a | 1800 | frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); |
NYX | 0:85b3fd62ea1a | 1801 | break; |
NYX | 0:85b3fd62ea1a | 1802 | } |
NYX | 0:85b3fd62ea1a | 1803 | /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ |
NYX | 0:85b3fd62ea1a | 1804 | case RCC_I2SAPB1CLKSOURCE_PLLR: |
NYX | 0:85b3fd62ea1a | 1805 | { |
NYX | 0:85b3fd62ea1a | 1806 | /* Configure the PLL division factor R */ |
NYX | 0:85b3fd62ea1a | 1807 | /* PLL_VCO Input = PLL_SOURCE/PLLM */ |
NYX | 0:85b3fd62ea1a | 1808 | if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) |
NYX | 0:85b3fd62ea1a | 1809 | { |
NYX | 0:85b3fd62ea1a | 1810 | /* Get the I2S source clock value */ |
NYX | 0:85b3fd62ea1a | 1811 | vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); |
NYX | 0:85b3fd62ea1a | 1812 | } |
NYX | 0:85b3fd62ea1a | 1813 | else |
NYX | 0:85b3fd62ea1a | 1814 | { |
NYX | 0:85b3fd62ea1a | 1815 | /* Get the I2S source clock value */ |
NYX | 0:85b3fd62ea1a | 1816 | vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); |
NYX | 0:85b3fd62ea1a | 1817 | } |
NYX | 0:85b3fd62ea1a | 1818 | |
NYX | 0:85b3fd62ea1a | 1819 | /* PLL_VCO Output = PLL_VCO Input * PLLN */ |
NYX | 0:85b3fd62ea1a | 1820 | vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); |
NYX | 0:85b3fd62ea1a | 1821 | /* I2S_CLK = PLL_VCO Output/PLLR */ |
NYX | 0:85b3fd62ea1a | 1822 | frequency = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); |
NYX | 0:85b3fd62ea1a | 1823 | break; |
NYX | 0:85b3fd62ea1a | 1824 | } |
NYX | 0:85b3fd62ea1a | 1825 | /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ |
NYX | 0:85b3fd62ea1a | 1826 | case RCC_I2SAPB1CLKSOURCE_PLLSRC: |
NYX | 0:85b3fd62ea1a | 1827 | { |
NYX | 0:85b3fd62ea1a | 1828 | if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) |
NYX | 0:85b3fd62ea1a | 1829 | { |
NYX | 0:85b3fd62ea1a | 1830 | frequency = HSE_VALUE; |
NYX | 0:85b3fd62ea1a | 1831 | } |
NYX | 0:85b3fd62ea1a | 1832 | else |
NYX | 0:85b3fd62ea1a | 1833 | { |
NYX | 0:85b3fd62ea1a | 1834 | frequency = HSI_VALUE; |
NYX | 0:85b3fd62ea1a | 1835 | } |
NYX | 0:85b3fd62ea1a | 1836 | break; |
NYX | 0:85b3fd62ea1a | 1837 | } |
NYX | 0:85b3fd62ea1a | 1838 | /* Clock not enabled for I2S*/ |
NYX | 0:85b3fd62ea1a | 1839 | default: |
NYX | 0:85b3fd62ea1a | 1840 | { |
NYX | 0:85b3fd62ea1a | 1841 | frequency = 0U; |
NYX | 0:85b3fd62ea1a | 1842 | break; |
NYX | 0:85b3fd62ea1a | 1843 | } |
NYX | 0:85b3fd62ea1a | 1844 | } |
NYX | 0:85b3fd62ea1a | 1845 | break; |
NYX | 0:85b3fd62ea1a | 1846 | } |
NYX | 0:85b3fd62ea1a | 1847 | case RCC_PERIPHCLK_I2S_APB2: |
NYX | 0:85b3fd62ea1a | 1848 | { |
NYX | 0:85b3fd62ea1a | 1849 | /* Get the current I2S source */ |
NYX | 0:85b3fd62ea1a | 1850 | srcclk = __HAL_RCC_GET_I2S_APB2_SOURCE(); |
NYX | 0:85b3fd62ea1a | 1851 | switch (srcclk) |
NYX | 0:85b3fd62ea1a | 1852 | { |
NYX | 0:85b3fd62ea1a | 1853 | /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ |
NYX | 0:85b3fd62ea1a | 1854 | case RCC_I2SAPB2CLKSOURCE_EXT: |
NYX | 0:85b3fd62ea1a | 1855 | { |
NYX | 0:85b3fd62ea1a | 1856 | /* Set the I2S clock to the external clock value */ |
NYX | 0:85b3fd62ea1a | 1857 | frequency = EXTERNAL_CLOCK_VALUE; |
NYX | 0:85b3fd62ea1a | 1858 | break; |
NYX | 0:85b3fd62ea1a | 1859 | } |
NYX | 0:85b3fd62ea1a | 1860 | /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ |
NYX | 0:85b3fd62ea1a | 1861 | case RCC_I2SAPB2CLKSOURCE_PLLI2S: |
NYX | 0:85b3fd62ea1a | 1862 | { |
NYX | 0:85b3fd62ea1a | 1863 | if((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SSRC) == RCC_PLLI2SCFGR_PLLI2SSRC) |
NYX | 0:85b3fd62ea1a | 1864 | { |
NYX | 0:85b3fd62ea1a | 1865 | /* Get the I2S source clock value */ |
NYX | 0:85b3fd62ea1a | 1866 | vcoinput = (uint32_t)(EXTERNAL_CLOCK_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); |
NYX | 0:85b3fd62ea1a | 1867 | } |
NYX | 0:85b3fd62ea1a | 1868 | else |
NYX | 0:85b3fd62ea1a | 1869 | { |
NYX | 0:85b3fd62ea1a | 1870 | /* Configure the PLLI2S division factor */ |
NYX | 0:85b3fd62ea1a | 1871 | /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ |
NYX | 0:85b3fd62ea1a | 1872 | if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) |
NYX | 0:85b3fd62ea1a | 1873 | { |
NYX | 0:85b3fd62ea1a | 1874 | /* Get the I2S source clock value */ |
NYX | 0:85b3fd62ea1a | 1875 | vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); |
NYX | 0:85b3fd62ea1a | 1876 | } |
NYX | 0:85b3fd62ea1a | 1877 | else |
NYX | 0:85b3fd62ea1a | 1878 | { |
NYX | 0:85b3fd62ea1a | 1879 | /* Get the I2S source clock value */ |
NYX | 0:85b3fd62ea1a | 1880 | vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); |
NYX | 0:85b3fd62ea1a | 1881 | } |
NYX | 0:85b3fd62ea1a | 1882 | } |
NYX | 0:85b3fd62ea1a | 1883 | /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ |
NYX | 0:85b3fd62ea1a | 1884 | vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); |
NYX | 0:85b3fd62ea1a | 1885 | /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ |
NYX | 0:85b3fd62ea1a | 1886 | frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); |
NYX | 0:85b3fd62ea1a | 1887 | break; |
NYX | 0:85b3fd62ea1a | 1888 | } |
NYX | 0:85b3fd62ea1a | 1889 | /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ |
NYX | 0:85b3fd62ea1a | 1890 | case RCC_I2SAPB2CLKSOURCE_PLLR: |
NYX | 0:85b3fd62ea1a | 1891 | { |
NYX | 0:85b3fd62ea1a | 1892 | /* Configure the PLL division factor R */ |
NYX | 0:85b3fd62ea1a | 1893 | /* PLL_VCO Input = PLL_SOURCE/PLLM */ |
NYX | 0:85b3fd62ea1a | 1894 | if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) |
NYX | 0:85b3fd62ea1a | 1895 | { |
NYX | 0:85b3fd62ea1a | 1896 | /* Get the I2S source clock value */ |
NYX | 0:85b3fd62ea1a | 1897 | vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); |
NYX | 0:85b3fd62ea1a | 1898 | } |
NYX | 0:85b3fd62ea1a | 1899 | else |
NYX | 0:85b3fd62ea1a | 1900 | { |
NYX | 0:85b3fd62ea1a | 1901 | /* Get the I2S source clock value */ |
NYX | 0:85b3fd62ea1a | 1902 | vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); |
NYX | 0:85b3fd62ea1a | 1903 | } |
NYX | 0:85b3fd62ea1a | 1904 | |
NYX | 0:85b3fd62ea1a | 1905 | /* PLL_VCO Output = PLL_VCO Input * PLLN */ |
NYX | 0:85b3fd62ea1a | 1906 | vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); |
NYX | 0:85b3fd62ea1a | 1907 | /* I2S_CLK = PLL_VCO Output/PLLR */ |
NYX | 0:85b3fd62ea1a | 1908 | frequency = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); |
NYX | 0:85b3fd62ea1a | 1909 | break; |
NYX | 0:85b3fd62ea1a | 1910 | } |
NYX | 0:85b3fd62ea1a | 1911 | /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ |
NYX | 0:85b3fd62ea1a | 1912 | case RCC_I2SAPB2CLKSOURCE_PLLSRC: |
NYX | 0:85b3fd62ea1a | 1913 | { |
NYX | 0:85b3fd62ea1a | 1914 | if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) |
NYX | 0:85b3fd62ea1a | 1915 | { |
NYX | 0:85b3fd62ea1a | 1916 | frequency = HSE_VALUE; |
NYX | 0:85b3fd62ea1a | 1917 | } |
NYX | 0:85b3fd62ea1a | 1918 | else |
NYX | 0:85b3fd62ea1a | 1919 | { |
NYX | 0:85b3fd62ea1a | 1920 | frequency = HSI_VALUE; |
NYX | 0:85b3fd62ea1a | 1921 | } |
NYX | 0:85b3fd62ea1a | 1922 | break; |
NYX | 0:85b3fd62ea1a | 1923 | } |
NYX | 0:85b3fd62ea1a | 1924 | /* Clock not enabled for I2S*/ |
NYX | 0:85b3fd62ea1a | 1925 | default: |
NYX | 0:85b3fd62ea1a | 1926 | { |
NYX | 0:85b3fd62ea1a | 1927 | frequency = 0U; |
NYX | 0:85b3fd62ea1a | 1928 | break; |
NYX | 0:85b3fd62ea1a | 1929 | } |
NYX | 0:85b3fd62ea1a | 1930 | } |
NYX | 0:85b3fd62ea1a | 1931 | break; |
NYX | 0:85b3fd62ea1a | 1932 | } |
NYX | 0:85b3fd62ea1a | 1933 | } |
NYX | 0:85b3fd62ea1a | 1934 | return frequency; |
NYX | 0:85b3fd62ea1a | 1935 | } |
NYX | 0:85b3fd62ea1a | 1936 | #endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ |
NYX | 0:85b3fd62ea1a | 1937 | |
NYX | 0:85b3fd62ea1a | 1938 | #if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) |
NYX | 0:85b3fd62ea1a | 1939 | /** |
NYX | 0:85b3fd62ea1a | 1940 | * @brief Initializes the RCC extended peripherals clocks according to the specified parameters in the |
NYX | 0:85b3fd62ea1a | 1941 | * RCC_PeriphCLKInitTypeDef. |
NYX | 0:85b3fd62ea1a | 1942 | * @param PeriphClkInit: pointer to an RCC_PeriphCLKInitTypeDef structure that |
NYX | 0:85b3fd62ea1a | 1943 | * contains the configuration information for the Extended Peripherals clocks(I2S and RTC clocks). |
NYX | 0:85b3fd62ea1a | 1944 | * |
NYX | 0:85b3fd62ea1a | 1945 | * @note A caution to be taken when HAL_RCCEx_PeriphCLKConfig() is used to select RTC clock selection, in this case |
NYX | 0:85b3fd62ea1a | 1946 | * the Reset of Backup domain will be applied in order to modify the RTC Clock source as consequence all backup |
NYX | 0:85b3fd62ea1a | 1947 | * domain (RTC and RCC_BDCR register expect BKPSRAM) will be reset |
NYX | 0:85b3fd62ea1a | 1948 | * |
NYX | 0:85b3fd62ea1a | 1949 | * @retval HAL status |
NYX | 0:85b3fd62ea1a | 1950 | */ |
NYX | 0:85b3fd62ea1a | 1951 | HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) |
NYX | 0:85b3fd62ea1a | 1952 | { |
NYX | 0:85b3fd62ea1a | 1953 | uint32_t tickstart = 0U; |
NYX | 0:85b3fd62ea1a | 1954 | uint32_t tmpreg1 = 0U; |
NYX | 0:85b3fd62ea1a | 1955 | |
NYX | 0:85b3fd62ea1a | 1956 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 1957 | assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); |
NYX | 0:85b3fd62ea1a | 1958 | |
NYX | 0:85b3fd62ea1a | 1959 | /*---------------------------- RTC configuration ---------------------------*/ |
NYX | 0:85b3fd62ea1a | 1960 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) |
NYX | 0:85b3fd62ea1a | 1961 | { |
NYX | 0:85b3fd62ea1a | 1962 | /* Check for RTC Parameters used to output RTCCLK */ |
NYX | 0:85b3fd62ea1a | 1963 | assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); |
NYX | 0:85b3fd62ea1a | 1964 | |
NYX | 0:85b3fd62ea1a | 1965 | /* Enable Power Clock*/ |
NYX | 0:85b3fd62ea1a | 1966 | __HAL_RCC_PWR_CLK_ENABLE(); |
NYX | 0:85b3fd62ea1a | 1967 | |
NYX | 0:85b3fd62ea1a | 1968 | /* Enable write access to Backup domain */ |
NYX | 0:85b3fd62ea1a | 1969 | PWR->CR |= PWR_CR_DBP; |
NYX | 0:85b3fd62ea1a | 1970 | |
NYX | 0:85b3fd62ea1a | 1971 | /* Get tick */ |
NYX | 0:85b3fd62ea1a | 1972 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 1973 | |
NYX | 0:85b3fd62ea1a | 1974 | while((PWR->CR & PWR_CR_DBP) == RESET) |
NYX | 0:85b3fd62ea1a | 1975 | { |
NYX | 0:85b3fd62ea1a | 1976 | if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 1977 | { |
NYX | 0:85b3fd62ea1a | 1978 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 1979 | } |
NYX | 0:85b3fd62ea1a | 1980 | } |
NYX | 0:85b3fd62ea1a | 1981 | /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ |
NYX | 0:85b3fd62ea1a | 1982 | tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); |
NYX | 0:85b3fd62ea1a | 1983 | if((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) |
NYX | 0:85b3fd62ea1a | 1984 | { |
NYX | 0:85b3fd62ea1a | 1985 | /* Store the content of BDCR register before the reset of Backup Domain */ |
NYX | 0:85b3fd62ea1a | 1986 | tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); |
NYX | 0:85b3fd62ea1a | 1987 | /* RTC Clock selection can be changed only if the Backup Domain is reset */ |
NYX | 0:85b3fd62ea1a | 1988 | __HAL_RCC_BACKUPRESET_FORCE(); |
NYX | 0:85b3fd62ea1a | 1989 | __HAL_RCC_BACKUPRESET_RELEASE(); |
NYX | 0:85b3fd62ea1a | 1990 | /* Restore the Content of BDCR register */ |
NYX | 0:85b3fd62ea1a | 1991 | RCC->BDCR = tmpreg1; |
NYX | 0:85b3fd62ea1a | 1992 | |
NYX | 0:85b3fd62ea1a | 1993 | /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ |
NYX | 0:85b3fd62ea1a | 1994 | if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) |
NYX | 0:85b3fd62ea1a | 1995 | { |
NYX | 0:85b3fd62ea1a | 1996 | /* Get tick */ |
NYX | 0:85b3fd62ea1a | 1997 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 1998 | |
NYX | 0:85b3fd62ea1a | 1999 | /* Wait till LSE is ready */ |
NYX | 0:85b3fd62ea1a | 2000 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) |
NYX | 0:85b3fd62ea1a | 2001 | { |
NYX | 0:85b3fd62ea1a | 2002 | if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 2003 | { |
NYX | 0:85b3fd62ea1a | 2004 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 2005 | } |
NYX | 0:85b3fd62ea1a | 2006 | } |
NYX | 0:85b3fd62ea1a | 2007 | } |
NYX | 0:85b3fd62ea1a | 2008 | } |
NYX | 0:85b3fd62ea1a | 2009 | __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); |
NYX | 0:85b3fd62ea1a | 2010 | } |
NYX | 0:85b3fd62ea1a | 2011 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 2012 | |
NYX | 0:85b3fd62ea1a | 2013 | /*---------------------------- TIM configuration ---------------------------*/ |
NYX | 0:85b3fd62ea1a | 2014 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) |
NYX | 0:85b3fd62ea1a | 2015 | { |
NYX | 0:85b3fd62ea1a | 2016 | __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); |
NYX | 0:85b3fd62ea1a | 2017 | } |
NYX | 0:85b3fd62ea1a | 2018 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 2019 | |
NYX | 0:85b3fd62ea1a | 2020 | /*---------------------------- FMPI2C1 Configuration -----------------------*/ |
NYX | 0:85b3fd62ea1a | 2021 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_FMPI2C1) == RCC_PERIPHCLK_FMPI2C1) |
NYX | 0:85b3fd62ea1a | 2022 | { |
NYX | 0:85b3fd62ea1a | 2023 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 2024 | assert_param(IS_RCC_FMPI2C1CLKSOURCE(PeriphClkInit->Fmpi2c1ClockSelection)); |
NYX | 0:85b3fd62ea1a | 2025 | |
NYX | 0:85b3fd62ea1a | 2026 | /* Configure the FMPI2C1 clock source */ |
NYX | 0:85b3fd62ea1a | 2027 | __HAL_RCC_FMPI2C1_CONFIG(PeriphClkInit->Fmpi2c1ClockSelection); |
NYX | 0:85b3fd62ea1a | 2028 | } |
NYX | 0:85b3fd62ea1a | 2029 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 2030 | |
NYX | 0:85b3fd62ea1a | 2031 | /*---------------------------- LPTIM1 Configuration ------------------------*/ |
NYX | 0:85b3fd62ea1a | 2032 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPTIM1) == RCC_PERIPHCLK_LPTIM1) |
NYX | 0:85b3fd62ea1a | 2033 | { |
NYX | 0:85b3fd62ea1a | 2034 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 2035 | assert_param(IS_RCC_LPTIM1CLKSOURCE(PeriphClkInit->Lptim1ClockSelection)); |
NYX | 0:85b3fd62ea1a | 2036 | |
NYX | 0:85b3fd62ea1a | 2037 | /* Configure the LPTIM1 clock source */ |
NYX | 0:85b3fd62ea1a | 2038 | __HAL_RCC_LPTIM1_CONFIG(PeriphClkInit->Lptim1ClockSelection); |
NYX | 0:85b3fd62ea1a | 2039 | } |
NYX | 0:85b3fd62ea1a | 2040 | |
NYX | 0:85b3fd62ea1a | 2041 | /*---------------------------- I2S Configuration ---------------------------*/ |
NYX | 0:85b3fd62ea1a | 2042 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) |
NYX | 0:85b3fd62ea1a | 2043 | { |
NYX | 0:85b3fd62ea1a | 2044 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 2045 | assert_param(IS_RCC_I2SAPBCLKSOURCE(PeriphClkInit->I2SClockSelection)); |
NYX | 0:85b3fd62ea1a | 2046 | |
NYX | 0:85b3fd62ea1a | 2047 | /* Configure the I2S clock source */ |
NYX | 0:85b3fd62ea1a | 2048 | __HAL_RCC_I2S_CONFIG(PeriphClkInit->I2SClockSelection); |
NYX | 0:85b3fd62ea1a | 2049 | } |
NYX | 0:85b3fd62ea1a | 2050 | |
NYX | 0:85b3fd62ea1a | 2051 | return HAL_OK; |
NYX | 0:85b3fd62ea1a | 2052 | } |
NYX | 0:85b3fd62ea1a | 2053 | |
NYX | 0:85b3fd62ea1a | 2054 | /** |
NYX | 0:85b3fd62ea1a | 2055 | * @brief Configures the RCC_OscInitStruct according to the internal |
NYX | 0:85b3fd62ea1a | 2056 | * RCC configuration registers. |
NYX | 0:85b3fd62ea1a | 2057 | * @param PeriphClkInit: pointer to an RCC_PeriphCLKInitTypeDef structure that |
NYX | 0:85b3fd62ea1a | 2058 | * will be configured. |
NYX | 0:85b3fd62ea1a | 2059 | * @retval None |
NYX | 0:85b3fd62ea1a | 2060 | */ |
NYX | 0:85b3fd62ea1a | 2061 | void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) |
NYX | 0:85b3fd62ea1a | 2062 | { |
NYX | 0:85b3fd62ea1a | 2063 | uint32_t tempreg; |
NYX | 0:85b3fd62ea1a | 2064 | |
NYX | 0:85b3fd62ea1a | 2065 | /* Set all possible values for the extended clock type parameter------------*/ |
NYX | 0:85b3fd62ea1a | 2066 | PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_FMPI2C1 | RCC_PERIPHCLK_LPTIM1 | RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC; |
NYX | 0:85b3fd62ea1a | 2067 | |
NYX | 0:85b3fd62ea1a | 2068 | tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); |
NYX | 0:85b3fd62ea1a | 2069 | PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); |
NYX | 0:85b3fd62ea1a | 2070 | |
NYX | 0:85b3fd62ea1a | 2071 | if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) |
NYX | 0:85b3fd62ea1a | 2072 | { |
NYX | 0:85b3fd62ea1a | 2073 | PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; |
NYX | 0:85b3fd62ea1a | 2074 | } |
NYX | 0:85b3fd62ea1a | 2075 | else |
NYX | 0:85b3fd62ea1a | 2076 | { |
NYX | 0:85b3fd62ea1a | 2077 | PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; |
NYX | 0:85b3fd62ea1a | 2078 | } |
NYX | 0:85b3fd62ea1a | 2079 | /* Get the FMPI2C1 clock configuration -------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 2080 | PeriphClkInit->Fmpi2c1ClockSelection = __HAL_RCC_GET_FMPI2C1_SOURCE(); |
NYX | 0:85b3fd62ea1a | 2081 | |
NYX | 0:85b3fd62ea1a | 2082 | /* Get the I2S clock configuration -----------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 2083 | PeriphClkInit->I2SClockSelection = __HAL_RCC_GET_I2S_SOURCE(); |
NYX | 0:85b3fd62ea1a | 2084 | |
NYX | 0:85b3fd62ea1a | 2085 | |
NYX | 0:85b3fd62ea1a | 2086 | } |
NYX | 0:85b3fd62ea1a | 2087 | /** |
NYX | 0:85b3fd62ea1a | 2088 | * @brief Return the peripheral clock frequency for a given peripheral(SAI..) |
NYX | 0:85b3fd62ea1a | 2089 | * @note Return 0 if peripheral clock identifier not managed by this API |
NYX | 0:85b3fd62ea1a | 2090 | * @param PeriphClk: Peripheral clock identifier |
NYX | 0:85b3fd62ea1a | 2091 | * This parameter can be one of the following values: |
NYX | 0:85b3fd62ea1a | 2092 | * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock |
NYX | 0:85b3fd62ea1a | 2093 | * @retval Frequency in KHz |
NYX | 0:85b3fd62ea1a | 2094 | */ |
NYX | 0:85b3fd62ea1a | 2095 | uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) |
NYX | 0:85b3fd62ea1a | 2096 | { |
NYX | 0:85b3fd62ea1a | 2097 | /* This variable used to store the I2S clock frequency (value in Hz) */ |
NYX | 0:85b3fd62ea1a | 2098 | uint32_t frequency = 0U; |
NYX | 0:85b3fd62ea1a | 2099 | /* This variable used to store the VCO Input (value in Hz) */ |
NYX | 0:85b3fd62ea1a | 2100 | uint32_t vcoinput = 0U; |
NYX | 0:85b3fd62ea1a | 2101 | uint32_t srcclk = 0U; |
NYX | 0:85b3fd62ea1a | 2102 | /* This variable used to store the VCO Output (value in Hz) */ |
NYX | 0:85b3fd62ea1a | 2103 | uint32_t vcooutput = 0U; |
NYX | 0:85b3fd62ea1a | 2104 | switch (PeriphClk) |
NYX | 0:85b3fd62ea1a | 2105 | { |
NYX | 0:85b3fd62ea1a | 2106 | case RCC_PERIPHCLK_I2S: |
NYX | 0:85b3fd62ea1a | 2107 | { |
NYX | 0:85b3fd62ea1a | 2108 | /* Get the current I2S source */ |
NYX | 0:85b3fd62ea1a | 2109 | srcclk = __HAL_RCC_GET_I2S_SOURCE(); |
NYX | 0:85b3fd62ea1a | 2110 | switch (srcclk) |
NYX | 0:85b3fd62ea1a | 2111 | { |
NYX | 0:85b3fd62ea1a | 2112 | /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ |
NYX | 0:85b3fd62ea1a | 2113 | case RCC_I2SAPBCLKSOURCE_EXT: |
NYX | 0:85b3fd62ea1a | 2114 | { |
NYX | 0:85b3fd62ea1a | 2115 | /* Set the I2S clock to the external clock value */ |
NYX | 0:85b3fd62ea1a | 2116 | frequency = EXTERNAL_CLOCK_VALUE; |
NYX | 0:85b3fd62ea1a | 2117 | break; |
NYX | 0:85b3fd62ea1a | 2118 | } |
NYX | 0:85b3fd62ea1a | 2119 | /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ |
NYX | 0:85b3fd62ea1a | 2120 | case RCC_I2SAPBCLKSOURCE_PLLR: |
NYX | 0:85b3fd62ea1a | 2121 | { |
NYX | 0:85b3fd62ea1a | 2122 | /* Configure the PLL division factor R */ |
NYX | 0:85b3fd62ea1a | 2123 | /* PLL_VCO Input = PLL_SOURCE/PLLM */ |
NYX | 0:85b3fd62ea1a | 2124 | if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) |
NYX | 0:85b3fd62ea1a | 2125 | { |
NYX | 0:85b3fd62ea1a | 2126 | /* Get the I2S source clock value */ |
NYX | 0:85b3fd62ea1a | 2127 | vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); |
NYX | 0:85b3fd62ea1a | 2128 | } |
NYX | 0:85b3fd62ea1a | 2129 | else |
NYX | 0:85b3fd62ea1a | 2130 | { |
NYX | 0:85b3fd62ea1a | 2131 | /* Get the I2S source clock value */ |
NYX | 0:85b3fd62ea1a | 2132 | vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); |
NYX | 0:85b3fd62ea1a | 2133 | } |
NYX | 0:85b3fd62ea1a | 2134 | |
NYX | 0:85b3fd62ea1a | 2135 | /* PLL_VCO Output = PLL_VCO Input * PLLN */ |
NYX | 0:85b3fd62ea1a | 2136 | vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); |
NYX | 0:85b3fd62ea1a | 2137 | /* I2S_CLK = PLL_VCO Output/PLLR */ |
NYX | 0:85b3fd62ea1a | 2138 | frequency = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); |
NYX | 0:85b3fd62ea1a | 2139 | break; |
NYX | 0:85b3fd62ea1a | 2140 | } |
NYX | 0:85b3fd62ea1a | 2141 | /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ |
NYX | 0:85b3fd62ea1a | 2142 | case RCC_I2SAPBCLKSOURCE_PLLSRC: |
NYX | 0:85b3fd62ea1a | 2143 | { |
NYX | 0:85b3fd62ea1a | 2144 | if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) |
NYX | 0:85b3fd62ea1a | 2145 | { |
NYX | 0:85b3fd62ea1a | 2146 | frequency = HSE_VALUE; |
NYX | 0:85b3fd62ea1a | 2147 | } |
NYX | 0:85b3fd62ea1a | 2148 | else |
NYX | 0:85b3fd62ea1a | 2149 | { |
NYX | 0:85b3fd62ea1a | 2150 | frequency = HSI_VALUE; |
NYX | 0:85b3fd62ea1a | 2151 | } |
NYX | 0:85b3fd62ea1a | 2152 | break; |
NYX | 0:85b3fd62ea1a | 2153 | } |
NYX | 0:85b3fd62ea1a | 2154 | /* Clock not enabled for I2S*/ |
NYX | 0:85b3fd62ea1a | 2155 | default: |
NYX | 0:85b3fd62ea1a | 2156 | { |
NYX | 0:85b3fd62ea1a | 2157 | frequency = 0U; |
NYX | 0:85b3fd62ea1a | 2158 | break; |
NYX | 0:85b3fd62ea1a | 2159 | } |
NYX | 0:85b3fd62ea1a | 2160 | } |
NYX | 0:85b3fd62ea1a | 2161 | break; |
NYX | 0:85b3fd62ea1a | 2162 | } |
NYX | 0:85b3fd62ea1a | 2163 | } |
NYX | 0:85b3fd62ea1a | 2164 | return frequency; |
NYX | 0:85b3fd62ea1a | 2165 | } |
NYX | 0:85b3fd62ea1a | 2166 | #endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ |
NYX | 0:85b3fd62ea1a | 2167 | |
NYX | 0:85b3fd62ea1a | 2168 | #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) |
NYX | 0:85b3fd62ea1a | 2169 | /** |
NYX | 0:85b3fd62ea1a | 2170 | * @brief Initializes the RCC extended peripherals clocks according to the specified |
NYX | 0:85b3fd62ea1a | 2171 | * parameters in the RCC_PeriphCLKInitTypeDef. |
NYX | 0:85b3fd62ea1a | 2172 | * @param PeriphClkInit: pointer to an RCC_PeriphCLKInitTypeDef structure that |
NYX | 0:85b3fd62ea1a | 2173 | * contains the configuration information for the Extended Peripherals |
NYX | 0:85b3fd62ea1a | 2174 | * clocks(I2S, SAI, LTDC RTC and TIM). |
NYX | 0:85b3fd62ea1a | 2175 | * |
NYX | 0:85b3fd62ea1a | 2176 | * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select |
NYX | 0:85b3fd62ea1a | 2177 | * the RTC clock source; in this case the Backup domain will be reset in |
NYX | 0:85b3fd62ea1a | 2178 | * order to modify the RTC Clock source, as consequence RTC registers (including |
NYX | 0:85b3fd62ea1a | 2179 | * the backup registers) and RCC_BDCR register are set to their reset values. |
NYX | 0:85b3fd62ea1a | 2180 | * |
NYX | 0:85b3fd62ea1a | 2181 | * @retval HAL status |
NYX | 0:85b3fd62ea1a | 2182 | */ |
NYX | 0:85b3fd62ea1a | 2183 | HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) |
NYX | 0:85b3fd62ea1a | 2184 | { |
NYX | 0:85b3fd62ea1a | 2185 | uint32_t tickstart = 0U; |
NYX | 0:85b3fd62ea1a | 2186 | uint32_t tmpreg1 = 0U; |
NYX | 0:85b3fd62ea1a | 2187 | |
NYX | 0:85b3fd62ea1a | 2188 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 2189 | assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); |
NYX | 0:85b3fd62ea1a | 2190 | |
NYX | 0:85b3fd62ea1a | 2191 | /*----------------------- SAI/I2S Configuration (PLLI2S) -------------------*/ |
NYX | 0:85b3fd62ea1a | 2192 | /*----------------------- Common configuration SAI/I2S ---------------------*/ |
NYX | 0:85b3fd62ea1a | 2193 | /* In Case of SAI or I2S Clock Configuration through PLLI2S, PLLI2SN division |
NYX | 0:85b3fd62ea1a | 2194 | factor is common parameters for both peripherals */ |
NYX | 0:85b3fd62ea1a | 2195 | if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) || |
NYX | 0:85b3fd62ea1a | 2196 | (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == RCC_PERIPHCLK_SAI_PLLI2S)) |
NYX | 0:85b3fd62ea1a | 2197 | { |
NYX | 0:85b3fd62ea1a | 2198 | /* check for Parameters */ |
NYX | 0:85b3fd62ea1a | 2199 | assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); |
NYX | 0:85b3fd62ea1a | 2200 | |
NYX | 0:85b3fd62ea1a | 2201 | /* Disable the PLLI2S */ |
NYX | 0:85b3fd62ea1a | 2202 | __HAL_RCC_PLLI2S_DISABLE(); |
NYX | 0:85b3fd62ea1a | 2203 | /* Get tick */ |
NYX | 0:85b3fd62ea1a | 2204 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 2205 | /* Wait till PLLI2S is disabled */ |
NYX | 0:85b3fd62ea1a | 2206 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) |
NYX | 0:85b3fd62ea1a | 2207 | { |
NYX | 0:85b3fd62ea1a | 2208 | if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 2209 | { |
NYX | 0:85b3fd62ea1a | 2210 | /* return in case of Timeout detected */ |
NYX | 0:85b3fd62ea1a | 2211 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 2212 | } |
NYX | 0:85b3fd62ea1a | 2213 | } |
NYX | 0:85b3fd62ea1a | 2214 | |
NYX | 0:85b3fd62ea1a | 2215 | /*---------------------------- I2S configuration -------------------------*/ |
NYX | 0:85b3fd62ea1a | 2216 | /* In Case of I2S Clock Configuration through PLLI2S, PLLI2SR must be added |
NYX | 0:85b3fd62ea1a | 2217 | only for I2S configuration */ |
NYX | 0:85b3fd62ea1a | 2218 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == (RCC_PERIPHCLK_I2S)) |
NYX | 0:85b3fd62ea1a | 2219 | { |
NYX | 0:85b3fd62ea1a | 2220 | /* check for Parameters */ |
NYX | 0:85b3fd62ea1a | 2221 | assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); |
NYX | 0:85b3fd62ea1a | 2222 | /* Configure the PLLI2S division factors */ |
NYX | 0:85b3fd62ea1a | 2223 | /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLM) */ |
NYX | 0:85b3fd62ea1a | 2224 | /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ |
NYX | 0:85b3fd62ea1a | 2225 | __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SR); |
NYX | 0:85b3fd62ea1a | 2226 | } |
NYX | 0:85b3fd62ea1a | 2227 | |
NYX | 0:85b3fd62ea1a | 2228 | /*---------------------------- SAI configuration -------------------------*/ |
NYX | 0:85b3fd62ea1a | 2229 | /* In Case of SAI Clock Configuration through PLLI2S, PLLI2SQ and PLLI2S_DIVQ must |
NYX | 0:85b3fd62ea1a | 2230 | be added only for SAI configuration */ |
NYX | 0:85b3fd62ea1a | 2231 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == (RCC_PERIPHCLK_SAI_PLLI2S)) |
NYX | 0:85b3fd62ea1a | 2232 | { |
NYX | 0:85b3fd62ea1a | 2233 | /* Check the PLLI2S division factors */ |
NYX | 0:85b3fd62ea1a | 2234 | assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); |
NYX | 0:85b3fd62ea1a | 2235 | assert_param(IS_RCC_PLLI2S_DIVQ_VALUE(PeriphClkInit->PLLI2SDivQ)); |
NYX | 0:85b3fd62ea1a | 2236 | |
NYX | 0:85b3fd62ea1a | 2237 | /* Read PLLI2SR value from PLLI2SCFGR register (this value is not need for SAI configuration) */ |
NYX | 0:85b3fd62ea1a | 2238 | tmpreg1 = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SR)); |
NYX | 0:85b3fd62ea1a | 2239 | /* Configure the PLLI2S division factors */ |
NYX | 0:85b3fd62ea1a | 2240 | /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ |
NYX | 0:85b3fd62ea1a | 2241 | /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ |
NYX | 0:85b3fd62ea1a | 2242 | /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ |
NYX | 0:85b3fd62ea1a | 2243 | __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SQ , tmpreg1); |
NYX | 0:85b3fd62ea1a | 2244 | /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ |
NYX | 0:85b3fd62ea1a | 2245 | __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLI2SDivQ); |
NYX | 0:85b3fd62ea1a | 2246 | } |
NYX | 0:85b3fd62ea1a | 2247 | |
NYX | 0:85b3fd62ea1a | 2248 | /* Enable the PLLI2S */ |
NYX | 0:85b3fd62ea1a | 2249 | __HAL_RCC_PLLI2S_ENABLE(); |
NYX | 0:85b3fd62ea1a | 2250 | /* Get tick */ |
NYX | 0:85b3fd62ea1a | 2251 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 2252 | /* Wait till PLLI2S is ready */ |
NYX | 0:85b3fd62ea1a | 2253 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) |
NYX | 0:85b3fd62ea1a | 2254 | { |
NYX | 0:85b3fd62ea1a | 2255 | if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 2256 | { |
NYX | 0:85b3fd62ea1a | 2257 | /* return in case of Timeout detected */ |
NYX | 0:85b3fd62ea1a | 2258 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 2259 | } |
NYX | 0:85b3fd62ea1a | 2260 | } |
NYX | 0:85b3fd62ea1a | 2261 | } |
NYX | 0:85b3fd62ea1a | 2262 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 2263 | |
NYX | 0:85b3fd62ea1a | 2264 | /*----------------------- SAI/LTDC Configuration (PLLSAI) ------------------*/ |
NYX | 0:85b3fd62ea1a | 2265 | /*----------------------- Common configuration SAI/LTDC --------------------*/ |
NYX | 0:85b3fd62ea1a | 2266 | /* In Case of SAI or LTDC Clock Configuration through PLLSAI, PLLSAIN division |
NYX | 0:85b3fd62ea1a | 2267 | factor is common parameters for both peripherals */ |
NYX | 0:85b3fd62ea1a | 2268 | if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == RCC_PERIPHCLK_SAI_PLLSAI) || |
NYX | 0:85b3fd62ea1a | 2269 | (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == RCC_PERIPHCLK_LTDC)) |
NYX | 0:85b3fd62ea1a | 2270 | { |
NYX | 0:85b3fd62ea1a | 2271 | /* Check the PLLSAI division factors */ |
NYX | 0:85b3fd62ea1a | 2272 | assert_param(IS_RCC_PLLSAIN_VALUE(PeriphClkInit->PLLSAI.PLLSAIN)); |
NYX | 0:85b3fd62ea1a | 2273 | |
NYX | 0:85b3fd62ea1a | 2274 | /* Disable PLLSAI Clock */ |
NYX | 0:85b3fd62ea1a | 2275 | __HAL_RCC_PLLSAI_DISABLE(); |
NYX | 0:85b3fd62ea1a | 2276 | /* Get tick */ |
NYX | 0:85b3fd62ea1a | 2277 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 2278 | /* Wait till PLLSAI is disabled */ |
NYX | 0:85b3fd62ea1a | 2279 | while(__HAL_RCC_PLLSAI_GET_FLAG() != RESET) |
NYX | 0:85b3fd62ea1a | 2280 | { |
NYX | 0:85b3fd62ea1a | 2281 | if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 2282 | { |
NYX | 0:85b3fd62ea1a | 2283 | /* return in case of Timeout detected */ |
NYX | 0:85b3fd62ea1a | 2284 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 2285 | } |
NYX | 0:85b3fd62ea1a | 2286 | } |
NYX | 0:85b3fd62ea1a | 2287 | |
NYX | 0:85b3fd62ea1a | 2288 | /*---------------------------- SAI configuration -------------------------*/ |
NYX | 0:85b3fd62ea1a | 2289 | /* In Case of SAI Clock Configuration through PLLSAI, PLLSAIQ and PLLSAI_DIVQ must |
NYX | 0:85b3fd62ea1a | 2290 | be added only for SAI configuration */ |
NYX | 0:85b3fd62ea1a | 2291 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == (RCC_PERIPHCLK_SAI_PLLSAI)) |
NYX | 0:85b3fd62ea1a | 2292 | { |
NYX | 0:85b3fd62ea1a | 2293 | assert_param(IS_RCC_PLLSAIQ_VALUE(PeriphClkInit->PLLSAI.PLLSAIQ)); |
NYX | 0:85b3fd62ea1a | 2294 | assert_param(IS_RCC_PLLSAI_DIVQ_VALUE(PeriphClkInit->PLLSAIDivQ)); |
NYX | 0:85b3fd62ea1a | 2295 | |
NYX | 0:85b3fd62ea1a | 2296 | /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ |
NYX | 0:85b3fd62ea1a | 2297 | tmpreg1 = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> POSITION_VAL(RCC_PLLSAICFGR_PLLSAIR)); |
NYX | 0:85b3fd62ea1a | 2298 | /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ |
NYX | 0:85b3fd62ea1a | 2299 | /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ |
NYX | 0:85b3fd62ea1a | 2300 | /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ |
NYX | 0:85b3fd62ea1a | 2301 | __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN , PeriphClkInit->PLLSAI.PLLSAIQ, tmpreg1); |
NYX | 0:85b3fd62ea1a | 2302 | /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ |
NYX | 0:85b3fd62ea1a | 2303 | __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLSAIDivQ); |
NYX | 0:85b3fd62ea1a | 2304 | } |
NYX | 0:85b3fd62ea1a | 2305 | |
NYX | 0:85b3fd62ea1a | 2306 | /*---------------------------- LTDC configuration ------------------------*/ |
NYX | 0:85b3fd62ea1a | 2307 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == (RCC_PERIPHCLK_LTDC)) |
NYX | 0:85b3fd62ea1a | 2308 | { |
NYX | 0:85b3fd62ea1a | 2309 | assert_param(IS_RCC_PLLSAIR_VALUE(PeriphClkInit->PLLSAI.PLLSAIR)); |
NYX | 0:85b3fd62ea1a | 2310 | assert_param(IS_RCC_PLLSAI_DIVR_VALUE(PeriphClkInit->PLLSAIDivR)); |
NYX | 0:85b3fd62ea1a | 2311 | |
NYX | 0:85b3fd62ea1a | 2312 | /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ |
NYX | 0:85b3fd62ea1a | 2313 | tmpreg1 = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> POSITION_VAL(RCC_PLLSAICFGR_PLLSAIQ)); |
NYX | 0:85b3fd62ea1a | 2314 | /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ |
NYX | 0:85b3fd62ea1a | 2315 | /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ |
NYX | 0:85b3fd62ea1a | 2316 | /* LTDC_CLK(first level) = PLLSAI_VCO Output/PLLSAIR */ |
NYX | 0:85b3fd62ea1a | 2317 | __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN , tmpreg1, PeriphClkInit->PLLSAI.PLLSAIR); |
NYX | 0:85b3fd62ea1a | 2318 | /* LTDC_CLK = LTDC_CLK(first level)/PLLSAIDIVR */ |
NYX | 0:85b3fd62ea1a | 2319 | __HAL_RCC_PLLSAI_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLSAIDivR); |
NYX | 0:85b3fd62ea1a | 2320 | } |
NYX | 0:85b3fd62ea1a | 2321 | /* Enable PLLSAI Clock */ |
NYX | 0:85b3fd62ea1a | 2322 | __HAL_RCC_PLLSAI_ENABLE(); |
NYX | 0:85b3fd62ea1a | 2323 | /* Get tick */ |
NYX | 0:85b3fd62ea1a | 2324 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 2325 | /* Wait till PLLSAI is ready */ |
NYX | 0:85b3fd62ea1a | 2326 | while(__HAL_RCC_PLLSAI_GET_FLAG() == RESET) |
NYX | 0:85b3fd62ea1a | 2327 | { |
NYX | 0:85b3fd62ea1a | 2328 | if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 2329 | { |
NYX | 0:85b3fd62ea1a | 2330 | /* return in case of Timeout detected */ |
NYX | 0:85b3fd62ea1a | 2331 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 2332 | } |
NYX | 0:85b3fd62ea1a | 2333 | } |
NYX | 0:85b3fd62ea1a | 2334 | } |
NYX | 0:85b3fd62ea1a | 2335 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 2336 | |
NYX | 0:85b3fd62ea1a | 2337 | /*---------------------------- RTC configuration ---------------------------*/ |
NYX | 0:85b3fd62ea1a | 2338 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) |
NYX | 0:85b3fd62ea1a | 2339 | { |
NYX | 0:85b3fd62ea1a | 2340 | /* Check for RTC Parameters used to output RTCCLK */ |
NYX | 0:85b3fd62ea1a | 2341 | assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); |
NYX | 0:85b3fd62ea1a | 2342 | |
NYX | 0:85b3fd62ea1a | 2343 | /* Enable Power Clock*/ |
NYX | 0:85b3fd62ea1a | 2344 | __HAL_RCC_PWR_CLK_ENABLE(); |
NYX | 0:85b3fd62ea1a | 2345 | |
NYX | 0:85b3fd62ea1a | 2346 | /* Enable write access to Backup domain */ |
NYX | 0:85b3fd62ea1a | 2347 | PWR->CR |= PWR_CR_DBP; |
NYX | 0:85b3fd62ea1a | 2348 | |
NYX | 0:85b3fd62ea1a | 2349 | /* Get tick */ |
NYX | 0:85b3fd62ea1a | 2350 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 2351 | |
NYX | 0:85b3fd62ea1a | 2352 | while((PWR->CR & PWR_CR_DBP) == RESET) |
NYX | 0:85b3fd62ea1a | 2353 | { |
NYX | 0:85b3fd62ea1a | 2354 | if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 2355 | { |
NYX | 0:85b3fd62ea1a | 2356 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 2357 | } |
NYX | 0:85b3fd62ea1a | 2358 | } |
NYX | 0:85b3fd62ea1a | 2359 | /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ |
NYX | 0:85b3fd62ea1a | 2360 | tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); |
NYX | 0:85b3fd62ea1a | 2361 | if((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) |
NYX | 0:85b3fd62ea1a | 2362 | { |
NYX | 0:85b3fd62ea1a | 2363 | /* Store the content of BDCR register before the reset of Backup Domain */ |
NYX | 0:85b3fd62ea1a | 2364 | tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); |
NYX | 0:85b3fd62ea1a | 2365 | /* RTC Clock selection can be changed only if the Backup Domain is reset */ |
NYX | 0:85b3fd62ea1a | 2366 | __HAL_RCC_BACKUPRESET_FORCE(); |
NYX | 0:85b3fd62ea1a | 2367 | __HAL_RCC_BACKUPRESET_RELEASE(); |
NYX | 0:85b3fd62ea1a | 2368 | /* Restore the Content of BDCR register */ |
NYX | 0:85b3fd62ea1a | 2369 | RCC->BDCR = tmpreg1; |
NYX | 0:85b3fd62ea1a | 2370 | |
NYX | 0:85b3fd62ea1a | 2371 | /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ |
NYX | 0:85b3fd62ea1a | 2372 | if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) |
NYX | 0:85b3fd62ea1a | 2373 | { |
NYX | 0:85b3fd62ea1a | 2374 | /* Get tick */ |
NYX | 0:85b3fd62ea1a | 2375 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 2376 | |
NYX | 0:85b3fd62ea1a | 2377 | /* Wait till LSE is ready */ |
NYX | 0:85b3fd62ea1a | 2378 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) |
NYX | 0:85b3fd62ea1a | 2379 | { |
NYX | 0:85b3fd62ea1a | 2380 | if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 2381 | { |
NYX | 0:85b3fd62ea1a | 2382 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 2383 | } |
NYX | 0:85b3fd62ea1a | 2384 | } |
NYX | 0:85b3fd62ea1a | 2385 | } |
NYX | 0:85b3fd62ea1a | 2386 | } |
NYX | 0:85b3fd62ea1a | 2387 | __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); |
NYX | 0:85b3fd62ea1a | 2388 | } |
NYX | 0:85b3fd62ea1a | 2389 | /*--------------------------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 2390 | |
NYX | 0:85b3fd62ea1a | 2391 | /*---------------------------- TIM configuration ---------------------------*/ |
NYX | 0:85b3fd62ea1a | 2392 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) |
NYX | 0:85b3fd62ea1a | 2393 | { |
NYX | 0:85b3fd62ea1a | 2394 | __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); |
NYX | 0:85b3fd62ea1a | 2395 | } |
NYX | 0:85b3fd62ea1a | 2396 | return HAL_OK; |
NYX | 0:85b3fd62ea1a | 2397 | } |
NYX | 0:85b3fd62ea1a | 2398 | |
NYX | 0:85b3fd62ea1a | 2399 | /** |
NYX | 0:85b3fd62ea1a | 2400 | * @brief Configures the PeriphClkInit according to the internal |
NYX | 0:85b3fd62ea1a | 2401 | * RCC configuration registers. |
NYX | 0:85b3fd62ea1a | 2402 | * @param PeriphClkInit: pointer to an RCC_PeriphCLKInitTypeDef structure that |
NYX | 0:85b3fd62ea1a | 2403 | * will be configured. |
NYX | 0:85b3fd62ea1a | 2404 | * @retval None |
NYX | 0:85b3fd62ea1a | 2405 | */ |
NYX | 0:85b3fd62ea1a | 2406 | void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) |
NYX | 0:85b3fd62ea1a | 2407 | { |
NYX | 0:85b3fd62ea1a | 2408 | uint32_t tempreg; |
NYX | 0:85b3fd62ea1a | 2409 | |
NYX | 0:85b3fd62ea1a | 2410 | /* Set all possible values for the extended clock type parameter------------*/ |
NYX | 0:85b3fd62ea1a | 2411 | PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_SAI_PLLSAI | RCC_PERIPHCLK_SAI_PLLI2S | RCC_PERIPHCLK_LTDC | RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC; |
NYX | 0:85b3fd62ea1a | 2412 | |
NYX | 0:85b3fd62ea1a | 2413 | /* Get the PLLI2S Clock configuration -----------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 2414 | PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SN)); |
NYX | 0:85b3fd62ea1a | 2415 | PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SR)); |
NYX | 0:85b3fd62ea1a | 2416 | PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SQ)); |
NYX | 0:85b3fd62ea1a | 2417 | /* Get the PLLSAI Clock configuration -----------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 2418 | PeriphClkInit->PLLSAI.PLLSAIN = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> POSITION_VAL(RCC_PLLSAICFGR_PLLSAIN)); |
NYX | 0:85b3fd62ea1a | 2419 | PeriphClkInit->PLLSAI.PLLSAIR = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> POSITION_VAL(RCC_PLLSAICFGR_PLLSAIR)); |
NYX | 0:85b3fd62ea1a | 2420 | PeriphClkInit->PLLSAI.PLLSAIQ = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> POSITION_VAL(RCC_PLLSAICFGR_PLLSAIQ)); |
NYX | 0:85b3fd62ea1a | 2421 | /* Get the PLLSAI/PLLI2S division factors -----------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 2422 | PeriphClkInit->PLLI2SDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) >> POSITION_VAL(RCC_DCKCFGR_PLLI2SDIVQ)); |
NYX | 0:85b3fd62ea1a | 2423 | PeriphClkInit->PLLSAIDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> POSITION_VAL(RCC_DCKCFGR_PLLSAIDIVQ)); |
NYX | 0:85b3fd62ea1a | 2424 | PeriphClkInit->PLLSAIDivR = (uint32_t)(RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVR); |
NYX | 0:85b3fd62ea1a | 2425 | /* Get the RTC Clock configuration -----------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 2426 | tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); |
NYX | 0:85b3fd62ea1a | 2427 | PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); |
NYX | 0:85b3fd62ea1a | 2428 | |
NYX | 0:85b3fd62ea1a | 2429 | if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) |
NYX | 0:85b3fd62ea1a | 2430 | { |
NYX | 0:85b3fd62ea1a | 2431 | PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; |
NYX | 0:85b3fd62ea1a | 2432 | } |
NYX | 0:85b3fd62ea1a | 2433 | else |
NYX | 0:85b3fd62ea1a | 2434 | { |
NYX | 0:85b3fd62ea1a | 2435 | PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; |
NYX | 0:85b3fd62ea1a | 2436 | } |
NYX | 0:85b3fd62ea1a | 2437 | } |
NYX | 0:85b3fd62ea1a | 2438 | |
NYX | 0:85b3fd62ea1a | 2439 | /** |
NYX | 0:85b3fd62ea1a | 2440 | * @brief Return the peripheral clock frequency for a given peripheral(SAI..) |
NYX | 0:85b3fd62ea1a | 2441 | * @note Return 0 if peripheral clock identifier not managed by this API |
NYX | 0:85b3fd62ea1a | 2442 | * @param PeriphClk: Peripheral clock identifier |
NYX | 0:85b3fd62ea1a | 2443 | * This parameter can be one of the following values: |
NYX | 0:85b3fd62ea1a | 2444 | * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock |
NYX | 0:85b3fd62ea1a | 2445 | * @retval Frequency in KHz |
NYX | 0:85b3fd62ea1a | 2446 | */ |
NYX | 0:85b3fd62ea1a | 2447 | uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) |
NYX | 0:85b3fd62ea1a | 2448 | { |
NYX | 0:85b3fd62ea1a | 2449 | /* This variable used to store the I2S clock frequency (value in Hz) */ |
NYX | 0:85b3fd62ea1a | 2450 | uint32_t frequency = 0U; |
NYX | 0:85b3fd62ea1a | 2451 | /* This variable used to store the VCO Input (value in Hz) */ |
NYX | 0:85b3fd62ea1a | 2452 | uint32_t vcoinput = 0U; |
NYX | 0:85b3fd62ea1a | 2453 | uint32_t srcclk = 0U; |
NYX | 0:85b3fd62ea1a | 2454 | /* This variable used to store the VCO Output (value in Hz) */ |
NYX | 0:85b3fd62ea1a | 2455 | uint32_t vcooutput = 0U; |
NYX | 0:85b3fd62ea1a | 2456 | switch (PeriphClk) |
NYX | 0:85b3fd62ea1a | 2457 | { |
NYX | 0:85b3fd62ea1a | 2458 | case RCC_PERIPHCLK_I2S: |
NYX | 0:85b3fd62ea1a | 2459 | { |
NYX | 0:85b3fd62ea1a | 2460 | /* Get the current I2S source */ |
NYX | 0:85b3fd62ea1a | 2461 | srcclk = __HAL_RCC_GET_I2S_SOURCE(); |
NYX | 0:85b3fd62ea1a | 2462 | switch (srcclk) |
NYX | 0:85b3fd62ea1a | 2463 | { |
NYX | 0:85b3fd62ea1a | 2464 | /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ |
NYX | 0:85b3fd62ea1a | 2465 | case RCC_I2SCLKSOURCE_EXT: |
NYX | 0:85b3fd62ea1a | 2466 | { |
NYX | 0:85b3fd62ea1a | 2467 | /* Set the I2S clock to the external clock value */ |
NYX | 0:85b3fd62ea1a | 2468 | frequency = EXTERNAL_CLOCK_VALUE; |
NYX | 0:85b3fd62ea1a | 2469 | break; |
NYX | 0:85b3fd62ea1a | 2470 | } |
NYX | 0:85b3fd62ea1a | 2471 | /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ |
NYX | 0:85b3fd62ea1a | 2472 | case RCC_I2SCLKSOURCE_PLLI2S: |
NYX | 0:85b3fd62ea1a | 2473 | { |
NYX | 0:85b3fd62ea1a | 2474 | /* Configure the PLLI2S division factor */ |
NYX | 0:85b3fd62ea1a | 2475 | /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ |
NYX | 0:85b3fd62ea1a | 2476 | if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) |
NYX | 0:85b3fd62ea1a | 2477 | { |
NYX | 0:85b3fd62ea1a | 2478 | /* Get the I2S source clock value */ |
NYX | 0:85b3fd62ea1a | 2479 | vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); |
NYX | 0:85b3fd62ea1a | 2480 | } |
NYX | 0:85b3fd62ea1a | 2481 | else |
NYX | 0:85b3fd62ea1a | 2482 | { |
NYX | 0:85b3fd62ea1a | 2483 | /* Get the I2S source clock value */ |
NYX | 0:85b3fd62ea1a | 2484 | vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); |
NYX | 0:85b3fd62ea1a | 2485 | } |
NYX | 0:85b3fd62ea1a | 2486 | |
NYX | 0:85b3fd62ea1a | 2487 | /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ |
NYX | 0:85b3fd62ea1a | 2488 | vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); |
NYX | 0:85b3fd62ea1a | 2489 | /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ |
NYX | 0:85b3fd62ea1a | 2490 | frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); |
NYX | 0:85b3fd62ea1a | 2491 | break; |
NYX | 0:85b3fd62ea1a | 2492 | } |
NYX | 0:85b3fd62ea1a | 2493 | /* Clock not enabled for I2S */ |
NYX | 0:85b3fd62ea1a | 2494 | default: |
NYX | 0:85b3fd62ea1a | 2495 | { |
NYX | 0:85b3fd62ea1a | 2496 | frequency = 0U; |
NYX | 0:85b3fd62ea1a | 2497 | break; |
NYX | 0:85b3fd62ea1a | 2498 | } |
NYX | 0:85b3fd62ea1a | 2499 | } |
NYX | 0:85b3fd62ea1a | 2500 | break; |
NYX | 0:85b3fd62ea1a | 2501 | } |
NYX | 0:85b3fd62ea1a | 2502 | } |
NYX | 0:85b3fd62ea1a | 2503 | return frequency; |
NYX | 0:85b3fd62ea1a | 2504 | } |
NYX | 0:85b3fd62ea1a | 2505 | #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ |
NYX | 0:85b3fd62ea1a | 2506 | |
NYX | 0:85b3fd62ea1a | 2507 | #if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) ||\ |
NYX | 0:85b3fd62ea1a | 2508 | defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) |
NYX | 0:85b3fd62ea1a | 2509 | /** |
NYX | 0:85b3fd62ea1a | 2510 | * @brief Initializes the RCC extended peripherals clocks according to the specified parameters in the |
NYX | 0:85b3fd62ea1a | 2511 | * RCC_PeriphCLKInitTypeDef. |
NYX | 0:85b3fd62ea1a | 2512 | * @param PeriphClkInit: pointer to an RCC_PeriphCLKInitTypeDef structure that |
NYX | 0:85b3fd62ea1a | 2513 | * contains the configuration information for the Extended Peripherals clocks(I2S and RTC clocks). |
NYX | 0:85b3fd62ea1a | 2514 | * |
NYX | 0:85b3fd62ea1a | 2515 | * @note A caution to be taken when HAL_RCCEx_PeriphCLKConfig() is used to select RTC clock selection, in this case |
NYX | 0:85b3fd62ea1a | 2516 | * the Reset of Backup domain will be applied in order to modify the RTC Clock source as consequence all backup |
NYX | 0:85b3fd62ea1a | 2517 | * domain (RTC and RCC_BDCR register expect BKPSRAM) will be reset |
NYX | 0:85b3fd62ea1a | 2518 | * |
NYX | 0:85b3fd62ea1a | 2519 | * @retval HAL status |
NYX | 0:85b3fd62ea1a | 2520 | */ |
NYX | 0:85b3fd62ea1a | 2521 | HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) |
NYX | 0:85b3fd62ea1a | 2522 | { |
NYX | 0:85b3fd62ea1a | 2523 | uint32_t tickstart = 0U; |
NYX | 0:85b3fd62ea1a | 2524 | uint32_t tmpreg1 = 0U; |
NYX | 0:85b3fd62ea1a | 2525 | |
NYX | 0:85b3fd62ea1a | 2526 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 2527 | assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); |
NYX | 0:85b3fd62ea1a | 2528 | |
NYX | 0:85b3fd62ea1a | 2529 | /*---------------------------- I2S configuration ---------------------------*/ |
NYX | 0:85b3fd62ea1a | 2530 | if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) || |
NYX | 0:85b3fd62ea1a | 2531 | (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S)) |
NYX | 0:85b3fd62ea1a | 2532 | { |
NYX | 0:85b3fd62ea1a | 2533 | /* check for Parameters */ |
NYX | 0:85b3fd62ea1a | 2534 | assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); |
NYX | 0:85b3fd62ea1a | 2535 | assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); |
NYX | 0:85b3fd62ea1a | 2536 | #if defined(STM32F411xE) |
NYX | 0:85b3fd62ea1a | 2537 | assert_param(IS_RCC_PLLI2SM_VALUE(PeriphClkInit->PLLI2S.PLLI2SM)); |
NYX | 0:85b3fd62ea1a | 2538 | #endif /* STM32F411xE */ |
NYX | 0:85b3fd62ea1a | 2539 | /* Disable the PLLI2S */ |
NYX | 0:85b3fd62ea1a | 2540 | __HAL_RCC_PLLI2S_DISABLE(); |
NYX | 0:85b3fd62ea1a | 2541 | /* Get tick */ |
NYX | 0:85b3fd62ea1a | 2542 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 2543 | /* Wait till PLLI2S is disabled */ |
NYX | 0:85b3fd62ea1a | 2544 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) |
NYX | 0:85b3fd62ea1a | 2545 | { |
NYX | 0:85b3fd62ea1a | 2546 | if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 2547 | { |
NYX | 0:85b3fd62ea1a | 2548 | /* return in case of Timeout detected */ |
NYX | 0:85b3fd62ea1a | 2549 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 2550 | } |
NYX | 0:85b3fd62ea1a | 2551 | } |
NYX | 0:85b3fd62ea1a | 2552 | |
NYX | 0:85b3fd62ea1a | 2553 | #if defined(STM32F411xE) |
NYX | 0:85b3fd62ea1a | 2554 | /* Configure the PLLI2S division factors */ |
NYX | 0:85b3fd62ea1a | 2555 | /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ |
NYX | 0:85b3fd62ea1a | 2556 | /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ |
NYX | 0:85b3fd62ea1a | 2557 | __HAL_RCC_PLLI2S_I2SCLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SR); |
NYX | 0:85b3fd62ea1a | 2558 | #else |
NYX | 0:85b3fd62ea1a | 2559 | /* Configure the PLLI2S division factors */ |
NYX | 0:85b3fd62ea1a | 2560 | /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLM) */ |
NYX | 0:85b3fd62ea1a | 2561 | /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ |
NYX | 0:85b3fd62ea1a | 2562 | __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SR); |
NYX | 0:85b3fd62ea1a | 2563 | #endif /* STM32F411xE */ |
NYX | 0:85b3fd62ea1a | 2564 | |
NYX | 0:85b3fd62ea1a | 2565 | /* Enable the PLLI2S */ |
NYX | 0:85b3fd62ea1a | 2566 | __HAL_RCC_PLLI2S_ENABLE(); |
NYX | 0:85b3fd62ea1a | 2567 | /* Get tick */ |
NYX | 0:85b3fd62ea1a | 2568 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 2569 | /* Wait till PLLI2S is ready */ |
NYX | 0:85b3fd62ea1a | 2570 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) |
NYX | 0:85b3fd62ea1a | 2571 | { |
NYX | 0:85b3fd62ea1a | 2572 | if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 2573 | { |
NYX | 0:85b3fd62ea1a | 2574 | /* return in case of Timeout detected */ |
NYX | 0:85b3fd62ea1a | 2575 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 2576 | } |
NYX | 0:85b3fd62ea1a | 2577 | } |
NYX | 0:85b3fd62ea1a | 2578 | } |
NYX | 0:85b3fd62ea1a | 2579 | |
NYX | 0:85b3fd62ea1a | 2580 | /*---------------------------- RTC configuration ---------------------------*/ |
NYX | 0:85b3fd62ea1a | 2581 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) |
NYX | 0:85b3fd62ea1a | 2582 | { |
NYX | 0:85b3fd62ea1a | 2583 | /* Check for RTC Parameters used to output RTCCLK */ |
NYX | 0:85b3fd62ea1a | 2584 | assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); |
NYX | 0:85b3fd62ea1a | 2585 | |
NYX | 0:85b3fd62ea1a | 2586 | /* Enable Power Clock*/ |
NYX | 0:85b3fd62ea1a | 2587 | __HAL_RCC_PWR_CLK_ENABLE(); |
NYX | 0:85b3fd62ea1a | 2588 | |
NYX | 0:85b3fd62ea1a | 2589 | /* Enable write access to Backup domain */ |
NYX | 0:85b3fd62ea1a | 2590 | PWR->CR |= PWR_CR_DBP; |
NYX | 0:85b3fd62ea1a | 2591 | |
NYX | 0:85b3fd62ea1a | 2592 | /* Get tick */ |
NYX | 0:85b3fd62ea1a | 2593 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 2594 | |
NYX | 0:85b3fd62ea1a | 2595 | while((PWR->CR & PWR_CR_DBP) == RESET) |
NYX | 0:85b3fd62ea1a | 2596 | { |
NYX | 0:85b3fd62ea1a | 2597 | if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 2598 | { |
NYX | 0:85b3fd62ea1a | 2599 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 2600 | } |
NYX | 0:85b3fd62ea1a | 2601 | } |
NYX | 0:85b3fd62ea1a | 2602 | /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ |
NYX | 0:85b3fd62ea1a | 2603 | tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); |
NYX | 0:85b3fd62ea1a | 2604 | if((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) |
NYX | 0:85b3fd62ea1a | 2605 | { |
NYX | 0:85b3fd62ea1a | 2606 | /* Store the content of BDCR register before the reset of Backup Domain */ |
NYX | 0:85b3fd62ea1a | 2607 | tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); |
NYX | 0:85b3fd62ea1a | 2608 | /* RTC Clock selection can be changed only if the Backup Domain is reset */ |
NYX | 0:85b3fd62ea1a | 2609 | __HAL_RCC_BACKUPRESET_FORCE(); |
NYX | 0:85b3fd62ea1a | 2610 | __HAL_RCC_BACKUPRESET_RELEASE(); |
NYX | 0:85b3fd62ea1a | 2611 | /* Restore the Content of BDCR register */ |
NYX | 0:85b3fd62ea1a | 2612 | RCC->BDCR = tmpreg1; |
NYX | 0:85b3fd62ea1a | 2613 | |
NYX | 0:85b3fd62ea1a | 2614 | /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ |
NYX | 0:85b3fd62ea1a | 2615 | if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) |
NYX | 0:85b3fd62ea1a | 2616 | { |
NYX | 0:85b3fd62ea1a | 2617 | /* Get tick */ |
NYX | 0:85b3fd62ea1a | 2618 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 2619 | |
NYX | 0:85b3fd62ea1a | 2620 | /* Wait till LSE is ready */ |
NYX | 0:85b3fd62ea1a | 2621 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) |
NYX | 0:85b3fd62ea1a | 2622 | { |
NYX | 0:85b3fd62ea1a | 2623 | if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 2624 | { |
NYX | 0:85b3fd62ea1a | 2625 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 2626 | } |
NYX | 0:85b3fd62ea1a | 2627 | } |
NYX | 0:85b3fd62ea1a | 2628 | } |
NYX | 0:85b3fd62ea1a | 2629 | } |
NYX | 0:85b3fd62ea1a | 2630 | __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); |
NYX | 0:85b3fd62ea1a | 2631 | } |
NYX | 0:85b3fd62ea1a | 2632 | #if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) |
NYX | 0:85b3fd62ea1a | 2633 | /*---------------------------- TIM configuration ---------------------------*/ |
NYX | 0:85b3fd62ea1a | 2634 | if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) |
NYX | 0:85b3fd62ea1a | 2635 | { |
NYX | 0:85b3fd62ea1a | 2636 | __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); |
NYX | 0:85b3fd62ea1a | 2637 | } |
NYX | 0:85b3fd62ea1a | 2638 | #endif /* STM32F401xC || STM32F401xE || STM32F411xE */ |
NYX | 0:85b3fd62ea1a | 2639 | return HAL_OK; |
NYX | 0:85b3fd62ea1a | 2640 | } |
NYX | 0:85b3fd62ea1a | 2641 | |
NYX | 0:85b3fd62ea1a | 2642 | /** |
NYX | 0:85b3fd62ea1a | 2643 | * @brief Configures the RCC_OscInitStruct according to the internal |
NYX | 0:85b3fd62ea1a | 2644 | * RCC configuration registers. |
NYX | 0:85b3fd62ea1a | 2645 | * @param PeriphClkInit: pointer to an RCC_PeriphCLKInitTypeDef structure that |
NYX | 0:85b3fd62ea1a | 2646 | * will be configured. |
NYX | 0:85b3fd62ea1a | 2647 | * @retval None |
NYX | 0:85b3fd62ea1a | 2648 | */ |
NYX | 0:85b3fd62ea1a | 2649 | void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) |
NYX | 0:85b3fd62ea1a | 2650 | { |
NYX | 0:85b3fd62ea1a | 2651 | uint32_t tempreg; |
NYX | 0:85b3fd62ea1a | 2652 | |
NYX | 0:85b3fd62ea1a | 2653 | /* Set all possible values for the extended clock type parameter------------*/ |
NYX | 0:85b3fd62ea1a | 2654 | PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_RTC; |
NYX | 0:85b3fd62ea1a | 2655 | |
NYX | 0:85b3fd62ea1a | 2656 | /* Get the PLLI2S Clock configuration --------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 2657 | PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SN)); |
NYX | 0:85b3fd62ea1a | 2658 | PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SR)); |
NYX | 0:85b3fd62ea1a | 2659 | #if defined(STM32F411xE) |
NYX | 0:85b3fd62ea1a | 2660 | PeriphClkInit->PLLI2S.PLLI2SM = (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM); |
NYX | 0:85b3fd62ea1a | 2661 | #endif /* STM32F411xE */ |
NYX | 0:85b3fd62ea1a | 2662 | /* Get the RTC Clock configuration -----------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 2663 | tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); |
NYX | 0:85b3fd62ea1a | 2664 | PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); |
NYX | 0:85b3fd62ea1a | 2665 | |
NYX | 0:85b3fd62ea1a | 2666 | #if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) |
NYX | 0:85b3fd62ea1a | 2667 | /* Get the TIM Prescaler configuration -------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 2668 | if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) |
NYX | 0:85b3fd62ea1a | 2669 | { |
NYX | 0:85b3fd62ea1a | 2670 | PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; |
NYX | 0:85b3fd62ea1a | 2671 | } |
NYX | 0:85b3fd62ea1a | 2672 | else |
NYX | 0:85b3fd62ea1a | 2673 | { |
NYX | 0:85b3fd62ea1a | 2674 | PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; |
NYX | 0:85b3fd62ea1a | 2675 | } |
NYX | 0:85b3fd62ea1a | 2676 | #endif /* STM32F401xC || STM32F401xE || STM32F411xE */ |
NYX | 0:85b3fd62ea1a | 2677 | } |
NYX | 0:85b3fd62ea1a | 2678 | |
NYX | 0:85b3fd62ea1a | 2679 | /** |
NYX | 0:85b3fd62ea1a | 2680 | * @brief Return the peripheral clock frequency for a given peripheral(SAI..) |
NYX | 0:85b3fd62ea1a | 2681 | * @note Return 0 if peripheral clock identifier not managed by this API |
NYX | 0:85b3fd62ea1a | 2682 | * @param PeriphClk: Peripheral clock identifier |
NYX | 0:85b3fd62ea1a | 2683 | * This parameter can be one of the following values: |
NYX | 0:85b3fd62ea1a | 2684 | * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock |
NYX | 0:85b3fd62ea1a | 2685 | * @retval Frequency in KHz |
NYX | 0:85b3fd62ea1a | 2686 | */ |
NYX | 0:85b3fd62ea1a | 2687 | uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) |
NYX | 0:85b3fd62ea1a | 2688 | { |
NYX | 0:85b3fd62ea1a | 2689 | /* This variable used to store the I2S clock frequency (value in Hz) */ |
NYX | 0:85b3fd62ea1a | 2690 | uint32_t frequency = 0U; |
NYX | 0:85b3fd62ea1a | 2691 | /* This variable used to store the VCO Input (value in Hz) */ |
NYX | 0:85b3fd62ea1a | 2692 | uint32_t vcoinput = 0U; |
NYX | 0:85b3fd62ea1a | 2693 | uint32_t srcclk = 0U; |
NYX | 0:85b3fd62ea1a | 2694 | /* This variable used to store the VCO Output (value in Hz) */ |
NYX | 0:85b3fd62ea1a | 2695 | uint32_t vcooutput = 0U; |
NYX | 0:85b3fd62ea1a | 2696 | switch (PeriphClk) |
NYX | 0:85b3fd62ea1a | 2697 | { |
NYX | 0:85b3fd62ea1a | 2698 | case RCC_PERIPHCLK_I2S: |
NYX | 0:85b3fd62ea1a | 2699 | { |
NYX | 0:85b3fd62ea1a | 2700 | /* Get the current I2S source */ |
NYX | 0:85b3fd62ea1a | 2701 | srcclk = __HAL_RCC_GET_I2S_SOURCE(); |
NYX | 0:85b3fd62ea1a | 2702 | switch (srcclk) |
NYX | 0:85b3fd62ea1a | 2703 | { |
NYX | 0:85b3fd62ea1a | 2704 | /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ |
NYX | 0:85b3fd62ea1a | 2705 | case RCC_I2SCLKSOURCE_EXT: |
NYX | 0:85b3fd62ea1a | 2706 | { |
NYX | 0:85b3fd62ea1a | 2707 | /* Set the I2S clock to the external clock value */ |
NYX | 0:85b3fd62ea1a | 2708 | frequency = EXTERNAL_CLOCK_VALUE; |
NYX | 0:85b3fd62ea1a | 2709 | break; |
NYX | 0:85b3fd62ea1a | 2710 | } |
NYX | 0:85b3fd62ea1a | 2711 | /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ |
NYX | 0:85b3fd62ea1a | 2712 | case RCC_I2SCLKSOURCE_PLLI2S: |
NYX | 0:85b3fd62ea1a | 2713 | { |
NYX | 0:85b3fd62ea1a | 2714 | #if defined(STM32F411xE) |
NYX | 0:85b3fd62ea1a | 2715 | /* Configure the PLLI2S division factor */ |
NYX | 0:85b3fd62ea1a | 2716 | /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ |
NYX | 0:85b3fd62ea1a | 2717 | if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) |
NYX | 0:85b3fd62ea1a | 2718 | { |
NYX | 0:85b3fd62ea1a | 2719 | /* Get the I2S source clock value */ |
NYX | 0:85b3fd62ea1a | 2720 | vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); |
NYX | 0:85b3fd62ea1a | 2721 | } |
NYX | 0:85b3fd62ea1a | 2722 | else |
NYX | 0:85b3fd62ea1a | 2723 | { |
NYX | 0:85b3fd62ea1a | 2724 | /* Get the I2S source clock value */ |
NYX | 0:85b3fd62ea1a | 2725 | vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); |
NYX | 0:85b3fd62ea1a | 2726 | } |
NYX | 0:85b3fd62ea1a | 2727 | #else |
NYX | 0:85b3fd62ea1a | 2728 | /* Configure the PLLI2S division factor */ |
NYX | 0:85b3fd62ea1a | 2729 | /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ |
NYX | 0:85b3fd62ea1a | 2730 | if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) |
NYX | 0:85b3fd62ea1a | 2731 | { |
NYX | 0:85b3fd62ea1a | 2732 | /* Get the I2S source clock value */ |
NYX | 0:85b3fd62ea1a | 2733 | vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); |
NYX | 0:85b3fd62ea1a | 2734 | } |
NYX | 0:85b3fd62ea1a | 2735 | else |
NYX | 0:85b3fd62ea1a | 2736 | { |
NYX | 0:85b3fd62ea1a | 2737 | /* Get the I2S source clock value */ |
NYX | 0:85b3fd62ea1a | 2738 | vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); |
NYX | 0:85b3fd62ea1a | 2739 | } |
NYX | 0:85b3fd62ea1a | 2740 | #endif /* STM32F411xE */ |
NYX | 0:85b3fd62ea1a | 2741 | /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ |
NYX | 0:85b3fd62ea1a | 2742 | vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); |
NYX | 0:85b3fd62ea1a | 2743 | /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ |
NYX | 0:85b3fd62ea1a | 2744 | frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); |
NYX | 0:85b3fd62ea1a | 2745 | break; |
NYX | 0:85b3fd62ea1a | 2746 | } |
NYX | 0:85b3fd62ea1a | 2747 | /* Clock not enabled for I2S*/ |
NYX | 0:85b3fd62ea1a | 2748 | default: |
NYX | 0:85b3fd62ea1a | 2749 | { |
NYX | 0:85b3fd62ea1a | 2750 | frequency = 0U; |
NYX | 0:85b3fd62ea1a | 2751 | break; |
NYX | 0:85b3fd62ea1a | 2752 | } |
NYX | 0:85b3fd62ea1a | 2753 | } |
NYX | 0:85b3fd62ea1a | 2754 | break; |
NYX | 0:85b3fd62ea1a | 2755 | } |
NYX | 0:85b3fd62ea1a | 2756 | } |
NYX | 0:85b3fd62ea1a | 2757 | return frequency; |
NYX | 0:85b3fd62ea1a | 2758 | } |
NYX | 0:85b3fd62ea1a | 2759 | #endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F411xE */ |
NYX | 0:85b3fd62ea1a | 2760 | |
NYX | 0:85b3fd62ea1a | 2761 | #if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ |
NYX | 0:85b3fd62ea1a | 2762 | defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) |
NYX | 0:85b3fd62ea1a | 2763 | /** |
NYX | 0:85b3fd62ea1a | 2764 | * @brief Select LSE mode |
NYX | 0:85b3fd62ea1a | 2765 | * |
NYX | 0:85b3fd62ea1a | 2766 | * @note This mode is only available for STM32F410xx/STM32F411xx/STM32F446xx/STM32F469xx/STM32F479xx/STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx devices. |
NYX | 0:85b3fd62ea1a | 2767 | * |
NYX | 0:85b3fd62ea1a | 2768 | * @param Mode: specifies the LSE mode. |
NYX | 0:85b3fd62ea1a | 2769 | * This parameter can be one of the following values: |
NYX | 0:85b3fd62ea1a | 2770 | * @arg RCC_LSE_LOWPOWER_MODE: LSE oscillator in low power mode selection |
NYX | 0:85b3fd62ea1a | 2771 | * @arg RCC_LSE_HIGHDRIVE_MODE: LSE oscillator in High Drive mode selection |
NYX | 0:85b3fd62ea1a | 2772 | * @retval None |
NYX | 0:85b3fd62ea1a | 2773 | */ |
NYX | 0:85b3fd62ea1a | 2774 | void HAL_RCCEx_SelectLSEMode(uint8_t Mode) |
NYX | 0:85b3fd62ea1a | 2775 | { |
NYX | 0:85b3fd62ea1a | 2776 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 2777 | assert_param(IS_RCC_LSE_MODE(Mode)); |
NYX | 0:85b3fd62ea1a | 2778 | if(Mode == RCC_LSE_HIGHDRIVE_MODE) |
NYX | 0:85b3fd62ea1a | 2779 | { |
NYX | 0:85b3fd62ea1a | 2780 | SET_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); |
NYX | 0:85b3fd62ea1a | 2781 | } |
NYX | 0:85b3fd62ea1a | 2782 | else |
NYX | 0:85b3fd62ea1a | 2783 | { |
NYX | 0:85b3fd62ea1a | 2784 | CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); |
NYX | 0:85b3fd62ea1a | 2785 | } |
NYX | 0:85b3fd62ea1a | 2786 | } |
NYX | 0:85b3fd62ea1a | 2787 | |
NYX | 0:85b3fd62ea1a | 2788 | #endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ |
NYX | 0:85b3fd62ea1a | 2789 | |
NYX | 0:85b3fd62ea1a | 2790 | #if defined(STM32F446xx) |
NYX | 0:85b3fd62ea1a | 2791 | /** |
NYX | 0:85b3fd62ea1a | 2792 | * @brief Returns the SYSCLK frequency |
NYX | 0:85b3fd62ea1a | 2793 | * |
NYX | 0:85b3fd62ea1a | 2794 | * @note This function implementation is valid only for STM32F446xx devices. |
NYX | 0:85b3fd62ea1a | 2795 | * @note This function add the PLL/PLLR System clock source |
NYX | 0:85b3fd62ea1a | 2796 | * |
NYX | 0:85b3fd62ea1a | 2797 | * @note The system frequency computed by this function is not the real |
NYX | 0:85b3fd62ea1a | 2798 | * frequency in the chip. It is calculated based on the predefined |
NYX | 0:85b3fd62ea1a | 2799 | * constant and the selected clock source: |
NYX | 0:85b3fd62ea1a | 2800 | * @note If SYSCLK source is HSI, function returns values based on HSI_VALUE(*) |
NYX | 0:85b3fd62ea1a | 2801 | * @note If SYSCLK source is HSE, function returns values based on HSE_VALUE(**) |
NYX | 0:85b3fd62ea1a | 2802 | * @note If SYSCLK source is PLL or PLLR, function returns values based on HSE_VALUE(**) |
NYX | 0:85b3fd62ea1a | 2803 | * or HSI_VALUE(*) multiplied/divided by the PLL factors. |
NYX | 0:85b3fd62ea1a | 2804 | * @note (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value |
NYX | 0:85b3fd62ea1a | 2805 | * 16 MHz) but the real value may vary depending on the variations |
NYX | 0:85b3fd62ea1a | 2806 | * in voltage and temperature. |
NYX | 0:85b3fd62ea1a | 2807 | * @note (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value |
NYX | 0:85b3fd62ea1a | 2808 | * 25 MHz), user has to ensure that HSE_VALUE is same as the real |
NYX | 0:85b3fd62ea1a | 2809 | * frequency of the crystal used. Otherwise, this function may |
NYX | 0:85b3fd62ea1a | 2810 | * have wrong result. |
NYX | 0:85b3fd62ea1a | 2811 | * |
NYX | 0:85b3fd62ea1a | 2812 | * @note The result of this function could be not correct when using fractional |
NYX | 0:85b3fd62ea1a | 2813 | * value for HSE crystal. |
NYX | 0:85b3fd62ea1a | 2814 | * |
NYX | 0:85b3fd62ea1a | 2815 | * @note This function can be used by the user application to compute the |
NYX | 0:85b3fd62ea1a | 2816 | * baudrate for the communication peripherals or configure other parameters. |
NYX | 0:85b3fd62ea1a | 2817 | * |
NYX | 0:85b3fd62ea1a | 2818 | * @note Each time SYSCLK changes, this function must be called to update the |
NYX | 0:85b3fd62ea1a | 2819 | * right SYSCLK value. Otherwise, any configuration based on this function will be incorrect. |
NYX | 0:85b3fd62ea1a | 2820 | * |
NYX | 0:85b3fd62ea1a | 2821 | * |
NYX | 0:85b3fd62ea1a | 2822 | * @retval SYSCLK frequency |
NYX | 0:85b3fd62ea1a | 2823 | */ |
NYX | 0:85b3fd62ea1a | 2824 | uint32_t HAL_RCC_GetSysClockFreq(void) |
NYX | 0:85b3fd62ea1a | 2825 | { |
NYX | 0:85b3fd62ea1a | 2826 | uint32_t pllm = 0U; |
NYX | 0:85b3fd62ea1a | 2827 | uint32_t pllvco = 0U; |
NYX | 0:85b3fd62ea1a | 2828 | uint32_t pllp = 0U; |
NYX | 0:85b3fd62ea1a | 2829 | uint32_t pllr = 0U; |
NYX | 0:85b3fd62ea1a | 2830 | uint32_t sysclockfreq = 0U; |
NYX | 0:85b3fd62ea1a | 2831 | |
NYX | 0:85b3fd62ea1a | 2832 | /* Get SYSCLK source -------------------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 2833 | switch (RCC->CFGR & RCC_CFGR_SWS) |
NYX | 0:85b3fd62ea1a | 2834 | { |
NYX | 0:85b3fd62ea1a | 2835 | case RCC_CFGR_SWS_HSI: /* HSI used as system clock source */ |
NYX | 0:85b3fd62ea1a | 2836 | { |
NYX | 0:85b3fd62ea1a | 2837 | sysclockfreq = HSI_VALUE; |
NYX | 0:85b3fd62ea1a | 2838 | break; |
NYX | 0:85b3fd62ea1a | 2839 | } |
NYX | 0:85b3fd62ea1a | 2840 | case RCC_CFGR_SWS_HSE: /* HSE used as system clock source */ |
NYX | 0:85b3fd62ea1a | 2841 | { |
NYX | 0:85b3fd62ea1a | 2842 | sysclockfreq = HSE_VALUE; |
NYX | 0:85b3fd62ea1a | 2843 | break; |
NYX | 0:85b3fd62ea1a | 2844 | } |
NYX | 0:85b3fd62ea1a | 2845 | case RCC_CFGR_SWS_PLL: /* PLL/PLLP used as system clock source */ |
NYX | 0:85b3fd62ea1a | 2846 | { |
NYX | 0:85b3fd62ea1a | 2847 | /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN |
NYX | 0:85b3fd62ea1a | 2848 | SYSCLK = PLL_VCO / PLLP */ |
NYX | 0:85b3fd62ea1a | 2849 | pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; |
NYX | 0:85b3fd62ea1a | 2850 | if(__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) |
NYX | 0:85b3fd62ea1a | 2851 | { |
NYX | 0:85b3fd62ea1a | 2852 | /* HSE used as PLL clock source */ |
NYX | 0:85b3fd62ea1a | 2853 | pllvco = ((HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> POSITION_VAL(RCC_PLLCFGR_PLLN))); |
NYX | 0:85b3fd62ea1a | 2854 | } |
NYX | 0:85b3fd62ea1a | 2855 | else |
NYX | 0:85b3fd62ea1a | 2856 | { |
NYX | 0:85b3fd62ea1a | 2857 | /* HSI used as PLL clock source */ |
NYX | 0:85b3fd62ea1a | 2858 | pllvco = ((HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> POSITION_VAL(RCC_PLLCFGR_PLLN))); |
NYX | 0:85b3fd62ea1a | 2859 | } |
NYX | 0:85b3fd62ea1a | 2860 | pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> POSITION_VAL(RCC_PLLCFGR_PLLP)) + 1U) *2U); |
NYX | 0:85b3fd62ea1a | 2861 | |
NYX | 0:85b3fd62ea1a | 2862 | sysclockfreq = pllvco/pllp; |
NYX | 0:85b3fd62ea1a | 2863 | break; |
NYX | 0:85b3fd62ea1a | 2864 | } |
NYX | 0:85b3fd62ea1a | 2865 | case RCC_CFGR_SWS_PLLR: /* PLL/PLLR used as system clock source */ |
NYX | 0:85b3fd62ea1a | 2866 | { |
NYX | 0:85b3fd62ea1a | 2867 | /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN |
NYX | 0:85b3fd62ea1a | 2868 | SYSCLK = PLL_VCO / PLLR */ |
NYX | 0:85b3fd62ea1a | 2869 | pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; |
NYX | 0:85b3fd62ea1a | 2870 | if(__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) |
NYX | 0:85b3fd62ea1a | 2871 | { |
NYX | 0:85b3fd62ea1a | 2872 | /* HSE used as PLL clock source */ |
NYX | 0:85b3fd62ea1a | 2873 | pllvco = ((HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> POSITION_VAL(RCC_PLLCFGR_PLLN))); |
NYX | 0:85b3fd62ea1a | 2874 | } |
NYX | 0:85b3fd62ea1a | 2875 | else |
NYX | 0:85b3fd62ea1a | 2876 | { |
NYX | 0:85b3fd62ea1a | 2877 | /* HSI used as PLL clock source */ |
NYX | 0:85b3fd62ea1a | 2878 | pllvco = ((HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> POSITION_VAL(RCC_PLLCFGR_PLLN))); |
NYX | 0:85b3fd62ea1a | 2879 | } |
NYX | 0:85b3fd62ea1a | 2880 | pllr = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> POSITION_VAL(RCC_PLLCFGR_PLLR)); |
NYX | 0:85b3fd62ea1a | 2881 | |
NYX | 0:85b3fd62ea1a | 2882 | sysclockfreq = pllvco/pllr; |
NYX | 0:85b3fd62ea1a | 2883 | break; |
NYX | 0:85b3fd62ea1a | 2884 | } |
NYX | 0:85b3fd62ea1a | 2885 | default: |
NYX | 0:85b3fd62ea1a | 2886 | { |
NYX | 0:85b3fd62ea1a | 2887 | sysclockfreq = HSI_VALUE; |
NYX | 0:85b3fd62ea1a | 2888 | break; |
NYX | 0:85b3fd62ea1a | 2889 | } |
NYX | 0:85b3fd62ea1a | 2890 | } |
NYX | 0:85b3fd62ea1a | 2891 | return sysclockfreq; |
NYX | 0:85b3fd62ea1a | 2892 | } |
NYX | 0:85b3fd62ea1a | 2893 | #endif /* STM32F446xx */ |
NYX | 0:85b3fd62ea1a | 2894 | |
NYX | 0:85b3fd62ea1a | 2895 | /** |
NYX | 0:85b3fd62ea1a | 2896 | * @} |
NYX | 0:85b3fd62ea1a | 2897 | */ |
NYX | 0:85b3fd62ea1a | 2898 | |
NYX | 0:85b3fd62ea1a | 2899 | /** |
NYX | 0:85b3fd62ea1a | 2900 | * @} |
NYX | 0:85b3fd62ea1a | 2901 | */ |
NYX | 0:85b3fd62ea1a | 2902 | |
NYX | 0:85b3fd62ea1a | 2903 | #if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ |
NYX | 0:85b3fd62ea1a | 2904 | defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ |
NYX | 0:85b3fd62ea1a | 2905 | defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ |
NYX | 0:85b3fd62ea1a | 2906 | defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ |
NYX | 0:85b3fd62ea1a | 2907 | defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) |
NYX | 0:85b3fd62ea1a | 2908 | /** |
NYX | 0:85b3fd62ea1a | 2909 | * @brief Resets the RCC clock configuration to the default reset state. |
NYX | 0:85b3fd62ea1a | 2910 | * @note The default reset state of the clock configuration is given below: |
NYX | 0:85b3fd62ea1a | 2911 | * - HSI ON and used as system clock source |
NYX | 0:85b3fd62ea1a | 2912 | * - HSE, PLL, PLLI2S and PLLSAI OFF |
NYX | 0:85b3fd62ea1a | 2913 | * - AHB, APB1 and APB2 prescaler set to 1. |
NYX | 0:85b3fd62ea1a | 2914 | * - CSS, MCO1 and MCO2 OFF |
NYX | 0:85b3fd62ea1a | 2915 | * - All interrupts disabled |
NYX | 0:85b3fd62ea1a | 2916 | * @note This function doesn't modify the configuration of the |
NYX | 0:85b3fd62ea1a | 2917 | * - Peripheral clocks |
NYX | 0:85b3fd62ea1a | 2918 | * - LSI, LSE and RTC clocks |
NYX | 0:85b3fd62ea1a | 2919 | * @retval None |
NYX | 0:85b3fd62ea1a | 2920 | */ |
NYX | 0:85b3fd62ea1a | 2921 | void HAL_RCC_DeInit(void) |
NYX | 0:85b3fd62ea1a | 2922 | { |
NYX | 0:85b3fd62ea1a | 2923 | /* Set HSION bit */ |
NYX | 0:85b3fd62ea1a | 2924 | SET_BIT(RCC->CR, RCC_CR_HSION | RCC_CR_HSITRIM_4); |
NYX | 0:85b3fd62ea1a | 2925 | |
NYX | 0:85b3fd62ea1a | 2926 | /* Reset CFGR register */ |
NYX | 0:85b3fd62ea1a | 2927 | CLEAR_REG(RCC->CFGR); |
NYX | 0:85b3fd62ea1a | 2928 | |
NYX | 0:85b3fd62ea1a | 2929 | /* Reset HSEON, CSSON, PLLON, PLLI2S bits */ |
NYX | 0:85b3fd62ea1a | 2930 | CLEAR_BIT(RCC->CR, RCC_CR_HSEON | RCC_CR_HSEBYP | RCC_CR_CSSON | RCC_CR_PLLON | RCC_CR_PLLI2SON); |
NYX | 0:85b3fd62ea1a | 2931 | |
NYX | 0:85b3fd62ea1a | 2932 | #if defined(STM32F427xx) || defined(STM32F429xx) || defined(STM32F437xx) || defined(STM32F439xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) |
NYX | 0:85b3fd62ea1a | 2933 | /* Reset PLLSAI bit */ |
NYX | 0:85b3fd62ea1a | 2934 | CLEAR_BIT(RCC->CR, RCC_CR_PLLSAION); |
NYX | 0:85b3fd62ea1a | 2935 | #endif /* STM32F427xx || STM32F429xx || STM32F437xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ |
NYX | 0:85b3fd62ea1a | 2936 | |
NYX | 0:85b3fd62ea1a | 2937 | /* Reset PLLCFGR register */ |
NYX | 0:85b3fd62ea1a | 2938 | CLEAR_REG(RCC->PLLCFGR); |
NYX | 0:85b3fd62ea1a | 2939 | #if defined(STM32F412Cx) || defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || \ |
NYX | 0:85b3fd62ea1a | 2940 | defined(STM32F423xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) |
NYX | 0:85b3fd62ea1a | 2941 | SET_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_2 | RCC_PLLCFGR_PLLR_1); |
NYX | 0:85b3fd62ea1a | 2942 | #else |
NYX | 0:85b3fd62ea1a | 2943 | SET_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_2); |
NYX | 0:85b3fd62ea1a | 2944 | #endif /* STM32F412Cx || STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx || STM32F446xx || STM32F469xx || STM32F479xx */ |
NYX | 0:85b3fd62ea1a | 2945 | |
NYX | 0:85b3fd62ea1a | 2946 | /* Reset PLLI2SCFGR register */ |
NYX | 0:85b3fd62ea1a | 2947 | CLEAR_REG(RCC->PLLI2SCFGR); |
NYX | 0:85b3fd62ea1a | 2948 | #if defined(STM32F412Cx) || defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || \ |
NYX | 0:85b3fd62ea1a | 2949 | defined(STM32F423xx) || defined(STM32F446xx) |
NYX | 0:85b3fd62ea1a | 2950 | SET_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SR_1); |
NYX | 0:85b3fd62ea1a | 2951 | #elif defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) |
NYX | 0:85b3fd62ea1a | 2952 | SET_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SR_1); |
NYX | 0:85b3fd62ea1a | 2953 | #elif defined(STM32F411xE) |
NYX | 0:85b3fd62ea1a | 2954 | SET_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SR_1); |
NYX | 0:85b3fd62ea1a | 2955 | #else |
NYX | 0:85b3fd62ea1a | 2956 | SET_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SR_1); |
NYX | 0:85b3fd62ea1a | 2957 | #endif /* STM32F412Cx || STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx || STM32F446xx */ |
NYX | 0:85b3fd62ea1a | 2958 | |
NYX | 0:85b3fd62ea1a | 2959 | /* Reset PLLSAICFGR register */ |
NYX | 0:85b3fd62ea1a | 2960 | #if defined(STM32F427xx) || defined(STM32F429xx) || defined(STM32F437xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) |
NYX | 0:85b3fd62ea1a | 2961 | CLEAR_REG(RCC->PLLSAICFGR); |
NYX | 0:85b3fd62ea1a | 2962 | SET_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIN_6 | RCC_PLLSAICFGR_PLLSAIN_7 | RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIR_1); |
NYX | 0:85b3fd62ea1a | 2963 | #elif defined(STM32F446xx) |
NYX | 0:85b3fd62ea1a | 2964 | CLEAR_REG(RCC->PLLSAICFGR); |
NYX | 0:85b3fd62ea1a | 2965 | SET_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIN_6 | RCC_PLLSAICFGR_PLLSAIN_7 | RCC_PLLSAICFGR_PLLSAIQ_2); |
NYX | 0:85b3fd62ea1a | 2966 | #endif /* STM32F427xx || STM32F429xx || STM32F437xx || STM32F439xx || STM32F469xx || STM32F479xx */ |
NYX | 0:85b3fd62ea1a | 2967 | |
NYX | 0:85b3fd62ea1a | 2968 | /* Disable all interrupts */ |
NYX | 0:85b3fd62ea1a | 2969 | CLEAR_REG(RCC->CIR); |
NYX | 0:85b3fd62ea1a | 2970 | |
NYX | 0:85b3fd62ea1a | 2971 | /* Update the SystemCoreClock global variable */ |
NYX | 0:85b3fd62ea1a | 2972 | SystemCoreClock = HSI_VALUE; |
NYX | 0:85b3fd62ea1a | 2973 | } |
NYX | 0:85b3fd62ea1a | 2974 | #endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || |
NYX | 0:85b3fd62ea1a | 2975 | STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || |
NYX | 0:85b3fd62ea1a | 2976 | STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ |
NYX | 0:85b3fd62ea1a | 2977 | |
NYX | 0:85b3fd62ea1a | 2978 | #if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) |
NYX | 0:85b3fd62ea1a | 2979 | /** |
NYX | 0:85b3fd62ea1a | 2980 | * @brief Resets the RCC clock configuration to the default reset state. |
NYX | 0:85b3fd62ea1a | 2981 | * @note The default reset state of the clock configuration is given below: |
NYX | 0:85b3fd62ea1a | 2982 | * - HSI ON and used as system clock source |
NYX | 0:85b3fd62ea1a | 2983 | * - HSE and PLL OFF |
NYX | 0:85b3fd62ea1a | 2984 | * - AHB, APB1 and APB2 prescaler set to 1. |
NYX | 0:85b3fd62ea1a | 2985 | * - CSS, MCO1 and MCO2 OFF |
NYX | 0:85b3fd62ea1a | 2986 | * - All interrupts disabled |
NYX | 0:85b3fd62ea1a | 2987 | * @note This function doesn't modify the configuration of the |
NYX | 0:85b3fd62ea1a | 2988 | * - Peripheral clocks |
NYX | 0:85b3fd62ea1a | 2989 | * - LSI, LSE and RTC clocks |
NYX | 0:85b3fd62ea1a | 2990 | * @retval None |
NYX | 0:85b3fd62ea1a | 2991 | */ |
NYX | 0:85b3fd62ea1a | 2992 | void HAL_RCC_DeInit(void) |
NYX | 0:85b3fd62ea1a | 2993 | { |
NYX | 0:85b3fd62ea1a | 2994 | /* Set HSION bit */ |
NYX | 0:85b3fd62ea1a | 2995 | SET_BIT(RCC->CR, RCC_CR_HSION | RCC_CR_HSITRIM_4); |
NYX | 0:85b3fd62ea1a | 2996 | |
NYX | 0:85b3fd62ea1a | 2997 | /* Reset CFGR register */ |
NYX | 0:85b3fd62ea1a | 2998 | CLEAR_REG(RCC->CFGR); |
NYX | 0:85b3fd62ea1a | 2999 | |
NYX | 0:85b3fd62ea1a | 3000 | /* Reset HSEON, HSEBYP, CSSON, PLLON */ |
NYX | 0:85b3fd62ea1a | 3001 | CLEAR_BIT(RCC->CR, RCC_CR_HSEON | RCC_CR_HSEBYP | RCC_CR_CSSON | RCC_CR_PLLON); |
NYX | 0:85b3fd62ea1a | 3002 | |
NYX | 0:85b3fd62ea1a | 3003 | /* Reset PLLCFGR register */ |
NYX | 0:85b3fd62ea1a | 3004 | CLEAR_REG(RCC->PLLCFGR); |
NYX | 0:85b3fd62ea1a | 3005 | SET_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLR_0 | RCC_PLLCFGR_PLLR_1 | RCC_PLLCFGR_PLLR_2 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_0 | RCC_PLLCFGR_PLLQ_1 | RCC_PLLCFGR_PLLQ_2 | RCC_PLLCFGR_PLLQ_3); |
NYX | 0:85b3fd62ea1a | 3006 | |
NYX | 0:85b3fd62ea1a | 3007 | /* Disable all interrupts */ |
NYX | 0:85b3fd62ea1a | 3008 | CLEAR_REG(RCC->CIR); |
NYX | 0:85b3fd62ea1a | 3009 | |
NYX | 0:85b3fd62ea1a | 3010 | /* Update the SystemCoreClock global variable */ |
NYX | 0:85b3fd62ea1a | 3011 | SystemCoreClock = HSI_VALUE; |
NYX | 0:85b3fd62ea1a | 3012 | } |
NYX | 0:85b3fd62ea1a | 3013 | #endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ |
NYX | 0:85b3fd62ea1a | 3014 | |
NYX | 0:85b3fd62ea1a | 3015 | #if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ |
NYX | 0:85b3fd62ea1a | 3016 | defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) |
NYX | 0:85b3fd62ea1a | 3017 | /** |
NYX | 0:85b3fd62ea1a | 3018 | * @brief Initializes the RCC Oscillators according to the specified parameters in the |
NYX | 0:85b3fd62ea1a | 3019 | * RCC_OscInitTypeDef. |
NYX | 0:85b3fd62ea1a | 3020 | * @param RCC_OscInitStruct: pointer to an RCC_OscInitTypeDef structure that |
NYX | 0:85b3fd62ea1a | 3021 | * contains the configuration information for the RCC Oscillators. |
NYX | 0:85b3fd62ea1a | 3022 | * @note The PLL is not disabled when used as system clock. |
NYX | 0:85b3fd62ea1a | 3023 | * @note Transitions LSE Bypass to LSE On and LSE On to LSE Bypass are not |
NYX | 0:85b3fd62ea1a | 3024 | * supported by this API. User should request a transition to LSE Off |
NYX | 0:85b3fd62ea1a | 3025 | * first and then LSE On or LSE Bypass. |
NYX | 0:85b3fd62ea1a | 3026 | * @note Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not |
NYX | 0:85b3fd62ea1a | 3027 | * supported by this API. User should request a transition to HSE Off |
NYX | 0:85b3fd62ea1a | 3028 | * first and then HSE On or HSE Bypass. |
NYX | 0:85b3fd62ea1a | 3029 | * @note This function add the PLL/PLLR factor management during PLL configuration this feature |
NYX | 0:85b3fd62ea1a | 3030 | * is only available in STM32F410xx/STM32F446xx/STM32F469xx/STM32F479xx/STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx devices |
NYX | 0:85b3fd62ea1a | 3031 | * @retval HAL status |
NYX | 0:85b3fd62ea1a | 3032 | */ |
NYX | 0:85b3fd62ea1a | 3033 | HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) |
NYX | 0:85b3fd62ea1a | 3034 | { |
NYX | 0:85b3fd62ea1a | 3035 | uint32_t tickstart = 0U; |
NYX | 0:85b3fd62ea1a | 3036 | |
NYX | 0:85b3fd62ea1a | 3037 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 3038 | assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType)); |
NYX | 0:85b3fd62ea1a | 3039 | /*------------------------------- HSE Configuration ------------------------*/ |
NYX | 0:85b3fd62ea1a | 3040 | if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) |
NYX | 0:85b3fd62ea1a | 3041 | { |
NYX | 0:85b3fd62ea1a | 3042 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 3043 | assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState)); |
NYX | 0:85b3fd62ea1a | 3044 | /* When the HSE is used as system clock or clock source for PLL in these cases HSE will not disabled */ |
NYX | 0:85b3fd62ea1a | 3045 | #if defined(STM32F446xx) |
NYX | 0:85b3fd62ea1a | 3046 | if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSE) ||\ |
NYX | 0:85b3fd62ea1a | 3047 | ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE)) ||\ |
NYX | 0:85b3fd62ea1a | 3048 | ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLLR) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) |
NYX | 0:85b3fd62ea1a | 3049 | #else |
NYX | 0:85b3fd62ea1a | 3050 | if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSE) ||\ |
NYX | 0:85b3fd62ea1a | 3051 | ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) |
NYX | 0:85b3fd62ea1a | 3052 | #endif /* STM32F446xx */ |
NYX | 0:85b3fd62ea1a | 3053 | { |
NYX | 0:85b3fd62ea1a | 3054 | if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) |
NYX | 0:85b3fd62ea1a | 3055 | { |
NYX | 0:85b3fd62ea1a | 3056 | return HAL_ERROR; |
NYX | 0:85b3fd62ea1a | 3057 | } |
NYX | 0:85b3fd62ea1a | 3058 | } |
NYX | 0:85b3fd62ea1a | 3059 | else |
NYX | 0:85b3fd62ea1a | 3060 | { |
NYX | 0:85b3fd62ea1a | 3061 | /* Set the new HSE configuration ---------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 3062 | __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState); |
NYX | 0:85b3fd62ea1a | 3063 | |
NYX | 0:85b3fd62ea1a | 3064 | /* Check the HSE State */ |
NYX | 0:85b3fd62ea1a | 3065 | if((RCC_OscInitStruct->HSEState) != RCC_HSE_OFF) |
NYX | 0:85b3fd62ea1a | 3066 | { |
NYX | 0:85b3fd62ea1a | 3067 | /* Get Start Tick*/ |
NYX | 0:85b3fd62ea1a | 3068 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 3069 | |
NYX | 0:85b3fd62ea1a | 3070 | /* Wait till HSE is ready */ |
NYX | 0:85b3fd62ea1a | 3071 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) |
NYX | 0:85b3fd62ea1a | 3072 | { |
NYX | 0:85b3fd62ea1a | 3073 | if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 3074 | { |
NYX | 0:85b3fd62ea1a | 3075 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 3076 | } |
NYX | 0:85b3fd62ea1a | 3077 | } |
NYX | 0:85b3fd62ea1a | 3078 | } |
NYX | 0:85b3fd62ea1a | 3079 | else |
NYX | 0:85b3fd62ea1a | 3080 | { |
NYX | 0:85b3fd62ea1a | 3081 | /* Get Start Tick*/ |
NYX | 0:85b3fd62ea1a | 3082 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 3083 | |
NYX | 0:85b3fd62ea1a | 3084 | /* Wait till HSE is bypassed or disabled */ |
NYX | 0:85b3fd62ea1a | 3085 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) |
NYX | 0:85b3fd62ea1a | 3086 | { |
NYX | 0:85b3fd62ea1a | 3087 | if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 3088 | { |
NYX | 0:85b3fd62ea1a | 3089 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 3090 | } |
NYX | 0:85b3fd62ea1a | 3091 | } |
NYX | 0:85b3fd62ea1a | 3092 | } |
NYX | 0:85b3fd62ea1a | 3093 | } |
NYX | 0:85b3fd62ea1a | 3094 | } |
NYX | 0:85b3fd62ea1a | 3095 | /*----------------------------- HSI Configuration --------------------------*/ |
NYX | 0:85b3fd62ea1a | 3096 | if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) |
NYX | 0:85b3fd62ea1a | 3097 | { |
NYX | 0:85b3fd62ea1a | 3098 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 3099 | assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState)); |
NYX | 0:85b3fd62ea1a | 3100 | assert_param(IS_RCC_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue)); |
NYX | 0:85b3fd62ea1a | 3101 | |
NYX | 0:85b3fd62ea1a | 3102 | /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock */ |
NYX | 0:85b3fd62ea1a | 3103 | #if defined(STM32F446xx) |
NYX | 0:85b3fd62ea1a | 3104 | if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSI) ||\ |
NYX | 0:85b3fd62ea1a | 3105 | ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI)) ||\ |
NYX | 0:85b3fd62ea1a | 3106 | ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLLR) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) |
NYX | 0:85b3fd62ea1a | 3107 | #else |
NYX | 0:85b3fd62ea1a | 3108 | if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSI) ||\ |
NYX | 0:85b3fd62ea1a | 3109 | ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) |
NYX | 0:85b3fd62ea1a | 3110 | #endif /* STM32F446xx */ |
NYX | 0:85b3fd62ea1a | 3111 | { |
NYX | 0:85b3fd62ea1a | 3112 | /* When HSI is used as system clock it will not disabled */ |
NYX | 0:85b3fd62ea1a | 3113 | if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) |
NYX | 0:85b3fd62ea1a | 3114 | { |
NYX | 0:85b3fd62ea1a | 3115 | return HAL_ERROR; |
NYX | 0:85b3fd62ea1a | 3116 | } |
NYX | 0:85b3fd62ea1a | 3117 | /* Otherwise, just the calibration is allowed */ |
NYX | 0:85b3fd62ea1a | 3118 | else |
NYX | 0:85b3fd62ea1a | 3119 | { |
NYX | 0:85b3fd62ea1a | 3120 | /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ |
NYX | 0:85b3fd62ea1a | 3121 | __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); |
NYX | 0:85b3fd62ea1a | 3122 | } |
NYX | 0:85b3fd62ea1a | 3123 | } |
NYX | 0:85b3fd62ea1a | 3124 | else |
NYX | 0:85b3fd62ea1a | 3125 | { |
NYX | 0:85b3fd62ea1a | 3126 | /* Check the HSI State */ |
NYX | 0:85b3fd62ea1a | 3127 | if((RCC_OscInitStruct->HSIState)!= RCC_HSI_OFF) |
NYX | 0:85b3fd62ea1a | 3128 | { |
NYX | 0:85b3fd62ea1a | 3129 | /* Enable the Internal High Speed oscillator (HSI). */ |
NYX | 0:85b3fd62ea1a | 3130 | __HAL_RCC_HSI_ENABLE(); |
NYX | 0:85b3fd62ea1a | 3131 | |
NYX | 0:85b3fd62ea1a | 3132 | /* Get Start Tick*/ |
NYX | 0:85b3fd62ea1a | 3133 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 3134 | |
NYX | 0:85b3fd62ea1a | 3135 | /* Wait till HSI is ready */ |
NYX | 0:85b3fd62ea1a | 3136 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) |
NYX | 0:85b3fd62ea1a | 3137 | { |
NYX | 0:85b3fd62ea1a | 3138 | if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 3139 | { |
NYX | 0:85b3fd62ea1a | 3140 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 3141 | } |
NYX | 0:85b3fd62ea1a | 3142 | } |
NYX | 0:85b3fd62ea1a | 3143 | |
NYX | 0:85b3fd62ea1a | 3144 | /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ |
NYX | 0:85b3fd62ea1a | 3145 | __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); |
NYX | 0:85b3fd62ea1a | 3146 | } |
NYX | 0:85b3fd62ea1a | 3147 | else |
NYX | 0:85b3fd62ea1a | 3148 | { |
NYX | 0:85b3fd62ea1a | 3149 | /* Disable the Internal High Speed oscillator (HSI). */ |
NYX | 0:85b3fd62ea1a | 3150 | __HAL_RCC_HSI_DISABLE(); |
NYX | 0:85b3fd62ea1a | 3151 | |
NYX | 0:85b3fd62ea1a | 3152 | /* Get Start Tick*/ |
NYX | 0:85b3fd62ea1a | 3153 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 3154 | |
NYX | 0:85b3fd62ea1a | 3155 | /* Wait till HSI is ready */ |
NYX | 0:85b3fd62ea1a | 3156 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) |
NYX | 0:85b3fd62ea1a | 3157 | { |
NYX | 0:85b3fd62ea1a | 3158 | if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 3159 | { |
NYX | 0:85b3fd62ea1a | 3160 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 3161 | } |
NYX | 0:85b3fd62ea1a | 3162 | } |
NYX | 0:85b3fd62ea1a | 3163 | } |
NYX | 0:85b3fd62ea1a | 3164 | } |
NYX | 0:85b3fd62ea1a | 3165 | } |
NYX | 0:85b3fd62ea1a | 3166 | /*------------------------------ LSI Configuration -------------------------*/ |
NYX | 0:85b3fd62ea1a | 3167 | if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) |
NYX | 0:85b3fd62ea1a | 3168 | { |
NYX | 0:85b3fd62ea1a | 3169 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 3170 | assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState)); |
NYX | 0:85b3fd62ea1a | 3171 | |
NYX | 0:85b3fd62ea1a | 3172 | /* Check the LSI State */ |
NYX | 0:85b3fd62ea1a | 3173 | if((RCC_OscInitStruct->LSIState)!= RCC_LSI_OFF) |
NYX | 0:85b3fd62ea1a | 3174 | { |
NYX | 0:85b3fd62ea1a | 3175 | /* Enable the Internal Low Speed oscillator (LSI). */ |
NYX | 0:85b3fd62ea1a | 3176 | __HAL_RCC_LSI_ENABLE(); |
NYX | 0:85b3fd62ea1a | 3177 | |
NYX | 0:85b3fd62ea1a | 3178 | /* Get Start Tick*/ |
NYX | 0:85b3fd62ea1a | 3179 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 3180 | |
NYX | 0:85b3fd62ea1a | 3181 | /* Wait till LSI is ready */ |
NYX | 0:85b3fd62ea1a | 3182 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) |
NYX | 0:85b3fd62ea1a | 3183 | { |
NYX | 0:85b3fd62ea1a | 3184 | if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 3185 | { |
NYX | 0:85b3fd62ea1a | 3186 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 3187 | } |
NYX | 0:85b3fd62ea1a | 3188 | } |
NYX | 0:85b3fd62ea1a | 3189 | } |
NYX | 0:85b3fd62ea1a | 3190 | else |
NYX | 0:85b3fd62ea1a | 3191 | { |
NYX | 0:85b3fd62ea1a | 3192 | /* Disable the Internal Low Speed oscillator (LSI). */ |
NYX | 0:85b3fd62ea1a | 3193 | __HAL_RCC_LSI_DISABLE(); |
NYX | 0:85b3fd62ea1a | 3194 | |
NYX | 0:85b3fd62ea1a | 3195 | /* Get Start Tick*/ |
NYX | 0:85b3fd62ea1a | 3196 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 3197 | |
NYX | 0:85b3fd62ea1a | 3198 | /* Wait till LSI is ready */ |
NYX | 0:85b3fd62ea1a | 3199 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) |
NYX | 0:85b3fd62ea1a | 3200 | { |
NYX | 0:85b3fd62ea1a | 3201 | if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 3202 | { |
NYX | 0:85b3fd62ea1a | 3203 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 3204 | } |
NYX | 0:85b3fd62ea1a | 3205 | } |
NYX | 0:85b3fd62ea1a | 3206 | } |
NYX | 0:85b3fd62ea1a | 3207 | } |
NYX | 0:85b3fd62ea1a | 3208 | /*------------------------------ LSE Configuration -------------------------*/ |
NYX | 0:85b3fd62ea1a | 3209 | if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) |
NYX | 0:85b3fd62ea1a | 3210 | { |
NYX | 0:85b3fd62ea1a | 3211 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 3212 | assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState)); |
NYX | 0:85b3fd62ea1a | 3213 | |
NYX | 0:85b3fd62ea1a | 3214 | /* Enable Power Clock*/ |
NYX | 0:85b3fd62ea1a | 3215 | __HAL_RCC_PWR_CLK_ENABLE(); |
NYX | 0:85b3fd62ea1a | 3216 | |
NYX | 0:85b3fd62ea1a | 3217 | /* Enable write access to Backup domain */ |
NYX | 0:85b3fd62ea1a | 3218 | PWR->CR |= PWR_CR_DBP; |
NYX | 0:85b3fd62ea1a | 3219 | |
NYX | 0:85b3fd62ea1a | 3220 | /* Wait for Backup domain Write protection disable */ |
NYX | 0:85b3fd62ea1a | 3221 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 3222 | |
NYX | 0:85b3fd62ea1a | 3223 | while((PWR->CR & PWR_CR_DBP) == RESET) |
NYX | 0:85b3fd62ea1a | 3224 | { |
NYX | 0:85b3fd62ea1a | 3225 | if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 3226 | { |
NYX | 0:85b3fd62ea1a | 3227 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 3228 | } |
NYX | 0:85b3fd62ea1a | 3229 | } |
NYX | 0:85b3fd62ea1a | 3230 | |
NYX | 0:85b3fd62ea1a | 3231 | /* Set the new LSE configuration -----------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 3232 | __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState); |
NYX | 0:85b3fd62ea1a | 3233 | /* Check the LSE State */ |
NYX | 0:85b3fd62ea1a | 3234 | if((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) |
NYX | 0:85b3fd62ea1a | 3235 | { |
NYX | 0:85b3fd62ea1a | 3236 | /* Get Start Tick*/ |
NYX | 0:85b3fd62ea1a | 3237 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 3238 | |
NYX | 0:85b3fd62ea1a | 3239 | /* Wait till LSE is ready */ |
NYX | 0:85b3fd62ea1a | 3240 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) |
NYX | 0:85b3fd62ea1a | 3241 | { |
NYX | 0:85b3fd62ea1a | 3242 | if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 3243 | { |
NYX | 0:85b3fd62ea1a | 3244 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 3245 | } |
NYX | 0:85b3fd62ea1a | 3246 | } |
NYX | 0:85b3fd62ea1a | 3247 | } |
NYX | 0:85b3fd62ea1a | 3248 | else |
NYX | 0:85b3fd62ea1a | 3249 | { |
NYX | 0:85b3fd62ea1a | 3250 | /* Get Start Tick*/ |
NYX | 0:85b3fd62ea1a | 3251 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 3252 | |
NYX | 0:85b3fd62ea1a | 3253 | /* Wait till LSE is ready */ |
NYX | 0:85b3fd62ea1a | 3254 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) |
NYX | 0:85b3fd62ea1a | 3255 | { |
NYX | 0:85b3fd62ea1a | 3256 | if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 3257 | { |
NYX | 0:85b3fd62ea1a | 3258 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 3259 | } |
NYX | 0:85b3fd62ea1a | 3260 | } |
NYX | 0:85b3fd62ea1a | 3261 | } |
NYX | 0:85b3fd62ea1a | 3262 | } |
NYX | 0:85b3fd62ea1a | 3263 | /*-------------------------------- PLL Configuration -----------------------*/ |
NYX | 0:85b3fd62ea1a | 3264 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 3265 | assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState)); |
NYX | 0:85b3fd62ea1a | 3266 | if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE) |
NYX | 0:85b3fd62ea1a | 3267 | { |
NYX | 0:85b3fd62ea1a | 3268 | /* Check if the PLL is used as system clock or not */ |
NYX | 0:85b3fd62ea1a | 3269 | if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) |
NYX | 0:85b3fd62ea1a | 3270 | { |
NYX | 0:85b3fd62ea1a | 3271 | if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) |
NYX | 0:85b3fd62ea1a | 3272 | { |
NYX | 0:85b3fd62ea1a | 3273 | /* Check the parameters */ |
NYX | 0:85b3fd62ea1a | 3274 | assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource)); |
NYX | 0:85b3fd62ea1a | 3275 | assert_param(IS_RCC_PLLM_VALUE(RCC_OscInitStruct->PLL.PLLM)); |
NYX | 0:85b3fd62ea1a | 3276 | assert_param(IS_RCC_PLLN_VALUE(RCC_OscInitStruct->PLL.PLLN)); |
NYX | 0:85b3fd62ea1a | 3277 | assert_param(IS_RCC_PLLP_VALUE(RCC_OscInitStruct->PLL.PLLP)); |
NYX | 0:85b3fd62ea1a | 3278 | assert_param(IS_RCC_PLLQ_VALUE(RCC_OscInitStruct->PLL.PLLQ)); |
NYX | 0:85b3fd62ea1a | 3279 | assert_param(IS_RCC_PLLR_VALUE(RCC_OscInitStruct->PLL.PLLR)); |
NYX | 0:85b3fd62ea1a | 3280 | |
NYX | 0:85b3fd62ea1a | 3281 | /* Disable the main PLL. */ |
NYX | 0:85b3fd62ea1a | 3282 | __HAL_RCC_PLL_DISABLE(); |
NYX | 0:85b3fd62ea1a | 3283 | |
NYX | 0:85b3fd62ea1a | 3284 | /* Get Start Tick*/ |
NYX | 0:85b3fd62ea1a | 3285 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 3286 | |
NYX | 0:85b3fd62ea1a | 3287 | /* Wait till PLL is ready */ |
NYX | 0:85b3fd62ea1a | 3288 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) |
NYX | 0:85b3fd62ea1a | 3289 | { |
NYX | 0:85b3fd62ea1a | 3290 | if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 3291 | { |
NYX | 0:85b3fd62ea1a | 3292 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 3293 | } |
NYX | 0:85b3fd62ea1a | 3294 | } |
NYX | 0:85b3fd62ea1a | 3295 | |
NYX | 0:85b3fd62ea1a | 3296 | /* Configure the main PLL clock source, multiplication and division factors. */ |
NYX | 0:85b3fd62ea1a | 3297 | __HAL_RCC_PLL_CONFIG(RCC_OscInitStruct->PLL.PLLSource, |
NYX | 0:85b3fd62ea1a | 3298 | RCC_OscInitStruct->PLL.PLLM, |
NYX | 0:85b3fd62ea1a | 3299 | RCC_OscInitStruct->PLL.PLLN, |
NYX | 0:85b3fd62ea1a | 3300 | RCC_OscInitStruct->PLL.PLLP, |
NYX | 0:85b3fd62ea1a | 3301 | RCC_OscInitStruct->PLL.PLLQ, |
NYX | 0:85b3fd62ea1a | 3302 | RCC_OscInitStruct->PLL.PLLR); |
NYX | 0:85b3fd62ea1a | 3303 | |
NYX | 0:85b3fd62ea1a | 3304 | /* Enable the main PLL. */ |
NYX | 0:85b3fd62ea1a | 3305 | __HAL_RCC_PLL_ENABLE(); |
NYX | 0:85b3fd62ea1a | 3306 | |
NYX | 0:85b3fd62ea1a | 3307 | /* Get Start Tick*/ |
NYX | 0:85b3fd62ea1a | 3308 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 3309 | |
NYX | 0:85b3fd62ea1a | 3310 | /* Wait till PLL is ready */ |
NYX | 0:85b3fd62ea1a | 3311 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) |
NYX | 0:85b3fd62ea1a | 3312 | { |
NYX | 0:85b3fd62ea1a | 3313 | if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 3314 | { |
NYX | 0:85b3fd62ea1a | 3315 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 3316 | } |
NYX | 0:85b3fd62ea1a | 3317 | } |
NYX | 0:85b3fd62ea1a | 3318 | } |
NYX | 0:85b3fd62ea1a | 3319 | else |
NYX | 0:85b3fd62ea1a | 3320 | { |
NYX | 0:85b3fd62ea1a | 3321 | /* Disable the main PLL. */ |
NYX | 0:85b3fd62ea1a | 3322 | __HAL_RCC_PLL_DISABLE(); |
NYX | 0:85b3fd62ea1a | 3323 | |
NYX | 0:85b3fd62ea1a | 3324 | /* Get Start Tick*/ |
NYX | 0:85b3fd62ea1a | 3325 | tickstart = HAL_GetTick(); |
NYX | 0:85b3fd62ea1a | 3326 | |
NYX | 0:85b3fd62ea1a | 3327 | /* Wait till PLL is ready */ |
NYX | 0:85b3fd62ea1a | 3328 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) |
NYX | 0:85b3fd62ea1a | 3329 | { |
NYX | 0:85b3fd62ea1a | 3330 | if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) |
NYX | 0:85b3fd62ea1a | 3331 | { |
NYX | 0:85b3fd62ea1a | 3332 | return HAL_TIMEOUT; |
NYX | 0:85b3fd62ea1a | 3333 | } |
NYX | 0:85b3fd62ea1a | 3334 | } |
NYX | 0:85b3fd62ea1a | 3335 | } |
NYX | 0:85b3fd62ea1a | 3336 | } |
NYX | 0:85b3fd62ea1a | 3337 | else |
NYX | 0:85b3fd62ea1a | 3338 | { |
NYX | 0:85b3fd62ea1a | 3339 | return HAL_ERROR; |
NYX | 0:85b3fd62ea1a | 3340 | } |
NYX | 0:85b3fd62ea1a | 3341 | } |
NYX | 0:85b3fd62ea1a | 3342 | return HAL_OK; |
NYX | 0:85b3fd62ea1a | 3343 | } |
NYX | 0:85b3fd62ea1a | 3344 | |
NYX | 0:85b3fd62ea1a | 3345 | /** |
NYX | 0:85b3fd62ea1a | 3346 | * @brief Configures the RCC_OscInitStruct according to the internal |
NYX | 0:85b3fd62ea1a | 3347 | * RCC configuration registers. |
NYX | 0:85b3fd62ea1a | 3348 | * @param RCC_OscInitStruct: pointer to an RCC_OscInitTypeDef structure that will be configured. |
NYX | 0:85b3fd62ea1a | 3349 | * |
NYX | 0:85b3fd62ea1a | 3350 | * @note This function is only available in case of STM32F410xx/STM32F446xx/STM32F469xx/STM32F479xx/STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx devices. |
NYX | 0:85b3fd62ea1a | 3351 | * @note This function add the PLL/PLLR factor management |
NYX | 0:85b3fd62ea1a | 3352 | * @retval None |
NYX | 0:85b3fd62ea1a | 3353 | */ |
NYX | 0:85b3fd62ea1a | 3354 | void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) |
NYX | 0:85b3fd62ea1a | 3355 | { |
NYX | 0:85b3fd62ea1a | 3356 | /* Set all possible values for the Oscillator type parameter ---------------*/ |
NYX | 0:85b3fd62ea1a | 3357 | RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI; |
NYX | 0:85b3fd62ea1a | 3358 | |
NYX | 0:85b3fd62ea1a | 3359 | /* Get the HSE configuration -----------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 3360 | if((RCC->CR &RCC_CR_HSEBYP) == RCC_CR_HSEBYP) |
NYX | 0:85b3fd62ea1a | 3361 | { |
NYX | 0:85b3fd62ea1a | 3362 | RCC_OscInitStruct->HSEState = RCC_HSE_BYPASS; |
NYX | 0:85b3fd62ea1a | 3363 | } |
NYX | 0:85b3fd62ea1a | 3364 | else if((RCC->CR &RCC_CR_HSEON) == RCC_CR_HSEON) |
NYX | 0:85b3fd62ea1a | 3365 | { |
NYX | 0:85b3fd62ea1a | 3366 | RCC_OscInitStruct->HSEState = RCC_HSE_ON; |
NYX | 0:85b3fd62ea1a | 3367 | } |
NYX | 0:85b3fd62ea1a | 3368 | else |
NYX | 0:85b3fd62ea1a | 3369 | { |
NYX | 0:85b3fd62ea1a | 3370 | RCC_OscInitStruct->HSEState = RCC_HSE_OFF; |
NYX | 0:85b3fd62ea1a | 3371 | } |
NYX | 0:85b3fd62ea1a | 3372 | |
NYX | 0:85b3fd62ea1a | 3373 | /* Get the HSI configuration -----------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 3374 | if((RCC->CR &RCC_CR_HSION) == RCC_CR_HSION) |
NYX | 0:85b3fd62ea1a | 3375 | { |
NYX | 0:85b3fd62ea1a | 3376 | RCC_OscInitStruct->HSIState = RCC_HSI_ON; |
NYX | 0:85b3fd62ea1a | 3377 | } |
NYX | 0:85b3fd62ea1a | 3378 | else |
NYX | 0:85b3fd62ea1a | 3379 | { |
NYX | 0:85b3fd62ea1a | 3380 | RCC_OscInitStruct->HSIState = RCC_HSI_OFF; |
NYX | 0:85b3fd62ea1a | 3381 | } |
NYX | 0:85b3fd62ea1a | 3382 | |
NYX | 0:85b3fd62ea1a | 3383 | RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR &RCC_CR_HSITRIM) >> POSITION_VAL(RCC_CR_HSITRIM)); |
NYX | 0:85b3fd62ea1a | 3384 | |
NYX | 0:85b3fd62ea1a | 3385 | /* Get the LSE configuration -----------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 3386 | if((RCC->BDCR &RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) |
NYX | 0:85b3fd62ea1a | 3387 | { |
NYX | 0:85b3fd62ea1a | 3388 | RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS; |
NYX | 0:85b3fd62ea1a | 3389 | } |
NYX | 0:85b3fd62ea1a | 3390 | else if((RCC->BDCR &RCC_BDCR_LSEON) == RCC_BDCR_LSEON) |
NYX | 0:85b3fd62ea1a | 3391 | { |
NYX | 0:85b3fd62ea1a | 3392 | RCC_OscInitStruct->LSEState = RCC_LSE_ON; |
NYX | 0:85b3fd62ea1a | 3393 | } |
NYX | 0:85b3fd62ea1a | 3394 | else |
NYX | 0:85b3fd62ea1a | 3395 | { |
NYX | 0:85b3fd62ea1a | 3396 | RCC_OscInitStruct->LSEState = RCC_LSE_OFF; |
NYX | 0:85b3fd62ea1a | 3397 | } |
NYX | 0:85b3fd62ea1a | 3398 | |
NYX | 0:85b3fd62ea1a | 3399 | /* Get the LSI configuration -----------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 3400 | if((RCC->CSR &RCC_CSR_LSION) == RCC_CSR_LSION) |
NYX | 0:85b3fd62ea1a | 3401 | { |
NYX | 0:85b3fd62ea1a | 3402 | RCC_OscInitStruct->LSIState = RCC_LSI_ON; |
NYX | 0:85b3fd62ea1a | 3403 | } |
NYX | 0:85b3fd62ea1a | 3404 | else |
NYX | 0:85b3fd62ea1a | 3405 | { |
NYX | 0:85b3fd62ea1a | 3406 | RCC_OscInitStruct->LSIState = RCC_LSI_OFF; |
NYX | 0:85b3fd62ea1a | 3407 | } |
NYX | 0:85b3fd62ea1a | 3408 | |
NYX | 0:85b3fd62ea1a | 3409 | /* Get the PLL configuration -----------------------------------------------*/ |
NYX | 0:85b3fd62ea1a | 3410 | if((RCC->CR &RCC_CR_PLLON) == RCC_CR_PLLON) |
NYX | 0:85b3fd62ea1a | 3411 | { |
NYX | 0:85b3fd62ea1a | 3412 | RCC_OscInitStruct->PLL.PLLState = RCC_PLL_ON; |
NYX | 0:85b3fd62ea1a | 3413 | } |
NYX | 0:85b3fd62ea1a | 3414 | else |
NYX | 0:85b3fd62ea1a | 3415 | { |
NYX | 0:85b3fd62ea1a | 3416 | RCC_OscInitStruct->PLL.PLLState = RCC_PLL_OFF; |
NYX | 0:85b3fd62ea1a | 3417 | } |
NYX | 0:85b3fd62ea1a | 3418 | RCC_OscInitStruct->PLL.PLLSource = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); |
NYX | 0:85b3fd62ea1a | 3419 | RCC_OscInitStruct->PLL.PLLM = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM); |
NYX | 0:85b3fd62ea1a | 3420 | RCC_OscInitStruct->PLL.PLLN = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> POSITION_VAL(RCC_PLLCFGR_PLLN)); |
NYX | 0:85b3fd62ea1a | 3421 | RCC_OscInitStruct->PLL.PLLP = (uint32_t)((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) + RCC_PLLCFGR_PLLP_0) << 1U) >> POSITION_VAL(RCC_PLLCFGR_PLLP)); |
NYX | 0:85b3fd62ea1a | 3422 | RCC_OscInitStruct->PLL.PLLQ = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLQ) >> POSITION_VAL(RCC_PLLCFGR_PLLQ)); |
NYX | 0:85b3fd62ea1a | 3423 | RCC_OscInitStruct->PLL.PLLR = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> POSITION_VAL(RCC_PLLCFGR_PLLR)); |
NYX | 0:85b3fd62ea1a | 3424 | } |
NYX | 0:85b3fd62ea1a | 3425 | #endif /* STM32F410xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ |
NYX | 0:85b3fd62ea1a | 3426 | |
NYX | 0:85b3fd62ea1a | 3427 | #endif /* HAL_RCC_MODULE_ENABLED */ |
NYX | 0:85b3fd62ea1a | 3428 | /** |
NYX | 0:85b3fd62ea1a | 3429 | * @} |
NYX | 0:85b3fd62ea1a | 3430 | */ |
NYX | 0:85b3fd62ea1a | 3431 | |
NYX | 0:85b3fd62ea1a | 3432 | /** |
NYX | 0:85b3fd62ea1a | 3433 | * @} |
NYX | 0:85b3fd62ea1a | 3434 | */ |
NYX | 0:85b3fd62ea1a | 3435 | |
NYX | 0:85b3fd62ea1a | 3436 | /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |