Mercurial > pub > halpp
comparison l476rg/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c @ 0:32a3b1785697
a rough draft of Hardware Abstraction Layer for C++
STM32L476RG drivers
| author | cin |
|---|---|
| date | Thu, 12 Jan 2017 02:45:43 +0300 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:32a3b1785697 |
|---|---|
| 1 /** | |
| 2 ****************************************************************************** | |
| 3 * @file stm32l4xx_hal_rcc_ex.c | |
| 4 * @author MCD Application Team | |
| 5 * @version V1.6.0 | |
| 6 * @date 28-October-2016 | |
| 7 * @brief Extended RCC HAL module driver. | |
| 8 * This file provides firmware functions to manage the following | |
| 9 * functionalities RCC extended peripheral: | |
| 10 * + Extended Peripheral Control functions | |
| 11 * + Extended Clock management functions | |
| 12 * + Extended Clock Recovery System Control functions | |
| 13 * | |
| 14 ****************************************************************************** | |
| 15 * @attention | |
| 16 * | |
| 17 * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> | |
| 18 * | |
| 19 * Redistribution and use in source and binary forms, with or without modification, | |
| 20 * are permitted provided that the following conditions are met: | |
| 21 * 1. Redistributions of source code must retain the above copyright notice, | |
| 22 * this list of conditions and the following disclaimer. | |
| 23 * 2. Redistributions in binary form must reproduce the above copyright notice, | |
| 24 * this list of conditions and the following disclaimer in the documentation | |
| 25 * and/or other materials provided with the distribution. | |
| 26 * 3. Neither the name of STMicroelectronics nor the names of its contributors | |
| 27 * may be used to endorse or promote products derived from this software | |
| 28 * without specific prior written permission. | |
| 29 * | |
| 30 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
| 31 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| 32 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
| 33 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | |
| 34 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
| 35 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |
| 36 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |
| 37 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |
| 38 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
| 39 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| 40 * | |
| 41 ****************************************************************************** | |
| 42 */ | |
| 43 | |
| 44 /* Includes ------------------------------------------------------------------*/ | |
| 45 #include "stm32l4xx_hal.h" | |
| 46 | |
| 47 /** @addtogroup STM32L4xx_HAL_Driver | |
| 48 * @{ | |
| 49 */ | |
| 50 | |
| 51 /** @defgroup RCCEx RCCEx | |
| 52 * @brief RCC Extended HAL module driver | |
| 53 * @{ | |
| 54 */ | |
| 55 | |
| 56 #ifdef HAL_RCC_MODULE_ENABLED | |
| 57 | |
| 58 /* Private typedef -----------------------------------------------------------*/ | |
| 59 /* Private defines -----------------------------------------------------------*/ | |
| 60 /** @defgroup RCCEx_Private_Constants RCCEx Private Constants | |
| 61 * @{ | |
| 62 */ | |
| 63 #define PLLSAI1_TIMEOUT_VALUE ((uint32_t)2U) /* 2 ms (minimum Tick + 1) */ | |
| 64 #define PLLSAI2_TIMEOUT_VALUE ((uint32_t)2U) /* 2 ms (minimum Tick + 1) */ | |
| 65 #define PLL_TIMEOUT_VALUE ((uint32_t)2U) /* 2 ms (minimum Tick + 1) */ | |
| 66 | |
| 67 #define DIVIDER_P_UPDATE 0U | |
| 68 #define DIVIDER_Q_UPDATE 1U | |
| 69 #define DIVIDER_R_UPDATE 2U | |
| 70 | |
| 71 #define __LSCO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() | |
| 72 #define LSCO_GPIO_PORT GPIOA | |
| 73 #define LSCO_PIN GPIO_PIN_2 | |
| 74 /** | |
| 75 * @} | |
| 76 */ | |
| 77 | |
| 78 /* Private macros ------------------------------------------------------------*/ | |
| 79 /* Private variables ---------------------------------------------------------*/ | |
| 80 /* Private function prototypes -----------------------------------------------*/ | |
| 81 /** @defgroup RCCEx_Private_Functions RCCEx Private Functions | |
| 82 * @{ | |
| 83 */ | |
| 84 static HAL_StatusTypeDef RCCEx_PLLSAI1_Config(RCC_PLLSAI1InitTypeDef *PllSai1, uint32_t Divider); | |
| 85 | |
| 86 #if defined(RCC_PLLSAI2_SUPPORT) | |
| 87 | |
| 88 static HAL_StatusTypeDef RCCEx_PLLSAI2_Config(RCC_PLLSAI2InitTypeDef *PllSai2, uint32_t Divider); | |
| 89 | |
| 90 #endif /* RCC_PLLSAI2_SUPPORT */ | |
| 91 | |
| 92 /** | |
| 93 * @} | |
| 94 */ | |
| 95 | |
| 96 /* Exported functions --------------------------------------------------------*/ | |
| 97 | |
| 98 /** @defgroup RCCEx_Exported_Functions RCCEx Exported Functions | |
| 99 * @{ | |
| 100 */ | |
| 101 | |
| 102 /** @defgroup RCCEx_Exported_Functions_Group1 Extended Peripheral Control functions | |
| 103 * @brief Extended Peripheral Control functions | |
| 104 * | |
| 105 @verbatim | |
| 106 =============================================================================== | |
| 107 ##### Extended Peripheral Control functions ##### | |
| 108 =============================================================================== | |
| 109 [..] | |
| 110 This subsection provides a set of functions allowing to control the RCC Clocks | |
| 111 frequencies. | |
| 112 [..] | |
| 113 (@) Important note: Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to | |
| 114 select the RTC clock source; in this case the Backup domain will be reset in | |
| 115 order to modify the RTC Clock source, as consequence RTC registers (including | |
| 116 the backup registers) are set to their reset values. | |
| 117 | |
| 118 @endverbatim | |
| 119 * @{ | |
| 120 */ | |
| 121 /** | |
| 122 * @brief Initialize the RCC extended peripherals clocks according to the specified | |
| 123 * parameters in the RCC_PeriphCLKInitTypeDef. | |
| 124 * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that | |
| 125 * contains a field PeriphClockSelection which can be a combination of the following values: | |
| 126 * @arg @ref RCC_PERIPHCLK_RTC RTC peripheral clock | |
| 127 * @arg @ref RCC_PERIPHCLK_ADC ADC peripheral clock | |
| 128 @if STM32L486xx | |
| 129 * @arg @ref RCC_PERIPHCLK_DFSDM1 DFSDM1 peripheral clock (only for devices with DFSDM1) | |
| 130 @endif | |
| 131 @if STM32L462xx | |
| 132 * @arg @ref RCC_PERIPHCLK_DFSDM1 DFSDM1 peripheral clock (only for devices with DFSDM1) | |
| 133 @endif | |
| 134 * @arg @ref RCC_PERIPHCLK_I2C1 I2C1 peripheral clock | |
| 135 * @arg @ref RCC_PERIPHCLK_I2C2 I2C2 peripheral clock | |
| 136 * @arg @ref RCC_PERIPHCLK_I2C3 I2C3 peripheral clock | |
| 137 @if STM32L462xx | |
| 138 * @arg @ref RCC_PERIPHCLK_I2C4 I2C4 peripheral clock (only for devices with I2C4) | |
| 139 @endif | |
| 140 * @arg @ref RCC_PERIPHCLK_LPTIM1 LPTIM1 peripheral clock | |
| 141 * @arg @ref RCC_PERIPHCLK_LPTIM2 LPTIM2 peripheral clock | |
| 142 * @arg @ref RCC_PERIPHCLK_LPUART1 LPUART1 peripheral clock | |
| 143 * @arg @ref RCC_PERIPHCLK_RNG RNG peripheral clock | |
| 144 * @arg @ref RCC_PERIPHCLK_SAI1 SAI1 peripheral clock | |
| 145 @if STM32L486xx | |
| 146 * @arg @ref RCC_PERIPHCLK_SAI2 SAI2 peripheral clock (only for devices with SAI2) | |
| 147 @endif | |
| 148 * @arg @ref RCC_PERIPHCLK_SDMMC1 SDMMC1 peripheral clock | |
| 149 @if STM32L443xx | |
| 150 * @arg @ref RCC_PERIPHCLK_SWPMI1 SWPMI1 peripheral clock (only for devices with SWPMI1) | |
| 151 @endif | |
| 152 @if STM32L486xx | |
| 153 * @arg @ref RCC_PERIPHCLK_SWPMI1 SWPMI1 peripheral clock (only for devices with SWPMI1) | |
| 154 @endif | |
| 155 * @arg @ref RCC_PERIPHCLK_USART1 USART1 peripheral clock | |
| 156 * @arg @ref RCC_PERIPHCLK_USART2 USART1 peripheral clock | |
| 157 * @arg @ref RCC_PERIPHCLK_USART3 USART1 peripheral clock | |
| 158 @if STM32L462xx | |
| 159 * @arg @ref RCC_PERIPHCLK_UART4 USART1 peripheral clock (only for devices with UART4) | |
| 160 @endif | |
| 161 @if STM32L486xx | |
| 162 * @arg @ref RCC_PERIPHCLK_UART4 USART1 peripheral clock (only for devices with UART4) | |
| 163 * @arg @ref RCC_PERIPHCLK_UART5 USART1 peripheral clock (only for devices with UART5) | |
| 164 * @arg @ref RCC_PERIPHCLK_USB USB peripheral clock (only for devices with USB) | |
| 165 @endif | |
| 166 * | |
| 167 * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select | |
| 168 * the RTC clock source: in this case the access to Backup domain is enabled. | |
| 169 * | |
| 170 * @retval HAL status | |
| 171 */ | |
| 172 HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) | |
| 173 { | |
| 174 uint32_t tmpregister = 0; | |
| 175 uint32_t tickstart = 0U; | |
| 176 HAL_StatusTypeDef ret = HAL_OK; /* Intermediate status */ | |
| 177 HAL_StatusTypeDef status = HAL_OK; /* Final status */ | |
| 178 | |
| 179 /* Check the parameters */ | |
| 180 assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); | |
| 181 | |
| 182 /*-------------------------- SAI1 clock source configuration ---------------------*/ | |
| 183 if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == RCC_PERIPHCLK_SAI1)) | |
| 184 { | |
| 185 /* Check the parameters */ | |
| 186 assert_param(IS_RCC_SAI1CLK(PeriphClkInit->Sai1ClockSelection)); | |
| 187 | |
| 188 switch(PeriphClkInit->Sai1ClockSelection) | |
| 189 { | |
| 190 case RCC_SAI1CLKSOURCE_PLL: /* PLL is used as clock source for SAI1*/ | |
| 191 /* Enable SAI Clock output generated form System PLL . */ | |
| 192 #if defined(RCC_PLLSAI2_SUPPORT) | |
| 193 __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL_SAI3CLK); | |
| 194 #else | |
| 195 __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL_SAI2CLK); | |
| 196 #endif /* RCC_PLLSAI2_SUPPORT */ | |
| 197 /* SAI1 clock source config set later after clock selection check */ | |
| 198 break; | |
| 199 | |
| 200 case RCC_SAI1CLKSOURCE_PLLSAI1: /* PLLSAI1 is used as clock source for SAI1*/ | |
| 201 /* PLLSAI1 input clock, parameters M, N & P configuration and clock output (PLLSAI1ClockOut) */ | |
| 202 ret = RCCEx_PLLSAI1_Config(&(PeriphClkInit->PLLSAI1), DIVIDER_P_UPDATE); | |
| 203 /* SAI1 clock source config set later after clock selection check */ | |
| 204 break; | |
| 205 | |
| 206 #if defined(RCC_PLLSAI2_SUPPORT) | |
| 207 | |
| 208 case RCC_SAI1CLKSOURCE_PLLSAI2: /* PLLSAI2 is used as clock source for SAI1*/ | |
| 209 /* PLLSAI2 input clock, parameters M, N & P configuration clock output (PLLSAI2ClockOut) */ | |
| 210 ret = RCCEx_PLLSAI2_Config(&(PeriphClkInit->PLLSAI2), DIVIDER_P_UPDATE); | |
| 211 /* SAI1 clock source config set later after clock selection check */ | |
| 212 break; | |
| 213 | |
| 214 #endif /* RCC_PLLSAI2_SUPPORT */ | |
| 215 | |
| 216 case RCC_SAI1CLKSOURCE_PIN: /* External clock is used as source of SAI1 clock*/ | |
| 217 /* SAI1 clock source config set later after clock selection check */ | |
| 218 break; | |
| 219 | |
| 220 default: | |
| 221 ret = HAL_ERROR; | |
| 222 break; | |
| 223 } | |
| 224 | |
| 225 if(ret == HAL_OK) | |
| 226 { | |
| 227 /* Set the source of SAI1 clock*/ | |
| 228 __HAL_RCC_SAI1_CONFIG(PeriphClkInit->Sai1ClockSelection); | |
| 229 } | |
| 230 else | |
| 231 { | |
| 232 /* set overall return value */ | |
| 233 status = ret; | |
| 234 } | |
| 235 } | |
| 236 | |
| 237 #if defined(SAI2) | |
| 238 | |
| 239 /*-------------------------- SAI2 clock source configuration ---------------------*/ | |
| 240 if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == RCC_PERIPHCLK_SAI2)) | |
| 241 { | |
| 242 /* Check the parameters */ | |
| 243 assert_param(IS_RCC_SAI2CLK(PeriphClkInit->Sai2ClockSelection)); | |
| 244 | |
| 245 switch(PeriphClkInit->Sai2ClockSelection) | |
| 246 { | |
| 247 case RCC_SAI2CLKSOURCE_PLL: /* PLL is used as clock source for SAI2*/ | |
| 248 /* Enable SAI Clock output generated form System PLL . */ | |
| 249 __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL_SAI3CLK); | |
| 250 /* SAI2 clock source config set later after clock selection check */ | |
| 251 break; | |
| 252 | |
| 253 case RCC_SAI2CLKSOURCE_PLLSAI1: /* PLLSAI1 is used as clock source for SAI2*/ | |
| 254 /* PLLSAI1 input clock, parameters M, N & P configuration and clock output (PLLSAI1ClockOut) */ | |
| 255 ret = RCCEx_PLLSAI1_Config(&(PeriphClkInit->PLLSAI1), DIVIDER_P_UPDATE); | |
| 256 /* SAI2 clock source config set later after clock selection check */ | |
| 257 break; | |
| 258 | |
| 259 case RCC_SAI2CLKSOURCE_PLLSAI2: /* PLLSAI2 is used as clock source for SAI2*/ | |
| 260 /* PLLSAI2 input clock, parameters M, N & P configuration and clock output (PLLSAI2ClockOut) */ | |
| 261 ret = RCCEx_PLLSAI2_Config(&(PeriphClkInit->PLLSAI2), DIVIDER_P_UPDATE); | |
| 262 /* SAI2 clock source config set later after clock selection check */ | |
| 263 break; | |
| 264 | |
| 265 case RCC_SAI2CLKSOURCE_PIN: /* External clock is used as source of SAI2 clock*/ | |
| 266 /* SAI2 clock source config set later after clock selection check */ | |
| 267 break; | |
| 268 | |
| 269 default: | |
| 270 ret = HAL_ERROR; | |
| 271 break; | |
| 272 } | |
| 273 | |
| 274 if(ret == HAL_OK) | |
| 275 { | |
| 276 /* Set the source of SAI2 clock*/ | |
| 277 __HAL_RCC_SAI2_CONFIG(PeriphClkInit->Sai2ClockSelection); | |
| 278 } | |
| 279 else | |
| 280 { | |
| 281 /* set overall return value */ | |
| 282 status = ret; | |
| 283 } | |
| 284 } | |
| 285 #endif /* SAI2 */ | |
| 286 | |
| 287 /*-------------------------- RTC clock source configuration ----------------------*/ | |
| 288 if((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_RTC) == RCC_PERIPHCLK_RTC) | |
| 289 { | |
| 290 FlagStatus pwrclkchanged = RESET; | |
| 291 | |
| 292 /* Check for RTC Parameters used to output RTCCLK */ | |
| 293 assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); | |
| 294 | |
| 295 /* Enable Power Clock */ | |
| 296 if(__HAL_RCC_PWR_IS_CLK_DISABLED()) | |
| 297 { | |
| 298 __HAL_RCC_PWR_CLK_ENABLE(); | |
| 299 pwrclkchanged = SET; | |
| 300 } | |
| 301 | |
| 302 /* Enable write access to Backup domain */ | |
| 303 SET_BIT(PWR->CR1, PWR_CR1_DBP); | |
| 304 | |
| 305 /* Wait for Backup domain Write protection disable */ | |
| 306 tickstart = HAL_GetTick(); | |
| 307 | |
| 308 while((PWR->CR1 & PWR_CR1_DBP) == RESET) | |
| 309 { | |
| 310 if((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) | |
| 311 { | |
| 312 ret = HAL_TIMEOUT; | |
| 313 break; | |
| 314 } | |
| 315 } | |
| 316 | |
| 317 if(ret == HAL_OK) | |
| 318 { | |
| 319 /* Reset the Backup domain only if the RTC Clock source selection is modified from default */ | |
| 320 tmpregister = READ_BIT(RCC->BDCR, RCC_BDCR_RTCSEL); | |
| 321 | |
| 322 if((tmpregister != RCC_RTCCLKSOURCE_NO_CLK) && (tmpregister != PeriphClkInit->RTCClockSelection)) | |
| 323 { | |
| 324 /* Store the content of BDCR register before the reset of Backup Domain */ | |
| 325 tmpregister = READ_BIT(RCC->BDCR, ~(RCC_BDCR_RTCSEL)); | |
| 326 /* RTC Clock selection can be changed only if the Backup Domain is reset */ | |
| 327 __HAL_RCC_BACKUPRESET_FORCE(); | |
| 328 __HAL_RCC_BACKUPRESET_RELEASE(); | |
| 329 /* Restore the Content of BDCR register */ | |
| 330 RCC->BDCR = tmpregister; | |
| 331 } | |
| 332 | |
| 333 /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ | |
| 334 if (HAL_IS_BIT_SET(tmpregister, RCC_BDCR_LSEON)) | |
| 335 { | |
| 336 /* Get Start Tick*/ | |
| 337 tickstart = HAL_GetTick(); | |
| 338 | |
| 339 /* Wait till LSE is ready */ | |
| 340 while(READ_BIT(RCC->BDCR, RCC_BDCR_LSERDY) == RESET) | |
| 341 { | |
| 342 if((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) | |
| 343 { | |
| 344 ret = HAL_TIMEOUT; | |
| 345 break; | |
| 346 } | |
| 347 } | |
| 348 } | |
| 349 | |
| 350 if(ret == HAL_OK) | |
| 351 { | |
| 352 /* Apply new RTC clock source selection */ | |
| 353 __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); | |
| 354 } | |
| 355 else | |
| 356 { | |
| 357 /* set overall return value */ | |
| 358 status = ret; | |
| 359 } | |
| 360 } | |
| 361 else | |
| 362 { | |
| 363 /* set overall return value */ | |
| 364 status = ret; | |
| 365 } | |
| 366 | |
| 367 /* Restore clock configuration if changed */ | |
| 368 if(pwrclkchanged == SET) | |
| 369 { | |
| 370 __HAL_RCC_PWR_CLK_DISABLE(); | |
| 371 } | |
| 372 } | |
| 373 | |
| 374 /*-------------------------- USART1 clock source configuration -------------------*/ | |
| 375 if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USART1) == RCC_PERIPHCLK_USART1) | |
| 376 { | |
| 377 /* Check the parameters */ | |
| 378 assert_param(IS_RCC_USART1CLKSOURCE(PeriphClkInit->Usart1ClockSelection)); | |
| 379 | |
| 380 /* Configure the USART1 clock source */ | |
| 381 __HAL_RCC_USART1_CONFIG(PeriphClkInit->Usart1ClockSelection); | |
| 382 } | |
| 383 | |
| 384 /*-------------------------- USART2 clock source configuration -------------------*/ | |
| 385 if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USART2) == RCC_PERIPHCLK_USART2) | |
| 386 { | |
| 387 /* Check the parameters */ | |
| 388 assert_param(IS_RCC_USART2CLKSOURCE(PeriphClkInit->Usart2ClockSelection)); | |
| 389 | |
| 390 /* Configure the USART2 clock source */ | |
| 391 __HAL_RCC_USART2_CONFIG(PeriphClkInit->Usart2ClockSelection); | |
| 392 } | |
| 393 | |
| 394 #if defined(USART3) | |
| 395 | |
| 396 /*-------------------------- USART3 clock source configuration -------------------*/ | |
| 397 if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USART3) == RCC_PERIPHCLK_USART3) | |
| 398 { | |
| 399 /* Check the parameters */ | |
| 400 assert_param(IS_RCC_USART3CLKSOURCE(PeriphClkInit->Usart3ClockSelection)); | |
| 401 | |
| 402 /* Configure the USART3 clock source */ | |
| 403 __HAL_RCC_USART3_CONFIG(PeriphClkInit->Usart3ClockSelection); | |
| 404 } | |
| 405 | |
| 406 #endif /* USART3 */ | |
| 407 | |
| 408 #if defined(UART4) | |
| 409 | |
| 410 /*-------------------------- UART4 clock source configuration --------------------*/ | |
| 411 if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_UART4) == RCC_PERIPHCLK_UART4) | |
| 412 { | |
| 413 /* Check the parameters */ | |
| 414 assert_param(IS_RCC_UART4CLKSOURCE(PeriphClkInit->Uart4ClockSelection)); | |
| 415 | |
| 416 /* Configure the UART4 clock source */ | |
| 417 __HAL_RCC_UART4_CONFIG(PeriphClkInit->Uart4ClockSelection); | |
| 418 } | |
| 419 | |
| 420 #endif /* UART4 */ | |
| 421 | |
| 422 #if defined(UART5) | |
| 423 | |
| 424 /*-------------------------- UART5 clock source configuration --------------------*/ | |
| 425 if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_UART5) == RCC_PERIPHCLK_UART5) | |
| 426 { | |
| 427 /* Check the parameters */ | |
| 428 assert_param(IS_RCC_UART5CLKSOURCE(PeriphClkInit->Uart5ClockSelection)); | |
| 429 | |
| 430 /* Configure the UART5 clock source */ | |
| 431 __HAL_RCC_UART5_CONFIG(PeriphClkInit->Uart5ClockSelection); | |
| 432 } | |
| 433 | |
| 434 #endif /* UART5 */ | |
| 435 | |
| 436 /*-------------------------- LPUART1 clock source configuration ------------------*/ | |
| 437 if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPUART1) == RCC_PERIPHCLK_LPUART1) | |
| 438 { | |
| 439 /* Check the parameters */ | |
| 440 assert_param(IS_RCC_LPUART1CLKSOURCE(PeriphClkInit->Lpuart1ClockSelection)); | |
| 441 | |
| 442 /* Configure the LPUAR1 clock source */ | |
| 443 __HAL_RCC_LPUART1_CONFIG(PeriphClkInit->Lpuart1ClockSelection); | |
| 444 } | |
| 445 | |
| 446 /*-------------------------- LPTIM1 clock source configuration -------------------*/ | |
| 447 if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPTIM1) == (RCC_PERIPHCLK_LPTIM1)) | |
| 448 { | |
| 449 assert_param(IS_RCC_LPTIM1CLK(PeriphClkInit->Lptim1ClockSelection)); | |
| 450 __HAL_RCC_LPTIM1_CONFIG(PeriphClkInit->Lptim1ClockSelection); | |
| 451 } | |
| 452 | |
| 453 /*-------------------------- LPTIM2 clock source configuration -------------------*/ | |
| 454 if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPTIM2) == (RCC_PERIPHCLK_LPTIM2)) | |
| 455 { | |
| 456 assert_param(IS_RCC_LPTIM2CLK(PeriphClkInit->Lptim2ClockSelection)); | |
| 457 __HAL_RCC_LPTIM2_CONFIG(PeriphClkInit->Lptim2ClockSelection); | |
| 458 } | |
| 459 | |
| 460 /*-------------------------- I2C1 clock source configuration ---------------------*/ | |
| 461 if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C1) == RCC_PERIPHCLK_I2C1) | |
| 462 { | |
| 463 /* Check the parameters */ | |
| 464 assert_param(IS_RCC_I2C1CLKSOURCE(PeriphClkInit->I2c1ClockSelection)); | |
| 465 | |
| 466 /* Configure the I2C1 clock source */ | |
| 467 __HAL_RCC_I2C1_CONFIG(PeriphClkInit->I2c1ClockSelection); | |
| 468 } | |
| 469 | |
| 470 #if defined(I2C2) | |
| 471 | |
| 472 /*-------------------------- I2C2 clock source configuration ---------------------*/ | |
| 473 if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C2) == RCC_PERIPHCLK_I2C2) | |
| 474 { | |
| 475 /* Check the parameters */ | |
| 476 assert_param(IS_RCC_I2C2CLKSOURCE(PeriphClkInit->I2c2ClockSelection)); | |
| 477 | |
| 478 /* Configure the I2C2 clock source */ | |
| 479 __HAL_RCC_I2C2_CONFIG(PeriphClkInit->I2c2ClockSelection); | |
| 480 } | |
| 481 | |
| 482 #endif /* I2C2 */ | |
| 483 | |
| 484 /*-------------------------- I2C3 clock source configuration ---------------------*/ | |
| 485 if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C3) == RCC_PERIPHCLK_I2C3) | |
| 486 { | |
| 487 /* Check the parameters */ | |
| 488 assert_param(IS_RCC_I2C3CLKSOURCE(PeriphClkInit->I2c3ClockSelection)); | |
| 489 | |
| 490 /* Configure the I2C3 clock source */ | |
| 491 __HAL_RCC_I2C3_CONFIG(PeriphClkInit->I2c3ClockSelection); | |
| 492 } | |
| 493 | |
| 494 #if defined(I2C4) | |
| 495 | |
| 496 /*-------------------------- I2C4 clock source configuration ---------------------*/ | |
| 497 if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C4) == RCC_PERIPHCLK_I2C4) | |
| 498 { | |
| 499 /* Check the parameters */ | |
| 500 assert_param(IS_RCC_I2C4CLKSOURCE(PeriphClkInit->I2c4ClockSelection)); | |
| 501 | |
| 502 /* Configure the I2C4 clock source */ | |
| 503 __HAL_RCC_I2C4_CONFIG(PeriphClkInit->I2c4ClockSelection); | |
| 504 } | |
| 505 | |
| 506 #endif /* I2C4 */ | |
| 507 | |
| 508 #if defined(USB_OTG_FS) || defined(USB) | |
| 509 | |
| 510 /*-------------------------- USB clock source configuration ----------------------*/ | |
| 511 if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USB) == (RCC_PERIPHCLK_USB)) | |
| 512 { | |
| 513 assert_param(IS_RCC_USBCLKSOURCE(PeriphClkInit->UsbClockSelection)); | |
| 514 __HAL_RCC_USB_CONFIG(PeriphClkInit->UsbClockSelection); | |
| 515 | |
| 516 if(PeriphClkInit->UsbClockSelection == RCC_USBCLKSOURCE_PLL) | |
| 517 { | |
| 518 /* Enable PLL48M1CLK output */ | |
| 519 __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL_48M1CLK); | |
| 520 } | |
| 521 else | |
| 522 { | |
| 523 if(PeriphClkInit->UsbClockSelection == RCC_USBCLKSOURCE_PLLSAI1) | |
| 524 { | |
| 525 /* PLLSAI1 input clock, parameters M, N & Q configuration and clock output (PLLSAI1ClockOut) */ | |
| 526 ret = RCCEx_PLLSAI1_Config(&(PeriphClkInit->PLLSAI1), DIVIDER_Q_UPDATE); | |
| 527 | |
| 528 if(ret != HAL_OK) | |
| 529 { | |
| 530 /* set overall return value */ | |
| 531 status = ret; | |
| 532 } | |
| 533 } | |
| 534 } | |
| 535 } | |
| 536 | |
| 537 #endif /* USB_OTG_FS || USB */ | |
| 538 | |
| 539 #if defined(SDMMC1) | |
| 540 | |
| 541 /*-------------------------- SDMMC1 clock source configuration -------------------*/ | |
| 542 if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDMMC1) == (RCC_PERIPHCLK_SDMMC1)) | |
| 543 { | |
| 544 assert_param(IS_RCC_SDMMC1CLKSOURCE(PeriphClkInit->Sdmmc1ClockSelection)); | |
| 545 __HAL_RCC_SDMMC1_CONFIG(PeriphClkInit->Sdmmc1ClockSelection); | |
| 546 | |
| 547 if(PeriphClkInit->Sdmmc1ClockSelection == RCC_SDMMC1CLKSOURCE_PLL) | |
| 548 { | |
| 549 /* Enable PLL48M1CLK output */ | |
| 550 __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL_48M1CLK); | |
| 551 } | |
| 552 else if(PeriphClkInit->Sdmmc1ClockSelection == RCC_SDMMC1CLKSOURCE_PLLSAI1) | |
| 553 { | |
| 554 /* PLLSAI1 input clock, parameters M, N & Q configuration and clock output (PLLSAI1ClockOut) */ | |
| 555 ret = RCCEx_PLLSAI1_Config(&(PeriphClkInit->PLLSAI1), DIVIDER_Q_UPDATE); | |
| 556 | |
| 557 if(ret != HAL_OK) | |
| 558 { | |
| 559 /* set overall return value */ | |
| 560 status = ret; | |
| 561 } | |
| 562 } | |
| 563 } | |
| 564 | |
| 565 #endif /* SDMMC1 */ | |
| 566 | |
| 567 /*-------------------------- RNG clock source configuration ----------------------*/ | |
| 568 if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RNG) == (RCC_PERIPHCLK_RNG)) | |
| 569 { | |
| 570 assert_param(IS_RCC_RNGCLKSOURCE(PeriphClkInit->RngClockSelection)); | |
| 571 __HAL_RCC_RNG_CONFIG(PeriphClkInit->RngClockSelection); | |
| 572 | |
| 573 if(PeriphClkInit->RngClockSelection == RCC_RNGCLKSOURCE_PLL) | |
| 574 { | |
| 575 /* Enable PLL48M1CLK output */ | |
| 576 __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL_48M1CLK); | |
| 577 } | |
| 578 else if(PeriphClkInit->RngClockSelection == RCC_RNGCLKSOURCE_PLLSAI1) | |
| 579 { | |
| 580 /* PLLSAI1 input clock, parameters M, N & Q configuration and clock output (PLLSAI1ClockOut) */ | |
| 581 ret = RCCEx_PLLSAI1_Config(&(PeriphClkInit->PLLSAI1), DIVIDER_Q_UPDATE); | |
| 582 | |
| 583 if(ret != HAL_OK) | |
| 584 { | |
| 585 /* set overall return value */ | |
| 586 status = ret; | |
| 587 } | |
| 588 } | |
| 589 } | |
| 590 | |
| 591 /*-------------------------- ADC clock source configuration ----------------------*/ | |
| 592 if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_ADC) == RCC_PERIPHCLK_ADC) | |
| 593 { | |
| 594 /* Check the parameters */ | |
| 595 assert_param(IS_RCC_ADCCLKSOURCE(PeriphClkInit->AdcClockSelection)); | |
| 596 | |
| 597 /* Configure the ADC interface clock source */ | |
| 598 __HAL_RCC_ADC_CONFIG(PeriphClkInit->AdcClockSelection); | |
| 599 | |
| 600 if(PeriphClkInit->AdcClockSelection == RCC_ADCCLKSOURCE_PLLSAI1) | |
| 601 { | |
| 602 /* PLLSAI1 input clock, parameters M, N & R configuration and clock output (PLLSAI1ClockOut) */ | |
| 603 ret = RCCEx_PLLSAI1_Config(&(PeriphClkInit->PLLSAI1), DIVIDER_R_UPDATE); | |
| 604 | |
| 605 if(ret != HAL_OK) | |
| 606 { | |
| 607 /* set overall return value */ | |
| 608 status = ret; | |
| 609 } | |
| 610 } | |
| 611 | |
| 612 #if defined(STM32L471xx) || defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx) | |
| 613 | |
| 614 else if(PeriphClkInit->AdcClockSelection == RCC_ADCCLKSOURCE_PLLSAI2) | |
| 615 { | |
| 616 /* PLLSAI2 input clock, parameters M, N & R configuration and clock output (PLLSAI2ClockOut) */ | |
| 617 ret = RCCEx_PLLSAI2_Config(&(PeriphClkInit->PLLSAI2), DIVIDER_R_UPDATE); | |
| 618 | |
| 619 if(ret != HAL_OK) | |
| 620 { | |
| 621 /* set overall return value */ | |
| 622 status = ret; | |
| 623 } | |
| 624 } | |
| 625 | |
| 626 #endif /* STM32L471xx || STM32L475xx || STM32L476xx || STM32L485xx || STM32L486xx */ | |
| 627 | |
| 628 } | |
| 629 | |
| 630 #if defined(SWPMI1) | |
| 631 | |
| 632 /*-------------------------- SWPMI1 clock source configuration -------------------*/ | |
| 633 if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SWPMI1) == RCC_PERIPHCLK_SWPMI1) | |
| 634 { | |
| 635 /* Check the parameters */ | |
| 636 assert_param(IS_RCC_SWPMI1CLKSOURCE(PeriphClkInit->Swpmi1ClockSelection)); | |
| 637 | |
| 638 /* Configure the SWPMI1 clock source */ | |
| 639 __HAL_RCC_SWPMI1_CONFIG(PeriphClkInit->Swpmi1ClockSelection); | |
| 640 } | |
| 641 | |
| 642 #endif /* SWPMI1 */ | |
| 643 | |
| 644 #if defined(DFSDM1_Filter0) | |
| 645 | |
| 646 /*-------------------------- DFSDM1 clock source configuration -------------------*/ | |
| 647 if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM1) == RCC_PERIPHCLK_DFSDM1) | |
| 648 { | |
| 649 /* Check the parameters */ | |
| 650 assert_param(IS_RCC_DFSDM1CLKSOURCE(PeriphClkInit->Dfsdm1ClockSelection)); | |
| 651 | |
| 652 /* Configure the DFSDM1 interface clock source */ | |
| 653 __HAL_RCC_DFSDM1_CONFIG(PeriphClkInit->Dfsdm1ClockSelection); | |
| 654 } | |
| 655 | |
| 656 #endif /* DFSDM1_Filter0 */ | |
| 657 | |
| 658 return status; | |
| 659 } | |
| 660 | |
| 661 /** | |
| 662 * @brief Get the RCC_ClkInitStruct according to the internal RCC configuration registers. | |
| 663 * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that | |
| 664 * returns the configuration information for the Extended Peripherals | |
| 665 * clocks(SAI1, SAI2, LPTIM1, LPTIM2, I2C1, I2C2, I2C3, I2C4, LPUART, | |
| 666 * USART1, USART2, USART3, UART4, UART5, RTC, ADCx, DFSDMx, SWPMI1, USB, SDMMC1 and RNG). | |
| 667 * @retval None | |
| 668 */ | |
| 669 void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) | |
| 670 { | |
| 671 /* Set all possible values for the extended clock type parameter------------*/ | |
| 672 | |
| 673 #if defined(STM32L431xx) | |
| 674 | |
| 675 PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 | \ | |
| 676 RCC_PERIPHCLK_LPUART1 | RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_I2C2 | RCC_PERIPHCLK_I2C3 | \ | |
| 677 RCC_PERIPHCLK_LPTIM1 | RCC_PERIPHCLK_LPTIM2 | RCC_PERIPHCLK_SAI1 | \ | |
| 678 RCC_PERIPHCLK_SDMMC1 | RCC_PERIPHCLK_RNG | RCC_PERIPHCLK_ADC | RCC_PERIPHCLK_SWPMI1 | \ | |
| 679 RCC_PERIPHCLK_RTC ; | |
| 680 | |
| 681 #elif defined(STM32L432xx) || defined(STM32L442xx) | |
| 682 | |
| 683 PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_USART2 | \ | |
| 684 RCC_PERIPHCLK_LPUART1 | RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_I2C3 | \ | |
| 685 RCC_PERIPHCLK_LPTIM1 | RCC_PERIPHCLK_LPTIM2 | RCC_PERIPHCLK_SAI1 | RCC_PERIPHCLK_USB | \ | |
| 686 RCC_PERIPHCLK_RNG | RCC_PERIPHCLK_ADC | RCC_PERIPHCLK_SWPMI1 | \ | |
| 687 RCC_PERIPHCLK_RTC ; | |
| 688 | |
| 689 #elif defined(STM32L433xx) || defined(STM32L443xx) | |
| 690 | |
| 691 PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 | \ | |
| 692 RCC_PERIPHCLK_LPUART1 | RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_I2C2 | RCC_PERIPHCLK_I2C3 | \ | |
| 693 RCC_PERIPHCLK_LPTIM1 | RCC_PERIPHCLK_LPTIM2 | RCC_PERIPHCLK_SAI1 | RCC_PERIPHCLK_USB | \ | |
| 694 RCC_PERIPHCLK_SDMMC1 | RCC_PERIPHCLK_RNG | RCC_PERIPHCLK_ADC | RCC_PERIPHCLK_SWPMI1 | \ | |
| 695 RCC_PERIPHCLK_RTC ; | |
| 696 | |
| 697 #elif defined(STM32L451xx) | |
| 698 | |
| 699 PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 | RCC_PERIPHCLK_UART4 | \ | |
| 700 RCC_PERIPHCLK_LPUART1 | RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_I2C2 | RCC_PERIPHCLK_I2C3 | RCC_PERIPHCLK_I2C4 | \ | |
| 701 RCC_PERIPHCLK_LPTIM1 | RCC_PERIPHCLK_LPTIM2 | RCC_PERIPHCLK_SAI1 | \ | |
| 702 RCC_PERIPHCLK_SDMMC1 | RCC_PERIPHCLK_RNG | RCC_PERIPHCLK_ADC | RCC_PERIPHCLK_DFSDM1 | \ | |
| 703 RCC_PERIPHCLK_RTC ; | |
| 704 | |
| 705 #elif defined(STM32L452xx) || defined(STM32L462xx) | |
| 706 | |
| 707 PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 | RCC_PERIPHCLK_UART4 | \ | |
| 708 RCC_PERIPHCLK_LPUART1 | RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_I2C2 | RCC_PERIPHCLK_I2C3 | RCC_PERIPHCLK_I2C4 | \ | |
| 709 RCC_PERIPHCLK_LPTIM1 | RCC_PERIPHCLK_LPTIM2 | RCC_PERIPHCLK_SAI1 | RCC_PERIPHCLK_USB | \ | |
| 710 RCC_PERIPHCLK_SDMMC1 | RCC_PERIPHCLK_RNG | RCC_PERIPHCLK_ADC | RCC_PERIPHCLK_DFSDM1 | \ | |
| 711 RCC_PERIPHCLK_RTC ; | |
| 712 | |
| 713 #elif defined(STM32L471xx) | |
| 714 | |
| 715 PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 | RCC_PERIPHCLK_UART4 | RCC_PERIPHCLK_UART5 | \ | |
| 716 RCC_PERIPHCLK_LPUART1 | RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_I2C2 | RCC_PERIPHCLK_I2C3 | \ | |
| 717 RCC_PERIPHCLK_LPTIM1 | RCC_PERIPHCLK_LPTIM2 | RCC_PERIPHCLK_SAI1 | RCC_PERIPHCLK_SAI2 | \ | |
| 718 RCC_PERIPHCLK_SDMMC1 | RCC_PERIPHCLK_RNG | RCC_PERIPHCLK_ADC | RCC_PERIPHCLK_SWPMI1 | RCC_PERIPHCLK_DFSDM1 | \ | |
| 719 RCC_PERIPHCLK_RTC ; | |
| 720 | |
| 721 #elif defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx) | |
| 722 | |
| 723 PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 | RCC_PERIPHCLK_UART4 | RCC_PERIPHCLK_UART5 | \ | |
| 724 RCC_PERIPHCLK_LPUART1 | RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_I2C2 | RCC_PERIPHCLK_I2C3 | \ | |
| 725 RCC_PERIPHCLK_LPTIM1 | RCC_PERIPHCLK_LPTIM2 | RCC_PERIPHCLK_SAI1 | RCC_PERIPHCLK_SAI2 | RCC_PERIPHCLK_USB | \ | |
| 726 RCC_PERIPHCLK_SDMMC1 | RCC_PERIPHCLK_RNG | RCC_PERIPHCLK_ADC | RCC_PERIPHCLK_SWPMI1 | RCC_PERIPHCLK_DFSDM1 | \ | |
| 727 RCC_PERIPHCLK_RTC ; | |
| 728 | |
| 729 #endif /* STM32L431xx */ | |
| 730 | |
| 731 /* Get the PLLSAI1 Clock configuration -----------------------------------------------*/ | |
| 732 | |
| 733 PeriphClkInit->PLLSAI1.PLLSAI1Source = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> POSITION_VAL(RCC_PLLCFGR_PLLSRC)); | |
| 734 PeriphClkInit->PLLSAI1.PLLSAI1M = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> POSITION_VAL(RCC_PLLCFGR_PLLM)) + 1U; | |
| 735 PeriphClkInit->PLLSAI1.PLLSAI1N = (uint32_t)((RCC->PLLSAI1CFGR & RCC_PLLSAI1CFGR_PLLSAI1N) >> POSITION_VAL(RCC_PLLSAI1CFGR_PLLSAI1N)); | |
| 736 PeriphClkInit->PLLSAI1.PLLSAI1P = (uint32_t)(((RCC->PLLSAI1CFGR & RCC_PLLSAI1CFGR_PLLSAI1P) >> POSITION_VAL(RCC_PLLSAI1CFGR_PLLSAI1P)) << 4U) + 7U; | |
| 737 PeriphClkInit->PLLSAI1.PLLSAI1Q = (uint32_t)(((RCC->PLLSAI1CFGR & RCC_PLLSAI1CFGR_PLLSAI1Q) >> POSITION_VAL(RCC_PLLSAI1CFGR_PLLSAI1Q))+1U) * 2U; | |
| 738 PeriphClkInit->PLLSAI1.PLLSAI1R = (uint32_t)(((RCC->PLLSAI1CFGR & RCC_PLLSAI1CFGR_PLLSAI1R) >> POSITION_VAL(RCC_PLLSAI1CFGR_PLLSAI1R))+1U) * 2U; | |
| 739 | |
| 740 #if defined(RCC_PLLSAI2_SUPPORT) | |
| 741 | |
| 742 /* Get the PLLSAI2 Clock configuration -----------------------------------------------*/ | |
| 743 | |
| 744 PeriphClkInit->PLLSAI2.PLLSAI2Source = PeriphClkInit->PLLSAI1.PLLSAI1Source; | |
| 745 PeriphClkInit->PLLSAI2.PLLSAI2M = PeriphClkInit->PLLSAI1.PLLSAI1M; | |
| 746 PeriphClkInit->PLLSAI2.PLLSAI2N = (uint32_t)((RCC->PLLSAI2CFGR & RCC_PLLSAI2CFGR_PLLSAI2N) >> POSITION_VAL(RCC_PLLSAI2CFGR_PLLSAI2N)); | |
| 747 PeriphClkInit->PLLSAI2.PLLSAI2P = (uint32_t)(((RCC->PLLSAI2CFGR & RCC_PLLSAI2CFGR_PLLSAI2P) >> POSITION_VAL(RCC_PLLSAI2CFGR_PLLSAI2P)) << 4U) + 7U; | |
| 748 PeriphClkInit->PLLSAI2.PLLSAI2R = (uint32_t)(((RCC->PLLSAI2CFGR & RCC_PLLSAI2CFGR_PLLSAI2R)>> POSITION_VAL(RCC_PLLSAI2CFGR_PLLSAI2R))+1U) * 2U; | |
| 749 | |
| 750 #endif /* RCC_PLLSAI2_SUPPORT */ | |
| 751 | |
| 752 /* Get the USART1 clock source ---------------------------------------------*/ | |
| 753 PeriphClkInit->Usart1ClockSelection = __HAL_RCC_GET_USART1_SOURCE(); | |
| 754 /* Get the USART2 clock source ---------------------------------------------*/ | |
| 755 PeriphClkInit->Usart2ClockSelection = __HAL_RCC_GET_USART2_SOURCE(); | |
| 756 | |
| 757 #if defined(USART3) | |
| 758 /* Get the USART3 clock source ---------------------------------------------*/ | |
| 759 PeriphClkInit->Usart3ClockSelection = __HAL_RCC_GET_USART3_SOURCE(); | |
| 760 #endif /* USART3 */ | |
| 761 | |
| 762 #if defined(UART4) | |
| 763 /* Get the UART4 clock source ----------------------------------------------*/ | |
| 764 PeriphClkInit->Uart4ClockSelection = __HAL_RCC_GET_UART4_SOURCE(); | |
| 765 #endif /* UART4 */ | |
| 766 | |
| 767 #if defined(UART5) | |
| 768 /* Get the UART5 clock source ----------------------------------------------*/ | |
| 769 PeriphClkInit->Uart5ClockSelection = __HAL_RCC_GET_UART5_SOURCE(); | |
| 770 #endif /* UART5 */ | |
| 771 | |
| 772 /* Get the LPUART1 clock source --------------------------------------------*/ | |
| 773 PeriphClkInit->Lpuart1ClockSelection = __HAL_RCC_GET_LPUART1_SOURCE(); | |
| 774 | |
| 775 /* Get the I2C1 clock source -----------------------------------------------*/ | |
| 776 PeriphClkInit->I2c1ClockSelection = __HAL_RCC_GET_I2C1_SOURCE(); | |
| 777 | |
| 778 #if defined(I2C2) | |
| 779 /* Get the I2C2 clock source ----------------------------------------------*/ | |
| 780 PeriphClkInit->I2c2ClockSelection = __HAL_RCC_GET_I2C2_SOURCE(); | |
| 781 #endif /* I2C2 */ | |
| 782 | |
| 783 /* Get the I2C3 clock source -----------------------------------------------*/ | |
| 784 PeriphClkInit->I2c3ClockSelection = __HAL_RCC_GET_I2C3_SOURCE(); | |
| 785 | |
| 786 #if defined(I2C4) | |
| 787 /* Get the I2C4 clock source -----------------------------------------------*/ | |
| 788 PeriphClkInit->I2c4ClockSelection = __HAL_RCC_GET_I2C4_SOURCE(); | |
| 789 #endif /* I2C4 */ | |
| 790 | |
| 791 /* Get the LPTIM1 clock source ---------------------------------------------*/ | |
| 792 PeriphClkInit->Lptim1ClockSelection = __HAL_RCC_GET_LPTIM1_SOURCE(); | |
| 793 | |
| 794 /* Get the LPTIM2 clock source ---------------------------------------------*/ | |
| 795 PeriphClkInit->Lptim2ClockSelection = __HAL_RCC_GET_LPTIM2_SOURCE(); | |
| 796 | |
| 797 /* Get the SAI1 clock source -----------------------------------------------*/ | |
| 798 PeriphClkInit->Sai1ClockSelection = __HAL_RCC_GET_SAI1_SOURCE(); | |
| 799 | |
| 800 #if defined(SAI2) | |
| 801 /* Get the SAI2 clock source -----------------------------------------------*/ | |
| 802 PeriphClkInit->Sai2ClockSelection = __HAL_RCC_GET_SAI2_SOURCE(); | |
| 803 #endif /* SAI2 */ | |
| 804 | |
| 805 /* Get the RTC clock source ------------------------------------------------*/ | |
| 806 PeriphClkInit->RTCClockSelection = __HAL_RCC_GET_RTC_SOURCE(); | |
| 807 | |
| 808 #if defined(USB_OTG_FS) || defined(USB) | |
| 809 /* Get the USB clock source ------------------------------------------------*/ | |
| 810 PeriphClkInit->UsbClockSelection = __HAL_RCC_GET_USB_SOURCE(); | |
| 811 #endif /* USB_OTG_FS || USB */ | |
| 812 | |
| 813 #if defined(SDMMC1) | |
| 814 /* Get the SDMMC1 clock source ---------------------------------------------*/ | |
| 815 PeriphClkInit->Sdmmc1ClockSelection = __HAL_RCC_GET_SDMMC1_SOURCE(); | |
| 816 #endif /* SDMMC1 */ | |
| 817 | |
| 818 /* Get the RNG clock source ------------------------------------------------*/ | |
| 819 PeriphClkInit->RngClockSelection = __HAL_RCC_GET_RNG_SOURCE(); | |
| 820 | |
| 821 /* Get the ADC clock source ------------------------------------------------*/ | |
| 822 PeriphClkInit->AdcClockSelection = __HAL_RCC_GET_ADC_SOURCE(); | |
| 823 | |
| 824 #if defined(SWPMI1) | |
| 825 /* Get the SWPMI1 clock source ---------------------------------------------*/ | |
| 826 PeriphClkInit->Swpmi1ClockSelection = __HAL_RCC_GET_SWPMI1_SOURCE(); | |
| 827 #endif /* SWPMI1 */ | |
| 828 | |
| 829 #if defined(DFSDM1_Filter0) | |
| 830 /* Get the DFSDM1 clock source ---------------------------------------------*/ | |
| 831 PeriphClkInit->Dfsdm1ClockSelection = __HAL_RCC_GET_DFSDM1_SOURCE(); | |
| 832 #endif /* DFSDM1_Filter0 */ | |
| 833 } | |
| 834 | |
| 835 /** | |
| 836 * @brief Return the peripheral clock frequency for peripherals with clock source from PLLSAIs | |
| 837 * @note Return 0 if peripheral clock identifier not managed by this API | |
| 838 * @param PeriphClk Peripheral clock identifier | |
| 839 * This parameter can be one of the following values: | |
| 840 * @arg @ref RCC_PERIPHCLK_RTC RTC peripheral clock | |
| 841 * @arg @ref RCC_PERIPHCLK_ADC ADC peripheral clock | |
| 842 @if STM32L486xx | |
| 843 * @arg @ref RCC_PERIPHCLK_DFSDM1 DFSDM1 peripheral clock (only for devices with DFSDM) | |
| 844 @endif | |
| 845 @if STM32L462xx | |
| 846 * @arg @ref RCC_PERIPHCLK_DFSDM1 DFSDM1 peripheral clock (only for devices with DFSDM) | |
| 847 @endif | |
| 848 * @arg @ref RCC_PERIPHCLK_I2C1 I2C1 peripheral clock | |
| 849 * @arg @ref RCC_PERIPHCLK_I2C2 I2C2 peripheral clock | |
| 850 * @arg @ref RCC_PERIPHCLK_I2C3 I2C3 peripheral clock | |
| 851 @if STM32L462xx | |
| 852 * @arg @ref RCC_PERIPHCLK_I2C4 I2C4 peripheral clock (only for devices with I2C4) | |
| 853 @endif | |
| 854 * @arg @ref RCC_PERIPHCLK_LPTIM1 LPTIM1 peripheral clock | |
| 855 * @arg @ref RCC_PERIPHCLK_LPTIM2 LPTIM2 peripheral clock | |
| 856 * @arg @ref RCC_PERIPHCLK_LPUART1 LPUART1 peripheral clock | |
| 857 * @arg @ref RCC_PERIPHCLK_RNG RNG peripheral clock | |
| 858 * @arg @ref RCC_PERIPHCLK_SAI1 SAI1 peripheral clock | |
| 859 @if STM32L486xx | |
| 860 * @arg @ref RCC_PERIPHCLK_SAI2 SAI2 peripheral clock (only for devices with SAI2) | |
| 861 @endif | |
| 862 * @arg @ref RCC_PERIPHCLK_SDMMC1 SDMMC1 peripheral clock | |
| 863 @if STM32L443xx | |
| 864 * @arg @ref RCC_PERIPHCLK_SWPMI1 SWPMI1 peripheral clock (only for devices with SWPMI1) | |
| 865 @endif | |
| 866 @if STM32L486xx | |
| 867 * @arg @ref RCC_PERIPHCLK_SWPMI1 SWPMI1 peripheral clock (only for devices with SWPMI1) | |
| 868 @endif | |
| 869 * @arg @ref RCC_PERIPHCLK_USART1 USART1 peripheral clock | |
| 870 * @arg @ref RCC_PERIPHCLK_USART2 USART1 peripheral clock | |
| 871 * @arg @ref RCC_PERIPHCLK_USART3 USART1 peripheral clock | |
| 872 @if STM32L486xx | |
| 873 * @arg @ref RCC_PERIPHCLK_UART4 UART4 peripheral clock (only for devices with UART4) | |
| 874 * @arg @ref RCC_PERIPHCLK_UART5 UART5 peripheral clock (only for devices with UART5) | |
| 875 * @arg @ref RCC_PERIPHCLK_USB USB peripheral clock (only for devices with USB) | |
| 876 @endif | |
| 877 @if STM32L462xx | |
| 878 * @arg @ref RCC_PERIPHCLK_UART4 UART4 peripheral clock (only for devices with UART4) | |
| 879 * @arg @ref RCC_PERIPHCLK_USB USB peripheral clock (only for devices with USB) | |
| 880 @endif | |
| 881 * @retval Frequency in Hz | |
| 882 */ | |
| 883 uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) | |
| 884 { | |
| 885 uint32_t frequency = 0U; | |
| 886 uint32_t srcclk = 0U; | |
| 887 uint32_t pllvco = 0U, plln = 0U, pllp = 0U; | |
| 888 | |
| 889 /* Check the parameters */ | |
| 890 assert_param(IS_RCC_PERIPHCLOCK(PeriphClk)); | |
| 891 | |
| 892 if(PeriphClk == RCC_PERIPHCLK_RTC) | |
| 893 { | |
| 894 /* Get the current RTC source */ | |
| 895 srcclk = __HAL_RCC_GET_RTC_SOURCE(); | |
| 896 | |
| 897 /* Check if LSE is ready and if RTC clock selection is LSE */ | |
| 898 if ((srcclk == RCC_RTCCLKSOURCE_LSE) && (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY))) | |
| 899 { | |
| 900 frequency = LSE_VALUE; | |
| 901 } | |
| 902 /* Check if LSI is ready and if RTC clock selection is LSI */ | |
| 903 else if ((srcclk == RCC_RTCCLKSOURCE_LSI) && (HAL_IS_BIT_SET(RCC->CSR, RCC_CSR_LSIRDY))) | |
| 904 { | |
| 905 frequency = LSI_VALUE; | |
| 906 } | |
| 907 /* Check if HSE is ready and if RTC clock selection is HSI_DIV32*/ | |
| 908 else if ((srcclk == RCC_RTCCLKSOURCE_HSE_DIV32) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSERDY))) | |
| 909 { | |
| 910 frequency = HSE_VALUE / 32; | |
| 911 } | |
| 912 /* Clock not enabled for RTC*/ | |
| 913 else | |
| 914 { | |
| 915 frequency = 0U; | |
| 916 } | |
| 917 } | |
| 918 else | |
| 919 { | |
| 920 /* Other external peripheral clock source than RTC */ | |
| 921 | |
| 922 /* Compute PLL clock input */ | |
| 923 if(__HAL_RCC_GET_PLL_OSCSOURCE() == RCC_PLLSOURCE_MSI) /* MSI ? */ | |
| 924 { | |
| 925 if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_MSIRDY)) | |
| 926 { | |
| 927 pllvco = (1U << ((__HAL_RCC_GET_MSI_RANGE() >> 4U) - 4U)) * 1000000U; | |
| 928 } | |
| 929 else | |
| 930 { | |
| 931 pllvco = 0U; | |
| 932 } | |
| 933 } | |
| 934 else if(__HAL_RCC_GET_PLL_OSCSOURCE() == RCC_PLLSOURCE_HSI) /* HSI ? */ | |
| 935 { | |
| 936 if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY)) | |
| 937 { | |
| 938 pllvco = HSI_VALUE; | |
| 939 } | |
| 940 else | |
| 941 { | |
| 942 pllvco = 0U; | |
| 943 } | |
| 944 } | |
| 945 else if(__HAL_RCC_GET_PLL_OSCSOURCE() == RCC_PLLSOURCE_HSE) /* HSE ? */ | |
| 946 { | |
| 947 if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSERDY)) | |
| 948 { | |
| 949 pllvco = HSE_VALUE; | |
| 950 } | |
| 951 else | |
| 952 { | |
| 953 pllvco = 0U; | |
| 954 } | |
| 955 } | |
| 956 else /* No source */ | |
| 957 { | |
| 958 pllvco = 0U; | |
| 959 } | |
| 960 | |
| 961 /* f(PLL Source) / PLLM */ | |
| 962 pllvco = (pllvco / ((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM) >> POSITION_VAL(RCC_PLLCFGR_PLLM)) + 1U)); | |
| 963 | |
| 964 switch(PeriphClk) | |
| 965 { | |
| 966 #if defined(SAI2) | |
| 967 | |
| 968 case RCC_PERIPHCLK_SAI1: | |
| 969 case RCC_PERIPHCLK_SAI2: | |
| 970 | |
| 971 if(PeriphClk == RCC_PERIPHCLK_SAI1) | |
| 972 { | |
| 973 srcclk = __HAL_RCC_GET_SAI1_SOURCE(); | |
| 974 | |
| 975 if(srcclk == RCC_SAI1CLKSOURCE_PIN) | |
| 976 { | |
| 977 frequency = EXTERNAL_SAI1_CLOCK_VALUE; | |
| 978 } | |
| 979 /* Else, PLL clock output to check below */ | |
| 980 } | |
| 981 else /* RCC_PERIPHCLK_SAI2 */ | |
| 982 { | |
| 983 srcclk = __HAL_RCC_GET_SAI2_SOURCE(); | |
| 984 | |
| 985 if(srcclk == RCC_SAI2CLKSOURCE_PIN) | |
| 986 { | |
| 987 frequency = EXTERNAL_SAI2_CLOCK_VALUE; | |
| 988 } | |
| 989 /* Else, PLL clock output to check below */ | |
| 990 } | |
| 991 | |
| 992 #else | |
| 993 | |
| 994 case RCC_PERIPHCLK_SAI1: | |
| 995 | |
| 996 if(PeriphClk == RCC_PERIPHCLK_SAI1) | |
| 997 { | |
| 998 srcclk = READ_BIT(RCC->CCIPR, RCC_CCIPR_SAI1SEL); | |
| 999 | |
| 1000 if(srcclk == RCC_SAI1CLKSOURCE_PIN) | |
| 1001 { | |
| 1002 frequency = EXTERNAL_SAI1_CLOCK_VALUE; | |
| 1003 } | |
| 1004 /* Else, PLL clock output to check below */ | |
| 1005 } | |
| 1006 | |
| 1007 #endif /* SAI2 */ | |
| 1008 | |
| 1009 if(frequency == 0U) | |
| 1010 { | |
| 1011 #if defined(SAI2) | |
| 1012 if((srcclk == RCC_SAI1CLKSOURCE_PLL) || (srcclk == RCC_SAI2CLKSOURCE_PLL)) | |
| 1013 { | |
| 1014 if(__HAL_RCC_GET_PLLCLKOUT_CONFIG(RCC_PLL_SAI3CLK) != RESET) | |
| 1015 { | |
| 1016 /* f(PLLSAI3CLK) = f(VCO input) * PLLN / PLLP */ | |
| 1017 plln = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLN) >> POSITION_VAL(RCC_PLLCFGR_PLLN); | |
| 1018 #if defined(RCC_PLLP_DIV_2_31_SUPPORT) | |
| 1019 pllp = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLPDIV) >> POSITION_VAL(RCC_PLLCFGR_PLLPDIV); | |
| 1020 #endif | |
| 1021 if(pllp == 0U) | |
| 1022 { | |
| 1023 if(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLP) != RESET) | |
| 1024 { | |
| 1025 pllp = 17U; | |
| 1026 } | |
| 1027 else | |
| 1028 { | |
| 1029 pllp = 7U; | |
| 1030 } | |
| 1031 } | |
| 1032 frequency = (pllvco * plln) / pllp; | |
| 1033 } | |
| 1034 } | |
| 1035 else if(srcclk == 0U) /* RCC_SAI1CLKSOURCE_PLLSAI1 || RCC_SAI2CLKSOURCE_PLLSAI1 */ | |
| 1036 { | |
| 1037 if(__HAL_RCC_GET_PLLSAI1CLKOUT_CONFIG(RCC_PLLSAI1_SAI1CLK) != RESET) | |
| 1038 { | |
| 1039 /* f(PLLSAI1CLK) = f(VCOSAI1 input) * PLLSAI1N / PLLSAI1P */ | |
| 1040 plln = READ_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1N) >> POSITION_VAL(RCC_PLLSAI1CFGR_PLLSAI1N); | |
| 1041 #if defined(RCC_PLLSAI1P_DIV_2_31_SUPPORT) | |
| 1042 pllp = READ_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1PDIV) >> POSITION_VAL(RCC_PLLSAI1CFGR_PLLSAI1PDIV); | |
| 1043 #endif | |
| 1044 if(pllp == 0U) | |
| 1045 { | |
| 1046 if(READ_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1P) != RESET) | |
| 1047 { | |
| 1048 pllp = 17U; | |
| 1049 } | |
| 1050 else | |
| 1051 { | |
| 1052 pllp = 7U; | |
| 1053 } | |
| 1054 } | |
| 1055 frequency = (pllvco * plln) / pllp; | |
| 1056 } | |
| 1057 } | |
| 1058 #else | |
| 1059 if(srcclk == RCC_SAI1CLKSOURCE_PLL) | |
| 1060 { | |
| 1061 if(__HAL_RCC_GET_PLLCLKOUT_CONFIG(RCC_PLL_SAI2CLK) != RESET) | |
| 1062 { | |
| 1063 /* f(PLLSAI2CLK) = f(VCO input) * PLLN / PLLP */ | |
| 1064 plln = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLN) >> POSITION_VAL(RCC_PLLCFGR_PLLN); | |
| 1065 #if defined(RCC_PLLP_DIV_2_31_SUPPORT) | |
| 1066 pllp = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLPDIV) >> POSITION_VAL(RCC_PLLCFGR_PLLPDIV); | |
| 1067 #endif | |
| 1068 if(pllp == 0U) | |
| 1069 { | |
| 1070 if(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLP) != RESET) | |
| 1071 { | |
| 1072 pllp = 17U; | |
| 1073 } | |
| 1074 else | |
| 1075 { | |
| 1076 pllp = 7U; | |
| 1077 } | |
| 1078 } | |
| 1079 | |
| 1080 frequency = (pllvco * plln) / pllp; | |
| 1081 } | |
| 1082 else if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY)) | |
| 1083 { | |
| 1084 /* HSI automatically selected as clock source if PLLs not enabled */ | |
| 1085 frequency = HSI_VALUE; | |
| 1086 } | |
| 1087 else | |
| 1088 { | |
| 1089 /* No clock source */ | |
| 1090 frequency = 0U; | |
| 1091 } | |
| 1092 } | |
| 1093 else if(srcclk == RCC_SAI1CLKSOURCE_PLLSAI1) | |
| 1094 { | |
| 1095 if(__HAL_RCC_GET_PLLSAI1CLKOUT_CONFIG(RCC_PLLSAI1_SAI1CLK) != RESET) | |
| 1096 { | |
| 1097 /* f(PLLSAI1CLK) = f(VCOSAI1 input) * PLLSAI1N / PLLSAI1P */ | |
| 1098 plln = READ_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1N) >> POSITION_VAL(RCC_PLLSAI1CFGR_PLLSAI1N); | |
| 1099 #if defined(RCC_PLLSAI1P_DIV_2_31_SUPPORT) | |
| 1100 pllp = READ_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1PDIV) >> POSITION_VAL(RCC_PLLSAI1CFGR_PLLSAI1PDIV); | |
| 1101 #endif | |
| 1102 if(pllp == 0U) | |
| 1103 { | |
| 1104 if(READ_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1P) != RESET) | |
| 1105 { | |
| 1106 pllp = 17U; | |
| 1107 } | |
| 1108 else | |
| 1109 { | |
| 1110 pllp = 7U; | |
| 1111 } | |
| 1112 } | |
| 1113 | |
| 1114 frequency = (pllvco * plln) / pllp; | |
| 1115 } | |
| 1116 else if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY)) | |
| 1117 { | |
| 1118 /* HSI automatically selected as clock source if PLLs not enabled */ | |
| 1119 frequency = HSI_VALUE; | |
| 1120 } | |
| 1121 else | |
| 1122 { | |
| 1123 /* No clock source */ | |
| 1124 frequency = 0U; | |
| 1125 } | |
| 1126 } | |
| 1127 #endif /* SAI2 */ | |
| 1128 | |
| 1129 #if defined(RCC_PLLSAI2_SUPPORT) | |
| 1130 | |
| 1131 else if((srcclk == RCC_SAI1CLKSOURCE_PLLSAI2) || (srcclk == RCC_SAI2CLKSOURCE_PLLSAI2)) | |
| 1132 { | |
| 1133 if(__HAL_RCC_GET_PLLSAI2CLKOUT_CONFIG(RCC_PLLSAI2_SAI2CLK) != RESET) | |
| 1134 { | |
| 1135 /* f(PLLSAI2CLK) = f(VCOSAI2 input) * PLLSAI2N / PLLSAI2P */ | |
| 1136 plln = READ_BIT(RCC->PLLSAI2CFGR, RCC_PLLSAI2CFGR_PLLSAI2N) >> POSITION_VAL(RCC_PLLSAI2CFGR_PLLSAI2N); | |
| 1137 if(pllp == 0U) | |
| 1138 { | |
| 1139 if(READ_BIT(RCC->PLLSAI2CFGR, RCC_PLLSAI2CFGR_PLLSAI2P) != RESET) | |
| 1140 { | |
| 1141 pllp = 17U; | |
| 1142 } | |
| 1143 else | |
| 1144 { | |
| 1145 pllp = 7U; | |
| 1146 } | |
| 1147 } | |
| 1148 frequency = (pllvco * plln) / pllp; | |
| 1149 } | |
| 1150 } | |
| 1151 | |
| 1152 #endif /* RCC_PLLSAI2_SUPPORT */ | |
| 1153 | |
| 1154 else | |
| 1155 { | |
| 1156 /* No clock source */ | |
| 1157 frequency = 0U; | |
| 1158 } | |
| 1159 } | |
| 1160 break; | |
| 1161 | |
| 1162 #if defined(USB_OTG_FS) || defined(USB) | |
| 1163 | |
| 1164 case RCC_PERIPHCLK_USB: | |
| 1165 | |
| 1166 #endif /* USB_OTG_FS || USB */ | |
| 1167 | |
| 1168 case RCC_PERIPHCLK_RNG: | |
| 1169 | |
| 1170 #if defined(SDMMC1) | |
| 1171 | |
| 1172 case RCC_PERIPHCLK_SDMMC1: | |
| 1173 | |
| 1174 #endif /* SDMMC1 */ | |
| 1175 | |
| 1176 srcclk = READ_BIT(RCC->CCIPR, RCC_CCIPR_CLK48SEL); | |
| 1177 | |
| 1178 if(srcclk == RCC_CCIPR_CLK48SEL) /* MSI ? */ | |
| 1179 { | |
| 1180 if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_MSIRDY)) | |
| 1181 { | |
| 1182 frequency = (1U << ((__HAL_RCC_GET_MSI_RANGE() >> 4U) - 4U)) * 1000000U; | |
| 1183 } | |
| 1184 else | |
| 1185 { | |
| 1186 frequency = 0U; | |
| 1187 } | |
| 1188 } | |
| 1189 else if(srcclk == RCC_CCIPR_CLK48SEL_1) /* PLL ? */ | |
| 1190 { | |
| 1191 if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLRDY) && HAL_IS_BIT_SET(RCC->PLLCFGR, RCC_PLLCFGR_PLLQEN)) | |
| 1192 { | |
| 1193 /* f(PLL48M1CLK) = f(VCO input) * PLLN / PLLQ */ | |
| 1194 plln = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLN) >> POSITION_VAL(RCC_PLLCFGR_PLLN); | |
| 1195 frequency = (pllvco * plln) / (((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLQ) >> POSITION_VAL(RCC_PLLCFGR_PLLQ)) + 1U) << 1U); | |
| 1196 } | |
| 1197 else | |
| 1198 { | |
| 1199 frequency = 0U; | |
| 1200 } | |
| 1201 } | |
| 1202 else if(srcclk == RCC_CCIPR_CLK48SEL_0) /* PLLSAI1 ? */ | |
| 1203 { | |
| 1204 if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLSAI1RDY) && HAL_IS_BIT_SET(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1QEN)) | |
| 1205 { | |
| 1206 /* f(PLL48M2CLK) = f(VCOSAI1 input) * PLLSAI1N / PLLSAI1Q */ | |
| 1207 plln = READ_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1N) >> POSITION_VAL(RCC_PLLSAI1CFGR_PLLSAI1N); | |
| 1208 frequency = (pllvco * plln) / (((READ_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1Q) >> POSITION_VAL(RCC_PLLSAI1CFGR_PLLSAI1Q)) + 1U) << 1U); | |
| 1209 } | |
| 1210 else | |
| 1211 { | |
| 1212 frequency = 0U; | |
| 1213 } | |
| 1214 } | |
| 1215 #if defined(RCC_HSI48_SUPPORT) | |
| 1216 else if((srcclk == 0U) && (HAL_IS_BIT_SET(RCC->CRRCR, RCC_CRRCR_HSI48RDY))) /* HSI48 ? */ | |
| 1217 { | |
| 1218 frequency = HSI48_VALUE; | |
| 1219 } | |
| 1220 else /* No clock source */ | |
| 1221 { | |
| 1222 frequency = 0U; | |
| 1223 } | |
| 1224 #else | |
| 1225 else /* No clock source */ | |
| 1226 { | |
| 1227 frequency = 0U; | |
| 1228 } | |
| 1229 #endif /* RCC_HSI48_SUPPORT */ | |
| 1230 break; | |
| 1231 | |
| 1232 case RCC_PERIPHCLK_USART1: | |
| 1233 /* Get the current USART1 source */ | |
| 1234 srcclk = __HAL_RCC_GET_USART1_SOURCE(); | |
| 1235 | |
| 1236 if(srcclk == RCC_USART1CLKSOURCE_PCLK2) | |
| 1237 { | |
| 1238 frequency = HAL_RCC_GetPCLK2Freq(); | |
| 1239 } | |
| 1240 else if(srcclk == RCC_USART1CLKSOURCE_SYSCLK) | |
| 1241 { | |
| 1242 frequency = HAL_RCC_GetSysClockFreq(); | |
| 1243 } | |
| 1244 else if((srcclk == RCC_USART1CLKSOURCE_HSI) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))) | |
| 1245 { | |
| 1246 frequency = HSI_VALUE; | |
| 1247 } | |
| 1248 else if((srcclk == RCC_USART1CLKSOURCE_LSE) && (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY))) | |
| 1249 { | |
| 1250 frequency = LSE_VALUE; | |
| 1251 } | |
| 1252 /* Clock not enabled for USART1 */ | |
| 1253 else | |
| 1254 { | |
| 1255 frequency = 0U; | |
| 1256 } | |
| 1257 break; | |
| 1258 | |
| 1259 case RCC_PERIPHCLK_USART2: | |
| 1260 /* Get the current USART2 source */ | |
| 1261 srcclk = __HAL_RCC_GET_USART2_SOURCE(); | |
| 1262 | |
| 1263 if(srcclk == RCC_USART2CLKSOURCE_PCLK1) | |
| 1264 { | |
| 1265 frequency = HAL_RCC_GetPCLK1Freq(); | |
| 1266 } | |
| 1267 else if(srcclk == RCC_USART2CLKSOURCE_SYSCLK) | |
| 1268 { | |
| 1269 frequency = HAL_RCC_GetSysClockFreq(); | |
| 1270 } | |
| 1271 else if((srcclk == RCC_USART2CLKSOURCE_HSI) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))) | |
| 1272 { | |
| 1273 frequency = HSI_VALUE; | |
| 1274 } | |
| 1275 else if((srcclk == RCC_USART2CLKSOURCE_LSE) && (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY))) | |
| 1276 { | |
| 1277 frequency = LSE_VALUE; | |
| 1278 } | |
| 1279 /* Clock not enabled for USART2 */ | |
| 1280 else | |
| 1281 { | |
| 1282 frequency = 0U; | |
| 1283 } | |
| 1284 break; | |
| 1285 | |
| 1286 #if defined(USART3) | |
| 1287 | |
| 1288 case RCC_PERIPHCLK_USART3: | |
| 1289 /* Get the current USART3 source */ | |
| 1290 srcclk = __HAL_RCC_GET_USART3_SOURCE(); | |
| 1291 | |
| 1292 if(srcclk == RCC_USART3CLKSOURCE_PCLK1) | |
| 1293 { | |
| 1294 frequency = HAL_RCC_GetPCLK1Freq(); | |
| 1295 } | |
| 1296 else if(srcclk == RCC_USART3CLKSOURCE_SYSCLK) | |
| 1297 { | |
| 1298 frequency = HAL_RCC_GetSysClockFreq(); | |
| 1299 } | |
| 1300 else if((srcclk == RCC_USART3CLKSOURCE_HSI) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))) | |
| 1301 { | |
| 1302 frequency = HSI_VALUE; | |
| 1303 } | |
| 1304 else if((srcclk == RCC_USART3CLKSOURCE_LSE) && (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY))) | |
| 1305 { | |
| 1306 frequency = LSE_VALUE; | |
| 1307 } | |
| 1308 /* Clock not enabled for USART3 */ | |
| 1309 else | |
| 1310 { | |
| 1311 frequency = 0U; | |
| 1312 } | |
| 1313 break; | |
| 1314 | |
| 1315 #endif /* USART3 */ | |
| 1316 | |
| 1317 #if defined(UART4) | |
| 1318 | |
| 1319 case RCC_PERIPHCLK_UART4: | |
| 1320 /* Get the current UART4 source */ | |
| 1321 srcclk = __HAL_RCC_GET_UART4_SOURCE(); | |
| 1322 | |
| 1323 if(srcclk == RCC_UART4CLKSOURCE_PCLK1) | |
| 1324 { | |
| 1325 frequency = HAL_RCC_GetPCLK1Freq(); | |
| 1326 } | |
| 1327 else if(srcclk == RCC_UART4CLKSOURCE_SYSCLK) | |
| 1328 { | |
| 1329 frequency = HAL_RCC_GetSysClockFreq(); | |
| 1330 } | |
| 1331 else if((srcclk == RCC_UART4CLKSOURCE_HSI) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))) | |
| 1332 { | |
| 1333 frequency = HSI_VALUE; | |
| 1334 } | |
| 1335 else if((srcclk == RCC_UART4CLKSOURCE_LSE) && (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY))) | |
| 1336 { | |
| 1337 frequency = LSE_VALUE; | |
| 1338 } | |
| 1339 /* Clock not enabled for UART4 */ | |
| 1340 else | |
| 1341 { | |
| 1342 frequency = 0U; | |
| 1343 } | |
| 1344 break; | |
| 1345 | |
| 1346 #endif /* UART4 */ | |
| 1347 | |
| 1348 #if defined(UART5) | |
| 1349 | |
| 1350 case RCC_PERIPHCLK_UART5: | |
| 1351 /* Get the current UART5 source */ | |
| 1352 srcclk = __HAL_RCC_GET_UART5_SOURCE(); | |
| 1353 | |
| 1354 if(srcclk == RCC_UART5CLKSOURCE_PCLK1) | |
| 1355 { | |
| 1356 frequency = HAL_RCC_GetPCLK1Freq(); | |
| 1357 } | |
| 1358 else if(srcclk == RCC_UART5CLKSOURCE_SYSCLK) | |
| 1359 { | |
| 1360 frequency = HAL_RCC_GetSysClockFreq(); | |
| 1361 } | |
| 1362 else if((srcclk == RCC_UART5CLKSOURCE_HSI) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))) | |
| 1363 { | |
| 1364 frequency = HSI_VALUE; | |
| 1365 } | |
| 1366 else if((srcclk == RCC_UART5CLKSOURCE_LSE) && (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY))) | |
| 1367 { | |
| 1368 frequency = LSE_VALUE; | |
| 1369 } | |
| 1370 /* Clock not enabled for UART5 */ | |
| 1371 else | |
| 1372 { | |
| 1373 frequency = 0U; | |
| 1374 } | |
| 1375 break; | |
| 1376 | |
| 1377 #endif /* UART5 */ | |
| 1378 | |
| 1379 case RCC_PERIPHCLK_LPUART1: | |
| 1380 /* Get the current LPUART1 source */ | |
| 1381 srcclk = __HAL_RCC_GET_LPUART1_SOURCE(); | |
| 1382 | |
| 1383 if(srcclk == RCC_LPUART1CLKSOURCE_PCLK1) | |
| 1384 { | |
| 1385 frequency = HAL_RCC_GetPCLK1Freq(); | |
| 1386 } | |
| 1387 else if(srcclk == RCC_LPUART1CLKSOURCE_SYSCLK) | |
| 1388 { | |
| 1389 frequency = HAL_RCC_GetSysClockFreq(); | |
| 1390 } | |
| 1391 else if((srcclk == RCC_LPUART1CLKSOURCE_HSI) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))) | |
| 1392 { | |
| 1393 frequency = HSI_VALUE; | |
| 1394 } | |
| 1395 else if((srcclk == RCC_LPUART1CLKSOURCE_LSE) && (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY))) | |
| 1396 { | |
| 1397 frequency = LSE_VALUE; | |
| 1398 } | |
| 1399 /* Clock not enabled for LPUART1 */ | |
| 1400 else | |
| 1401 { | |
| 1402 frequency = 0U; | |
| 1403 } | |
| 1404 break; | |
| 1405 | |
| 1406 case RCC_PERIPHCLK_ADC: | |
| 1407 | |
| 1408 srcclk = __HAL_RCC_GET_ADC_SOURCE(); | |
| 1409 | |
| 1410 if(srcclk == RCC_ADCCLKSOURCE_SYSCLK) | |
| 1411 { | |
| 1412 frequency = HAL_RCC_GetSysClockFreq(); | |
| 1413 } | |
| 1414 else if(srcclk == RCC_ADCCLKSOURCE_PLLSAI1) | |
| 1415 { | |
| 1416 if(__HAL_RCC_GET_PLLSAI1CLKOUT_CONFIG(RCC_PLLSAI1_ADC1CLK) != RESET) | |
| 1417 { | |
| 1418 /* f(PLLADC1CLK) = f(VCOSAI1 input) * PLLSAI1N / PLLSAI1R */ | |
| 1419 plln = READ_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1N) >> POSITION_VAL(RCC_PLLSAI1CFGR_PLLSAI1N); | |
| 1420 frequency = (pllvco * plln) / (((READ_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1R) >> POSITION_VAL(RCC_PLLSAI1CFGR_PLLSAI1R)) + 1U) << 1U); | |
| 1421 } | |
| 1422 } | |
| 1423 #if defined(STM32L471xx) || defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx) | |
| 1424 else if(srcclk == RCC_ADCCLKSOURCE_PLLSAI2) | |
| 1425 { | |
| 1426 if(__HAL_RCC_GET_PLLSAI2CLKOUT_CONFIG(RCC_PLLSAI2_ADC2CLK) != RESET) | |
| 1427 { | |
| 1428 /* f(PLLADC2CLK) = f(VCOSAI2 input) * PLLSAI2N / PLLSAI2R */ | |
| 1429 plln = READ_BIT(RCC->PLLSAI2CFGR, RCC_PLLSAI2CFGR_PLLSAI2N) >> POSITION_VAL(RCC_PLLSAI2CFGR_PLLSAI2N); | |
| 1430 frequency = (pllvco * plln) / (((READ_BIT(RCC->PLLSAI2CFGR, RCC_PLLSAI2CFGR_PLLSAI2R) >> POSITION_VAL(RCC_PLLSAI2CFGR_PLLSAI2R)) + 1U) << 1U); | |
| 1431 } | |
| 1432 } | |
| 1433 #endif /* STM32L471xx || STM32L475xx || STM32L476xx || STM32L485xx || STM32L486xx */ | |
| 1434 /* Clock not enabled for ADC */ | |
| 1435 else | |
| 1436 { | |
| 1437 frequency = 0U; | |
| 1438 } | |
| 1439 break; | |
| 1440 | |
| 1441 #if defined(DFSDM1_Filter0) | |
| 1442 | |
| 1443 case RCC_PERIPHCLK_DFSDM1: | |
| 1444 /* Get the current DFSDM1 source */ | |
| 1445 srcclk = __HAL_RCC_GET_DFSDM1_SOURCE(); | |
| 1446 | |
| 1447 if(srcclk == RCC_DFSDM1CLKSOURCE_PCLK) | |
| 1448 { | |
| 1449 frequency = HAL_RCC_GetPCLK1Freq(); | |
| 1450 } | |
| 1451 else | |
| 1452 { | |
| 1453 frequency = HAL_RCC_GetSysClockFreq(); | |
| 1454 } | |
| 1455 break; | |
| 1456 | |
| 1457 #endif /* DFSDM1_Filter0 */ | |
| 1458 | |
| 1459 case RCC_PERIPHCLK_I2C1: | |
| 1460 /* Get the current I2C1 source */ | |
| 1461 srcclk = __HAL_RCC_GET_I2C1_SOURCE(); | |
| 1462 | |
| 1463 if(srcclk == RCC_I2C1CLKSOURCE_PCLK1) | |
| 1464 { | |
| 1465 frequency = HAL_RCC_GetPCLK1Freq(); | |
| 1466 } | |
| 1467 else if(srcclk == RCC_I2C1CLKSOURCE_SYSCLK) | |
| 1468 { | |
| 1469 frequency = HAL_RCC_GetSysClockFreq(); | |
| 1470 } | |
| 1471 else if((srcclk == RCC_I2C1CLKSOURCE_HSI) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))) | |
| 1472 { | |
| 1473 frequency = HSI_VALUE; | |
| 1474 } | |
| 1475 /* Clock not enabled for I2C1 */ | |
| 1476 else | |
| 1477 { | |
| 1478 frequency = 0U; | |
| 1479 } | |
| 1480 break; | |
| 1481 | |
| 1482 #if defined(I2C2) | |
| 1483 | |
| 1484 case RCC_PERIPHCLK_I2C2: | |
| 1485 /* Get the current I2C2 source */ | |
| 1486 srcclk = __HAL_RCC_GET_I2C2_SOURCE(); | |
| 1487 | |
| 1488 if(srcclk == RCC_I2C2CLKSOURCE_PCLK1) | |
| 1489 { | |
| 1490 frequency = HAL_RCC_GetPCLK1Freq(); | |
| 1491 } | |
| 1492 else if(srcclk == RCC_I2C2CLKSOURCE_SYSCLK) | |
| 1493 { | |
| 1494 frequency = HAL_RCC_GetSysClockFreq(); | |
| 1495 } | |
| 1496 else if((srcclk == RCC_I2C2CLKSOURCE_HSI) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))) | |
| 1497 { | |
| 1498 frequency = HSI_VALUE; | |
| 1499 } | |
| 1500 /* Clock not enabled for I2C2 */ | |
| 1501 else | |
| 1502 { | |
| 1503 frequency = 0U; | |
| 1504 } | |
| 1505 break; | |
| 1506 | |
| 1507 #endif /* I2C2 */ | |
| 1508 | |
| 1509 case RCC_PERIPHCLK_I2C3: | |
| 1510 /* Get the current I2C3 source */ | |
| 1511 srcclk = __HAL_RCC_GET_I2C3_SOURCE(); | |
| 1512 | |
| 1513 if(srcclk == RCC_I2C3CLKSOURCE_PCLK1) | |
| 1514 { | |
| 1515 frequency = HAL_RCC_GetPCLK1Freq(); | |
| 1516 } | |
| 1517 else if(srcclk == RCC_I2C3CLKSOURCE_SYSCLK) | |
| 1518 { | |
| 1519 frequency = HAL_RCC_GetSysClockFreq(); | |
| 1520 } | |
| 1521 else if((srcclk == RCC_I2C3CLKSOURCE_HSI) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))) | |
| 1522 { | |
| 1523 frequency = HSI_VALUE; | |
| 1524 } | |
| 1525 /* Clock not enabled for I2C3 */ | |
| 1526 else | |
| 1527 { | |
| 1528 frequency = 0U; | |
| 1529 } | |
| 1530 break; | |
| 1531 | |
| 1532 #if defined(I2C4) | |
| 1533 | |
| 1534 case RCC_PERIPHCLK_I2C4: | |
| 1535 /* Get the current I2C4 source */ | |
| 1536 srcclk = __HAL_RCC_GET_I2C4_SOURCE(); | |
| 1537 | |
| 1538 if(srcclk == RCC_I2C4CLKSOURCE_PCLK1) | |
| 1539 { | |
| 1540 frequency = HAL_RCC_GetPCLK1Freq(); | |
| 1541 } | |
| 1542 else if(srcclk == RCC_I2C4CLKSOURCE_SYSCLK) | |
| 1543 { | |
| 1544 frequency = HAL_RCC_GetSysClockFreq(); | |
| 1545 } | |
| 1546 else if((srcclk == RCC_I2C4CLKSOURCE_HSI) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))) | |
| 1547 { | |
| 1548 frequency = HSI_VALUE; | |
| 1549 } | |
| 1550 /* Clock not enabled for I2C4 */ | |
| 1551 else | |
| 1552 { | |
| 1553 frequency = 0U; | |
| 1554 } | |
| 1555 break; | |
| 1556 | |
| 1557 #endif /* I2C4 */ | |
| 1558 | |
| 1559 case RCC_PERIPHCLK_LPTIM1: | |
| 1560 /* Get the current LPTIM1 source */ | |
| 1561 srcclk = __HAL_RCC_GET_LPTIM1_SOURCE(); | |
| 1562 | |
| 1563 if(srcclk == RCC_LPTIM1CLKSOURCE_PCLK) | |
| 1564 { | |
| 1565 frequency = HAL_RCC_GetPCLK1Freq(); | |
| 1566 } | |
| 1567 else if((srcclk == RCC_LPTIM1CLKSOURCE_LSI) && (HAL_IS_BIT_SET(RCC->CSR, RCC_CSR_LSIRDY))) | |
| 1568 { | |
| 1569 frequency = LSI_VALUE; | |
| 1570 } | |
| 1571 else if((srcclk == RCC_LPTIM1CLKSOURCE_HSI) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))) | |
| 1572 { | |
| 1573 frequency = HSI_VALUE; | |
| 1574 } | |
| 1575 else if ((srcclk == RCC_LPTIM1CLKSOURCE_LSE) && (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY))) | |
| 1576 { | |
| 1577 frequency = LSE_VALUE; | |
| 1578 } | |
| 1579 /* Clock not enabled for LPTIM1 */ | |
| 1580 else | |
| 1581 { | |
| 1582 frequency = 0U; | |
| 1583 } | |
| 1584 break; | |
| 1585 | |
| 1586 case RCC_PERIPHCLK_LPTIM2: | |
| 1587 /* Get the current LPTIM2 source */ | |
| 1588 srcclk = __HAL_RCC_GET_LPTIM2_SOURCE(); | |
| 1589 | |
| 1590 if(srcclk == RCC_LPTIM2CLKSOURCE_PCLK) | |
| 1591 { | |
| 1592 frequency = HAL_RCC_GetPCLK1Freq(); | |
| 1593 } | |
| 1594 else if((srcclk == RCC_LPTIM2CLKSOURCE_LSI) && (HAL_IS_BIT_SET(RCC->CSR, RCC_CSR_LSIRDY))) | |
| 1595 { | |
| 1596 frequency = LSI_VALUE; | |
| 1597 } | |
| 1598 else if((srcclk == RCC_LPTIM2CLKSOURCE_HSI) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))) | |
| 1599 { | |
| 1600 frequency = HSI_VALUE; | |
| 1601 } | |
| 1602 else if ((srcclk == RCC_LPTIM2CLKSOURCE_LSE) && (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY))) | |
| 1603 { | |
| 1604 frequency = LSE_VALUE; | |
| 1605 } | |
| 1606 /* Clock not enabled for LPTIM2 */ | |
| 1607 else | |
| 1608 { | |
| 1609 frequency = 0U; | |
| 1610 } | |
| 1611 break; | |
| 1612 | |
| 1613 #if defined(SWPMI1) | |
| 1614 | |
| 1615 case RCC_PERIPHCLK_SWPMI1: | |
| 1616 /* Get the current SWPMI1 source */ | |
| 1617 srcclk = __HAL_RCC_GET_SWPMI1_SOURCE(); | |
| 1618 | |
| 1619 if(srcclk == RCC_SWPMI1CLKSOURCE_PCLK) | |
| 1620 { | |
| 1621 frequency = HAL_RCC_GetPCLK1Freq(); | |
| 1622 } | |
| 1623 else if((srcclk == RCC_SWPMI1CLKSOURCE_HSI) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))) | |
| 1624 { | |
| 1625 frequency = HSI_VALUE; | |
| 1626 } | |
| 1627 /* Clock not enabled for SWPMI1 */ | |
| 1628 else | |
| 1629 { | |
| 1630 frequency = 0U; | |
| 1631 } | |
| 1632 break; | |
| 1633 | |
| 1634 #endif /* SWPMI1 */ | |
| 1635 | |
| 1636 default: | |
| 1637 break; | |
| 1638 } | |
| 1639 } | |
| 1640 | |
| 1641 return(frequency); | |
| 1642 } | |
| 1643 | |
| 1644 /** | |
| 1645 * @} | |
| 1646 */ | |
| 1647 | |
| 1648 /** @defgroup RCCEx_Exported_Functions_Group2 Extended Clock management functions | |
| 1649 * @brief Extended Clock management functions | |
| 1650 * | |
| 1651 @verbatim | |
| 1652 =============================================================================== | |
| 1653 ##### Extended clock management functions ##### | |
| 1654 =============================================================================== | |
| 1655 [..] | |
| 1656 This subsection provides a set of functions allowing to control the | |
| 1657 activation or deactivation of MSI PLL-mode, PLLSAI1, PLLSAI2, LSE CSS, | |
| 1658 Low speed clock output and clock after wake-up from STOP mode. | |
| 1659 @endverbatim | |
| 1660 * @{ | |
| 1661 */ | |
| 1662 | |
| 1663 /** | |
| 1664 * @brief Enable PLLSAI1. | |
| 1665 * @param PLLSAI1Init pointer to an RCC_PLLSAI1InitTypeDef structure that | |
| 1666 * contains the configuration information for the PLLSAI1 | |
| 1667 * @retval HAL status | |
| 1668 */ | |
| 1669 HAL_StatusTypeDef HAL_RCCEx_EnablePLLSAI1(RCC_PLLSAI1InitTypeDef *PLLSAI1Init) | |
| 1670 { | |
| 1671 uint32_t tickstart = 0U; | |
| 1672 HAL_StatusTypeDef status = HAL_OK; | |
| 1673 | |
| 1674 /* check for PLLSAI1 Parameters used to output PLLSAI1CLK */ | |
| 1675 assert_param(IS_RCC_PLLSAI1SOURCE(PLLSAI1Init->PLLSAI1Source)); | |
| 1676 assert_param(IS_RCC_PLLSAI1M_VALUE(PLLSAI1Init->PLLSAI1M)); | |
| 1677 assert_param(IS_RCC_PLLSAI1N_VALUE(PLLSAI1Init->PLLSAI1N)); | |
| 1678 assert_param(IS_RCC_PLLSAI1P_VALUE(PLLSAI1Init->PLLSAI1P)); | |
| 1679 assert_param(IS_RCC_PLLSAI1Q_VALUE(PLLSAI1Init->PLLSAI1Q)); | |
| 1680 assert_param(IS_RCC_PLLSAI1R_VALUE(PLLSAI1Init->PLLSAI1R)); | |
| 1681 assert_param(IS_RCC_PLLSAI1CLOCKOUT_VALUE(PLLSAI1Init->PLLSAI1ClockOut)); | |
| 1682 | |
| 1683 /* Disable the PLLSAI1 */ | |
| 1684 __HAL_RCC_PLLSAI1_DISABLE(); | |
| 1685 | |
| 1686 /* Get Start Tick*/ | |
| 1687 tickstart = HAL_GetTick(); | |
| 1688 | |
| 1689 /* Wait till PLLSAI1 is ready to be updated */ | |
| 1690 while(READ_BIT(RCC->CR, RCC_CR_PLLSAI1RDY) != RESET) | |
| 1691 { | |
| 1692 if((HAL_GetTick() - tickstart) > PLLSAI1_TIMEOUT_VALUE) | |
| 1693 { | |
| 1694 status = HAL_TIMEOUT; | |
| 1695 break; | |
| 1696 } | |
| 1697 } | |
| 1698 | |
| 1699 if(status == HAL_OK) | |
| 1700 { | |
| 1701 /* Configure the PLLSAI1 Multiplication factor N */ | |
| 1702 /* Configure the PLLSAI1 Division factors P, Q and R */ | |
| 1703 __HAL_RCC_PLLSAI1_CONFIG(PLLSAI1Init->PLLSAI1N, PLLSAI1Init->PLLSAI1P, PLLSAI1Init->PLLSAI1Q, PLLSAI1Init->PLLSAI1R); | |
| 1704 /* Configure the PLLSAI1 Clock output(s) */ | |
| 1705 __HAL_RCC_PLLSAI1CLKOUT_ENABLE(PLLSAI1Init->PLLSAI1ClockOut); | |
| 1706 | |
| 1707 /* Enable the PLLSAI1 again by setting PLLSAI1ON to 1*/ | |
| 1708 __HAL_RCC_PLLSAI1_ENABLE(); | |
| 1709 | |
| 1710 /* Get Start Tick*/ | |
| 1711 tickstart = HAL_GetTick(); | |
| 1712 | |
| 1713 /* Wait till PLLSAI1 is ready */ | |
| 1714 while(READ_BIT(RCC->CR, RCC_CR_PLLSAI1RDY) == RESET) | |
| 1715 { | |
| 1716 if((HAL_GetTick() - tickstart) > PLLSAI1_TIMEOUT_VALUE) | |
| 1717 { | |
| 1718 status = HAL_TIMEOUT; | |
| 1719 break; | |
| 1720 } | |
| 1721 } | |
| 1722 } | |
| 1723 | |
| 1724 return status; | |
| 1725 } | |
| 1726 | |
| 1727 /** | |
| 1728 * @brief Disable PLLSAI1. | |
| 1729 * @retval HAL status | |
| 1730 */ | |
| 1731 HAL_StatusTypeDef HAL_RCCEx_DisablePLLSAI1(void) | |
| 1732 { | |
| 1733 uint32_t tickstart = 0U; | |
| 1734 HAL_StatusTypeDef status = HAL_OK; | |
| 1735 | |
| 1736 /* Disable the PLLSAI1 */ | |
| 1737 __HAL_RCC_PLLSAI1_DISABLE(); | |
| 1738 | |
| 1739 /* Get Start Tick*/ | |
| 1740 tickstart = HAL_GetTick(); | |
| 1741 | |
| 1742 /* Wait till PLLSAI1 is ready */ | |
| 1743 while(READ_BIT(RCC->CR, RCC_CR_PLLSAI1RDY) != RESET) | |
| 1744 { | |
| 1745 if((HAL_GetTick() - tickstart) > PLLSAI1_TIMEOUT_VALUE) | |
| 1746 { | |
| 1747 status = HAL_TIMEOUT; | |
| 1748 break; | |
| 1749 } | |
| 1750 } | |
| 1751 | |
| 1752 /* Disable the PLLSAI1 Clock outputs */ | |
| 1753 __HAL_RCC_PLLSAI1CLKOUT_DISABLE(RCC_PLLSAI1CFGR_PLLSAI1PEN|RCC_PLLSAI1CFGR_PLLSAI1QEN|RCC_PLLSAI1CFGR_PLLSAI1REN); | |
| 1754 | |
| 1755 /* Reset PLL source to save power if no PLLs on */ | |
| 1756 if((READ_BIT(RCC->CR, RCC_CR_PLLRDY) == RESET) | |
| 1757 #if defined(RCC_PLLSAI2_SUPPORT) | |
| 1758 && | |
| 1759 (READ_BIT(RCC->CR, RCC_CR_PLLSAI2RDY) == RESET) | |
| 1760 #endif /* RCC_PLLSAI2_SUPPORT */ | |
| 1761 ) | |
| 1762 { | |
| 1763 MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, RCC_PLLSOURCE_NONE); | |
| 1764 } | |
| 1765 | |
| 1766 return status; | |
| 1767 } | |
| 1768 | |
| 1769 #if defined(RCC_PLLSAI2_SUPPORT) | |
| 1770 | |
| 1771 /** | |
| 1772 * @brief Enable PLLSAI2. | |
| 1773 * @param PLLSAI2Init pointer to an RCC_PLLSAI2InitTypeDef structure that | |
| 1774 * contains the configuration information for the PLLSAI2 | |
| 1775 * @retval HAL status | |
| 1776 */ | |
| 1777 HAL_StatusTypeDef HAL_RCCEx_EnablePLLSAI2(RCC_PLLSAI2InitTypeDef *PLLSAI2Init) | |
| 1778 { | |
| 1779 uint32_t tickstart = 0U; | |
| 1780 HAL_StatusTypeDef status = HAL_OK; | |
| 1781 | |
| 1782 /* check for PLLSAI2 Parameters used to output PLLSAI2CLK */ | |
| 1783 assert_param(IS_RCC_PLLSAI2SOURCE(PLLSAI2Init->PLLSAI2Source)); | |
| 1784 assert_param(IS_RCC_PLLSAI2M_VALUE(PLLSAI2Init->PLLSAI2M)); | |
| 1785 assert_param(IS_RCC_PLLSAI2N_VALUE(PLLSAI2Init->PLLSAI2N)); | |
| 1786 assert_param(IS_RCC_PLLSAI2P_VALUE(PLLSAI2Init->PLLSAI2P)); | |
| 1787 assert_param(IS_RCC_PLLSAI2R_VALUE(PLLSAI2Init->PLLSAI2R)); | |
| 1788 assert_param(IS_RCC_PLLSAI2CLOCKOUT_VALUE(PLLSAI2Init->PLLSAI2ClockOut)); | |
| 1789 | |
| 1790 /* Disable the PLLSAI2 */ | |
| 1791 __HAL_RCC_PLLSAI2_DISABLE(); | |
| 1792 | |
| 1793 /* Get Start Tick*/ | |
| 1794 tickstart = HAL_GetTick(); | |
| 1795 | |
| 1796 /* Wait till PLLSAI2 is ready to be updated */ | |
| 1797 while(READ_BIT(RCC->CR, RCC_CR_PLLSAI2RDY) != RESET) | |
| 1798 { | |
| 1799 if((HAL_GetTick() - tickstart) > PLLSAI2_TIMEOUT_VALUE) | |
| 1800 { | |
| 1801 status = HAL_TIMEOUT; | |
| 1802 break; | |
| 1803 } | |
| 1804 } | |
| 1805 | |
| 1806 if(status == HAL_OK) | |
| 1807 { | |
| 1808 /* Configure the PLLSAI2 Multiplication factor N */ | |
| 1809 /* Configure the PLLSAI2 Division factors P and R */ | |
| 1810 __HAL_RCC_PLLSAI2_CONFIG(PLLSAI2Init->PLLSAI2N, PLLSAI2Init->PLLSAI2P, PLLSAI2Init->PLLSAI2R); | |
| 1811 /* Configure the PLLSAI2 Clock output(s) */ | |
| 1812 __HAL_RCC_PLLSAI2CLKOUT_ENABLE(PLLSAI2Init->PLLSAI2ClockOut); | |
| 1813 | |
| 1814 /* Enable the PLLSAI2 again by setting PLLSAI2ON to 1*/ | |
| 1815 __HAL_RCC_PLLSAI2_ENABLE(); | |
| 1816 | |
| 1817 /* Get Start Tick*/ | |
| 1818 tickstart = HAL_GetTick(); | |
| 1819 | |
| 1820 /* Wait till PLLSAI2 is ready */ | |
| 1821 while(READ_BIT(RCC->CR, RCC_CR_PLLSAI2RDY) == RESET) | |
| 1822 { | |
| 1823 if((HAL_GetTick() - tickstart) > PLLSAI2_TIMEOUT_VALUE) | |
| 1824 { | |
| 1825 status = HAL_TIMEOUT; | |
| 1826 break; | |
| 1827 } | |
| 1828 } | |
| 1829 } | |
| 1830 | |
| 1831 return status; | |
| 1832 } | |
| 1833 | |
| 1834 /** | |
| 1835 * @brief Disable PLLISAI2. | |
| 1836 * @retval HAL status | |
| 1837 */ | |
| 1838 HAL_StatusTypeDef HAL_RCCEx_DisablePLLSAI2(void) | |
| 1839 { | |
| 1840 uint32_t tickstart = 0U; | |
| 1841 HAL_StatusTypeDef status = HAL_OK; | |
| 1842 | |
| 1843 /* Disable the PLLSAI2 */ | |
| 1844 __HAL_RCC_PLLSAI2_DISABLE(); | |
| 1845 | |
| 1846 /* Get Start Tick*/ | |
| 1847 tickstart = HAL_GetTick(); | |
| 1848 | |
| 1849 /* Wait till PLLSAI2 is ready */ | |
| 1850 while(READ_BIT(RCC->CR, RCC_CR_PLLSAI2RDY) != RESET) | |
| 1851 { | |
| 1852 if((HAL_GetTick() - tickstart) > PLLSAI2_TIMEOUT_VALUE) | |
| 1853 { | |
| 1854 status = HAL_TIMEOUT; | |
| 1855 break; | |
| 1856 } | |
| 1857 } | |
| 1858 | |
| 1859 /* Disable the PLLSAI2 Clock outputs */ | |
| 1860 __HAL_RCC_PLLSAI2CLKOUT_DISABLE(RCC_PLLSAI2CFGR_PLLSAI2PEN|RCC_PLLSAI2CFGR_PLLSAI2REN); | |
| 1861 | |
| 1862 /* Reset PLL source to save power if no PLLs on */ | |
| 1863 if((READ_BIT(RCC->CR, RCC_CR_PLLRDY) == RESET) | |
| 1864 && | |
| 1865 (READ_BIT(RCC->CR, RCC_CR_PLLSAI1RDY) == RESET) | |
| 1866 ) | |
| 1867 { | |
| 1868 MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, RCC_PLLSOURCE_NONE); | |
| 1869 } | |
| 1870 | |
| 1871 return status; | |
| 1872 } | |
| 1873 | |
| 1874 #endif /* RCC_PLLSAI2_SUPPORT */ | |
| 1875 | |
| 1876 /** | |
| 1877 * @brief Configure the oscillator clock source for wakeup from Stop and CSS backup clock. | |
| 1878 * @param WakeUpClk Wakeup clock | |
| 1879 * This parameter can be one of the following values: | |
| 1880 * @arg @ref RCC_STOP_WAKEUPCLOCK_MSI MSI oscillator selection | |
| 1881 * @arg @ref RCC_STOP_WAKEUPCLOCK_HSI HSI oscillator selection | |
| 1882 * @note This function shall not be called after the Clock Security System on HSE has been | |
| 1883 * enabled. | |
| 1884 * @retval None | |
| 1885 */ | |
| 1886 void HAL_RCCEx_WakeUpStopCLKConfig(uint32_t WakeUpClk) | |
| 1887 { | |
| 1888 assert_param(IS_RCC_STOP_WAKEUPCLOCK(WakeUpClk)); | |
| 1889 | |
| 1890 __HAL_RCC_WAKEUPSTOP_CLK_CONFIG(WakeUpClk); | |
| 1891 } | |
| 1892 | |
| 1893 /** | |
| 1894 * @brief Configure the MSI range after standby mode. | |
| 1895 * @note After Standby its frequency can be selected between 4 possible values (1, 2, 4 or 8 MHz). | |
| 1896 * @param MSIRange MSI range | |
| 1897 * This parameter can be one of the following values: | |
| 1898 * @arg @ref RCC_MSIRANGE_4 Range 4 around 1 MHz | |
| 1899 * @arg @ref RCC_MSIRANGE_5 Range 5 around 2 MHz | |
| 1900 * @arg @ref RCC_MSIRANGE_6 Range 6 around 4 MHz (reset value) | |
| 1901 * @arg @ref RCC_MSIRANGE_7 Range 7 around 8 MHz | |
| 1902 * @retval None | |
| 1903 */ | |
| 1904 void HAL_RCCEx_StandbyMSIRangeConfig(uint32_t MSIRange) | |
| 1905 { | |
| 1906 assert_param(IS_RCC_MSI_STANDBY_CLOCK_RANGE(MSIRange)); | |
| 1907 | |
| 1908 __HAL_RCC_MSI_STANDBY_RANGE_CONFIG(MSIRange); | |
| 1909 } | |
| 1910 | |
| 1911 /** | |
| 1912 * @brief Enable the LSE Clock Security System. | |
| 1913 * @note Prior to enable the LSE Clock Security System, LSE oscillator is to be enabled | |
| 1914 * with HAL_RCC_OscConfig() and the LSE oscillator clock is to be selected as RTC | |
| 1915 * clock with HAL_RCCEx_PeriphCLKConfig(). | |
| 1916 * @retval None | |
| 1917 */ | |
| 1918 void HAL_RCCEx_EnableLSECSS(void) | |
| 1919 { | |
| 1920 SET_BIT(RCC->BDCR, RCC_BDCR_LSECSSON) ; | |
| 1921 } | |
| 1922 | |
| 1923 /** | |
| 1924 * @brief Disable the LSE Clock Security System. | |
| 1925 * @note LSE Clock Security System can only be disabled after a LSE failure detection. | |
| 1926 * @retval None | |
| 1927 */ | |
| 1928 void HAL_RCCEx_DisableLSECSS(void) | |
| 1929 { | |
| 1930 CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSECSSON) ; | |
| 1931 | |
| 1932 /* Disable LSE CSS IT if any */ | |
| 1933 __HAL_RCC_DISABLE_IT(RCC_IT_LSECSS); | |
| 1934 } | |
| 1935 | |
| 1936 /** | |
| 1937 * @brief Enable the LSE Clock Security System Interrupt & corresponding EXTI line. | |
| 1938 * @note LSE Clock Security System Interrupt is mapped on RTC EXTI line 19 | |
| 1939 * @retval None | |
| 1940 */ | |
| 1941 void HAL_RCCEx_EnableLSECSS_IT(void) | |
| 1942 { | |
| 1943 /* Enable LSE CSS */ | |
| 1944 SET_BIT(RCC->BDCR, RCC_BDCR_LSECSSON) ; | |
| 1945 | |
| 1946 /* Enable LSE CSS IT */ | |
| 1947 __HAL_RCC_ENABLE_IT(RCC_IT_LSECSS); | |
| 1948 | |
| 1949 /* Enable IT on EXTI Line 19 */ | |
| 1950 __HAL_RCC_LSECSS_EXTI_ENABLE_IT(); | |
| 1951 __HAL_RCC_LSECSS_EXTI_ENABLE_RISING_EDGE(); | |
| 1952 } | |
| 1953 | |
| 1954 /** | |
| 1955 * @brief Handle the RCC LSE Clock Security System interrupt request. | |
| 1956 * @retval None | |
| 1957 */ | |
| 1958 void HAL_RCCEx_LSECSS_IRQHandler(void) | |
| 1959 { | |
| 1960 /* Check RCC LSE CSSF flag */ | |
| 1961 if(__HAL_RCC_GET_IT(RCC_IT_LSECSS)) | |
| 1962 { | |
| 1963 /* RCC LSE Clock Security System interrupt user callback */ | |
| 1964 HAL_RCCEx_LSECSS_Callback(); | |
| 1965 | |
| 1966 /* Clear RCC LSE CSS pending bit */ | |
| 1967 __HAL_RCC_CLEAR_IT(RCC_IT_LSECSS); | |
| 1968 } | |
| 1969 } | |
| 1970 | |
| 1971 /** | |
| 1972 * @brief RCCEx LSE Clock Security System interrupt callback. | |
| 1973 * @retval none | |
| 1974 */ | |
| 1975 __weak void HAL_RCCEx_LSECSS_Callback(void) | |
| 1976 { | |
| 1977 /* NOTE : This function should not be modified, when the callback is needed, | |
| 1978 the @ref HAL_RCCEx_LSECSS_Callback should be implemented in the user file | |
| 1979 */ | |
| 1980 } | |
| 1981 | |
| 1982 /** | |
| 1983 * @brief Select the Low Speed clock source to output on LSCO pin (PA2). | |
| 1984 * @param LSCOSource specifies the Low Speed clock source to output. | |
| 1985 * This parameter can be one of the following values: | |
| 1986 * @arg @ref RCC_LSCOSOURCE_LSI LSI clock selected as LSCO source | |
| 1987 * @arg @ref RCC_LSCOSOURCE_LSE LSE clock selected as LSCO source | |
| 1988 * @retval None | |
| 1989 */ | |
| 1990 void HAL_RCCEx_EnableLSCO(uint32_t LSCOSource) | |
| 1991 { | |
| 1992 GPIO_InitTypeDef GPIO_InitStruct; | |
| 1993 FlagStatus pwrclkchanged = RESET; | |
| 1994 FlagStatus backupchanged = RESET; | |
| 1995 | |
| 1996 /* Check the parameters */ | |
| 1997 assert_param(IS_RCC_LSCOSOURCE(LSCOSource)); | |
| 1998 | |
| 1999 /* LSCO Pin Clock Enable */ | |
| 2000 __LSCO_CLK_ENABLE(); | |
| 2001 | |
| 2002 /* Configue the LSCO pin in analog mode */ | |
| 2003 GPIO_InitStruct.Pin = LSCO_PIN; | |
| 2004 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; | |
| 2005 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; | |
| 2006 GPIO_InitStruct.Pull = GPIO_NOPULL; | |
| 2007 HAL_GPIO_Init(LSCO_GPIO_PORT, &GPIO_InitStruct); | |
| 2008 | |
| 2009 /* Update LSCOSEL clock source in Backup Domain control register */ | |
| 2010 if(__HAL_RCC_PWR_IS_CLK_DISABLED()) | |
| 2011 { | |
| 2012 __HAL_RCC_PWR_CLK_ENABLE(); | |
| 2013 pwrclkchanged = SET; | |
| 2014 } | |
| 2015 if(HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) | |
| 2016 { | |
| 2017 HAL_PWR_EnableBkUpAccess(); | |
| 2018 backupchanged = SET; | |
| 2019 } | |
| 2020 | |
| 2021 MODIFY_REG(RCC->BDCR, RCC_BDCR_LSCOSEL | RCC_BDCR_LSCOEN, LSCOSource | RCC_BDCR_LSCOEN); | |
| 2022 | |
| 2023 if(backupchanged == SET) | |
| 2024 { | |
| 2025 HAL_PWR_DisableBkUpAccess(); | |
| 2026 } | |
| 2027 if(pwrclkchanged == SET) | |
| 2028 { | |
| 2029 __HAL_RCC_PWR_CLK_DISABLE(); | |
| 2030 } | |
| 2031 } | |
| 2032 | |
| 2033 /** | |
| 2034 * @brief Disable the Low Speed clock output. | |
| 2035 * @retval None | |
| 2036 */ | |
| 2037 void HAL_RCCEx_DisableLSCO(void) | |
| 2038 { | |
| 2039 FlagStatus pwrclkchanged = RESET; | |
| 2040 FlagStatus backupchanged = RESET; | |
| 2041 | |
| 2042 /* Update LSCOEN bit in Backup Domain control register */ | |
| 2043 if(__HAL_RCC_PWR_IS_CLK_DISABLED()) | |
| 2044 { | |
| 2045 __HAL_RCC_PWR_CLK_ENABLE(); | |
| 2046 pwrclkchanged = SET; | |
| 2047 } | |
| 2048 if(HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) | |
| 2049 { | |
| 2050 /* Enable access to the backup domain */ | |
| 2051 HAL_PWR_EnableBkUpAccess(); | |
| 2052 backupchanged = SET; | |
| 2053 } | |
| 2054 | |
| 2055 CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSCOEN); | |
| 2056 | |
| 2057 /* Restore previous configuration */ | |
| 2058 if(backupchanged == SET) | |
| 2059 { | |
| 2060 /* Disable access to the backup domain */ | |
| 2061 HAL_PWR_DisableBkUpAccess(); | |
| 2062 } | |
| 2063 if(pwrclkchanged == SET) | |
| 2064 { | |
| 2065 __HAL_RCC_PWR_CLK_DISABLE(); | |
| 2066 } | |
| 2067 } | |
| 2068 | |
| 2069 /** | |
| 2070 * @brief Enable the PLL-mode of the MSI. | |
| 2071 * @note Prior to enable the PLL-mode of the MSI for automatic hardware | |
| 2072 * calibration LSE oscillator is to be enabled with HAL_RCC_OscConfig(). | |
| 2073 * @retval None | |
| 2074 */ | |
| 2075 void HAL_RCCEx_EnableMSIPLLMode(void) | |
| 2076 { | |
| 2077 SET_BIT(RCC->CR, RCC_CR_MSIPLLEN) ; | |
| 2078 } | |
| 2079 | |
| 2080 /** | |
| 2081 * @brief Disable the PLL-mode of the MSI. | |
| 2082 * @note PLL-mode of the MSI is automatically reset when LSE oscillator is disabled. | |
| 2083 * @retval None | |
| 2084 */ | |
| 2085 void HAL_RCCEx_DisableMSIPLLMode(void) | |
| 2086 { | |
| 2087 CLEAR_BIT(RCC->CR, RCC_CR_MSIPLLEN) ; | |
| 2088 } | |
| 2089 | |
| 2090 /** | |
| 2091 * @} | |
| 2092 */ | |
| 2093 | |
| 2094 #if defined(CRS) | |
| 2095 | |
| 2096 /** @defgroup RCCEx_Exported_Functions_Group3 Extended Clock Recovery System Control functions | |
| 2097 * @brief Extended Clock Recovery System Control functions | |
| 2098 * | |
| 2099 @verbatim | |
| 2100 =============================================================================== | |
| 2101 ##### Extended Clock Recovery System Control functions ##### | |
| 2102 =============================================================================== | |
| 2103 [..] | |
| 2104 For devices with Clock Recovery System feature (CRS), RCC Extention HAL driver can be used as follows: | |
| 2105 | |
| 2106 (#) In System clock config, HSI48 needs to be enabled | |
| 2107 | |
| 2108 (#) Enable CRS clock in IP MSP init which will use CRS functions | |
| 2109 | |
| 2110 (#) Call CRS functions as follows: | |
| 2111 (##) Prepare synchronization configuration necessary for HSI48 calibration | |
| 2112 (+++) Default values can be set for frequency Error Measurement (reload and error limit) | |
| 2113 and also HSI48 oscillator smooth trimming. | |
| 2114 (+++) Macro __HAL_RCC_CRS_RELOADVALUE_CALCULATE can be also used to calculate | |
| 2115 directly reload value with target and sychronization frequencies values | |
| 2116 (##) Call function HAL_RCCEx_CRSConfig which | |
| 2117 (+++) Resets CRS registers to their default values. | |
| 2118 (+++) Configures CRS registers with synchronization configuration | |
| 2119 (+++) Enables automatic calibration and frequency error counter feature | |
| 2120 Note: When using USB LPM (Link Power Management) and the device is in Sleep mode, the | |
| 2121 periodic USB SOF will not be generated by the host. No SYNC signal will therefore be | |
| 2122 provided to the CRS to calibrate the HSI48 on the run. To guarantee the required clock | |
| 2123 precision after waking up from Sleep mode, the LSE or reference clock on the GPIOs | |
| 2124 should be used as SYNC signal. | |
| 2125 | |
| 2126 (##) A polling function is provided to wait for complete synchronization | |
| 2127 (+++) Call function HAL_RCCEx_CRSWaitSynchronization() | |
| 2128 (+++) According to CRS status, user can decide to adjust again the calibration or continue | |
| 2129 application if synchronization is OK | |
| 2130 | |
| 2131 (#) User can retrieve information related to synchronization in calling function | |
| 2132 HAL_RCCEx_CRSGetSynchronizationInfo() | |
| 2133 | |
| 2134 (#) Regarding synchronization status and synchronization information, user can try a new calibration | |
| 2135 in changing synchronization configuration and call again HAL_RCCEx_CRSConfig. | |
| 2136 Note: When the SYNC event is detected during the downcounting phase (before reaching the zero value), | |
| 2137 it means that the actual frequency is lower than the target (and so, that the TRIM value should be | |
| 2138 incremented), while when it is detected during the upcounting phase it means that the actual frequency | |
| 2139 is higher (and that the TRIM value should be decremented). | |
| 2140 | |
| 2141 (#) In interrupt mode, user can resort to the available macros (__HAL_RCC_CRS_XXX_IT). Interrupts will go | |
| 2142 through CRS Handler (CRS_IRQn/CRS_IRQHandler) | |
| 2143 (++) Call function HAL_RCCEx_CRSConfig() | |
| 2144 (++) Enable CRS_IRQn (thanks to NVIC functions) | |
| 2145 (++) Enable CRS interrupt (__HAL_RCC_CRS_ENABLE_IT) | |
| 2146 (++) Implement CRS status management in the following user callbacks called from | |
| 2147 HAL_RCCEx_CRS_IRQHandler(): | |
| 2148 (+++) HAL_RCCEx_CRS_SyncOkCallback() | |
| 2149 (+++) HAL_RCCEx_CRS_SyncWarnCallback() | |
| 2150 (+++) HAL_RCCEx_CRS_ExpectedSyncCallback() | |
| 2151 (+++) HAL_RCCEx_CRS_ErrorCallback() | |
| 2152 | |
| 2153 (#) To force a SYNC EVENT, user can use the function HAL_RCCEx_CRSSoftwareSynchronizationGenerate(). | |
| 2154 This function can be called before calling HAL_RCCEx_CRSConfig (for instance in Systick handler) | |
| 2155 | |
| 2156 @endverbatim | |
| 2157 * @{ | |
| 2158 */ | |
| 2159 | |
| 2160 /** | |
| 2161 * @brief Start automatic synchronization for polling mode | |
| 2162 * @param pInit Pointer on RCC_CRSInitTypeDef structure | |
| 2163 * @retval None | |
| 2164 */ | |
| 2165 void HAL_RCCEx_CRSConfig(RCC_CRSInitTypeDef *pInit) | |
| 2166 { | |
| 2167 uint32_t value = 0; | |
| 2168 | |
| 2169 /* Check the parameters */ | |
| 2170 assert_param(IS_RCC_CRS_SYNC_DIV(pInit->Prescaler)); | |
| 2171 assert_param(IS_RCC_CRS_SYNC_SOURCE(pInit->Source)); | |
| 2172 assert_param(IS_RCC_CRS_SYNC_POLARITY(pInit->Polarity)); | |
| 2173 assert_param(IS_RCC_CRS_RELOADVALUE(pInit->ReloadValue)); | |
| 2174 assert_param(IS_RCC_CRS_ERRORLIMIT(pInit->ErrorLimitValue)); | |
| 2175 assert_param(IS_RCC_CRS_HSI48CALIBRATION(pInit->HSI48CalibrationValue)); | |
| 2176 | |
| 2177 /* CONFIGURATION */ | |
| 2178 | |
| 2179 /* Before configuration, reset CRS registers to their default values*/ | |
| 2180 __HAL_RCC_CRS_FORCE_RESET(); | |
| 2181 __HAL_RCC_CRS_RELEASE_RESET(); | |
| 2182 | |
| 2183 /* Set the SYNCDIV[2:0] bits according to Prescaler value */ | |
| 2184 /* Set the SYNCSRC[1:0] bits according to Source value */ | |
| 2185 /* Set the SYNCSPOL bit according to Polarity value */ | |
| 2186 value = (pInit->Prescaler | pInit->Source | pInit->Polarity); | |
| 2187 /* Set the RELOAD[15:0] bits according to ReloadValue value */ | |
| 2188 value |= pInit->ReloadValue; | |
| 2189 /* Set the FELIM[7:0] bits according to ErrorLimitValue value */ | |
| 2190 value |= (pInit->ErrorLimitValue << POSITION_VAL(CRS_CFGR_FELIM)); | |
| 2191 WRITE_REG(CRS->CFGR, value); | |
| 2192 | |
| 2193 /* Adjust HSI48 oscillator smooth trimming */ | |
| 2194 /* Set the TRIM[5:0] bits according to RCC_CRS_HSI48CalibrationValue value */ | |
| 2195 MODIFY_REG(CRS->CR, CRS_CR_TRIM, (pInit->HSI48CalibrationValue << POSITION_VAL(CRS_CR_TRIM))); | |
| 2196 | |
| 2197 /* START AUTOMATIC SYNCHRONIZATION*/ | |
| 2198 | |
| 2199 /* Enable Automatic trimming & Frequency error counter */ | |
| 2200 SET_BIT(CRS->CR, CRS_CR_AUTOTRIMEN | CRS_CR_CEN); | |
| 2201 } | |
| 2202 | |
| 2203 /** | |
| 2204 * @brief Generate the software synchronization event | |
| 2205 * @retval None | |
| 2206 */ | |
| 2207 void HAL_RCCEx_CRSSoftwareSynchronizationGenerate(void) | |
| 2208 { | |
| 2209 SET_BIT(CRS->CR, CRS_CR_SWSYNC); | |
| 2210 } | |
| 2211 | |
| 2212 /** | |
| 2213 * @brief Return synchronization info | |
| 2214 * @param pSynchroInfo Pointer on RCC_CRSSynchroInfoTypeDef structure | |
| 2215 * @retval None | |
| 2216 */ | |
| 2217 void HAL_RCCEx_CRSGetSynchronizationInfo(RCC_CRSSynchroInfoTypeDef *pSynchroInfo) | |
| 2218 { | |
| 2219 /* Check the parameter */ | |
| 2220 assert_param(pSynchroInfo != NULL); | |
| 2221 | |
| 2222 /* Get the reload value */ | |
| 2223 pSynchroInfo->ReloadValue = (uint32_t)(READ_BIT(CRS->CFGR, CRS_CFGR_RELOAD)); | |
| 2224 | |
| 2225 /* Get HSI48 oscillator smooth trimming */ | |
| 2226 pSynchroInfo->HSI48CalibrationValue = (uint32_t)(READ_BIT(CRS->CR, CRS_CR_TRIM) >> POSITION_VAL(CRS_CR_TRIM)); | |
| 2227 | |
| 2228 /* Get Frequency error capture */ | |
| 2229 pSynchroInfo->FreqErrorCapture = (uint32_t)(READ_BIT(CRS->ISR, CRS_ISR_FECAP) >> POSITION_VAL(CRS_ISR_FECAP)); | |
| 2230 | |
| 2231 /* Get Frequency error direction */ | |
| 2232 pSynchroInfo->FreqErrorDirection = (uint32_t)(READ_BIT(CRS->ISR, CRS_ISR_FEDIR)); | |
| 2233 } | |
| 2234 | |
| 2235 /** | |
| 2236 * @brief Wait for CRS Synchronization status. | |
| 2237 * @param Timeout Duration of the timeout | |
| 2238 * @note Timeout is based on the maximum time to receive a SYNC event based on synchronization | |
| 2239 * frequency. | |
| 2240 * @note If Timeout set to HAL_MAX_DELAY, HAL_TIMEOUT will be never returned. | |
| 2241 * @retval Combination of Synchronization status | |
| 2242 * This parameter can be a combination of the following values: | |
| 2243 * @arg @ref RCC_CRS_TIMEOUT | |
| 2244 * @arg @ref RCC_CRS_SYNCOK | |
| 2245 * @arg @ref RCC_CRS_SYNCWARN | |
| 2246 * @arg @ref RCC_CRS_SYNCERR | |
| 2247 * @arg @ref RCC_CRS_SYNCMISS | |
| 2248 * @arg @ref RCC_CRS_TRIMOVF | |
| 2249 */ | |
| 2250 uint32_t HAL_RCCEx_CRSWaitSynchronization(uint32_t Timeout) | |
| 2251 { | |
| 2252 uint32_t crsstatus = RCC_CRS_NONE; | |
| 2253 uint32_t tickstart = 0U; | |
| 2254 | |
| 2255 /* Get timeout */ | |
| 2256 tickstart = HAL_GetTick(); | |
| 2257 | |
| 2258 /* Wait for CRS flag or timeout detection */ | |
| 2259 do | |
| 2260 { | |
| 2261 if(Timeout != HAL_MAX_DELAY) | |
| 2262 { | |
| 2263 if((Timeout == 0U) || ((HAL_GetTick() - tickstart) > Timeout)) | |
| 2264 { | |
| 2265 crsstatus = RCC_CRS_TIMEOUT; | |
| 2266 } | |
| 2267 } | |
| 2268 /* Check CRS SYNCOK flag */ | |
| 2269 if(__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_SYNCOK)) | |
| 2270 { | |
| 2271 /* CRS SYNC event OK */ | |
| 2272 crsstatus |= RCC_CRS_SYNCOK; | |
| 2273 | |
| 2274 /* Clear CRS SYNC event OK bit */ | |
| 2275 __HAL_RCC_CRS_CLEAR_FLAG(RCC_CRS_FLAG_SYNCOK); | |
| 2276 } | |
| 2277 | |
| 2278 /* Check CRS SYNCWARN flag */ | |
| 2279 if(__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_SYNCWARN)) | |
| 2280 { | |
| 2281 /* CRS SYNC warning */ | |
| 2282 crsstatus |= RCC_CRS_SYNCWARN; | |
| 2283 | |
| 2284 /* Clear CRS SYNCWARN bit */ | |
| 2285 __HAL_RCC_CRS_CLEAR_FLAG(RCC_CRS_FLAG_SYNCWARN); | |
| 2286 } | |
| 2287 | |
| 2288 /* Check CRS TRIM overflow flag */ | |
| 2289 if(__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_TRIMOVF)) | |
| 2290 { | |
| 2291 /* CRS SYNC Error */ | |
| 2292 crsstatus |= RCC_CRS_TRIMOVF; | |
| 2293 | |
| 2294 /* Clear CRS Error bit */ | |
| 2295 __HAL_RCC_CRS_CLEAR_FLAG(RCC_CRS_FLAG_TRIMOVF); | |
| 2296 } | |
| 2297 | |
| 2298 /* Check CRS Error flag */ | |
| 2299 if(__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_SYNCERR)) | |
| 2300 { | |
| 2301 /* CRS SYNC Error */ | |
| 2302 crsstatus |= RCC_CRS_SYNCERR; | |
| 2303 | |
| 2304 /* Clear CRS Error bit */ | |
| 2305 __HAL_RCC_CRS_CLEAR_FLAG(RCC_CRS_FLAG_SYNCERR); | |
| 2306 } | |
| 2307 | |
| 2308 /* Check CRS SYNC Missed flag */ | |
| 2309 if(__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_SYNCMISS)) | |
| 2310 { | |
| 2311 /* CRS SYNC Missed */ | |
| 2312 crsstatus |= RCC_CRS_SYNCMISS; | |
| 2313 | |
| 2314 /* Clear CRS SYNC Missed bit */ | |
| 2315 __HAL_RCC_CRS_CLEAR_FLAG(RCC_CRS_FLAG_SYNCMISS); | |
| 2316 } | |
| 2317 | |
| 2318 /* Check CRS Expected SYNC flag */ | |
| 2319 if(__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_ESYNC)) | |
| 2320 { | |
| 2321 /* frequency error counter reached a zero value */ | |
| 2322 __HAL_RCC_CRS_CLEAR_FLAG(RCC_CRS_FLAG_ESYNC); | |
| 2323 } | |
| 2324 } while(RCC_CRS_NONE == crsstatus); | |
| 2325 | |
| 2326 return crsstatus; | |
| 2327 } | |
| 2328 | |
| 2329 /** | |
| 2330 * @brief Handle the Clock Recovery System interrupt request. | |
| 2331 * @retval None | |
| 2332 */ | |
| 2333 void HAL_RCCEx_CRS_IRQHandler(void) | |
| 2334 { | |
| 2335 uint32_t crserror = RCC_CRS_NONE; | |
| 2336 /* Get current IT flags and IT sources values */ | |
| 2337 uint32_t itflags = READ_REG(CRS->ISR); | |
| 2338 uint32_t itsources = READ_REG(CRS->CR); | |
| 2339 | |
| 2340 /* Check CRS SYNCOK flag */ | |
| 2341 if(((itflags & RCC_CRS_FLAG_SYNCOK) != RESET) && ((itsources & RCC_CRS_IT_SYNCOK) != RESET)) | |
| 2342 { | |
| 2343 /* Clear CRS SYNC event OK flag */ | |
| 2344 WRITE_REG(CRS->ICR, CRS_ICR_SYNCOKC); | |
| 2345 | |
| 2346 /* user callback */ | |
| 2347 HAL_RCCEx_CRS_SyncOkCallback(); | |
| 2348 } | |
| 2349 /* Check CRS SYNCWARN flag */ | |
| 2350 else if(((itflags & RCC_CRS_FLAG_SYNCWARN) != RESET) && ((itsources & RCC_CRS_IT_SYNCWARN) != RESET)) | |
| 2351 { | |
| 2352 /* Clear CRS SYNCWARN flag */ | |
| 2353 WRITE_REG(CRS->ICR, CRS_ICR_SYNCWARNC); | |
| 2354 | |
| 2355 /* user callback */ | |
| 2356 HAL_RCCEx_CRS_SyncWarnCallback(); | |
| 2357 } | |
| 2358 /* Check CRS Expected SYNC flag */ | |
| 2359 else if(((itflags & RCC_CRS_FLAG_ESYNC) != RESET) && ((itsources & RCC_CRS_IT_ESYNC) != RESET)) | |
| 2360 { | |
| 2361 /* frequency error counter reached a zero value */ | |
| 2362 WRITE_REG(CRS->ICR, CRS_ICR_ESYNCC); | |
| 2363 | |
| 2364 /* user callback */ | |
| 2365 HAL_RCCEx_CRS_ExpectedSyncCallback(); | |
| 2366 } | |
| 2367 /* Check CRS Error flags */ | |
| 2368 else | |
| 2369 { | |
| 2370 if(((itflags & RCC_CRS_FLAG_ERR) != RESET) && ((itsources & RCC_CRS_IT_ERR) != RESET)) | |
| 2371 { | |
| 2372 if((itflags & RCC_CRS_FLAG_SYNCERR) != RESET) | |
| 2373 { | |
| 2374 crserror |= RCC_CRS_SYNCERR; | |
| 2375 } | |
| 2376 if((itflags & RCC_CRS_FLAG_SYNCMISS) != RESET) | |
| 2377 { | |
| 2378 crserror |= RCC_CRS_SYNCMISS; | |
| 2379 } | |
| 2380 if((itflags & RCC_CRS_FLAG_TRIMOVF) != RESET) | |
| 2381 { | |
| 2382 crserror |= RCC_CRS_TRIMOVF; | |
| 2383 } | |
| 2384 | |
| 2385 /* Clear CRS Error flags */ | |
| 2386 WRITE_REG(CRS->ICR, CRS_ICR_ERRC); | |
| 2387 | |
| 2388 /* user error callback */ | |
| 2389 HAL_RCCEx_CRS_ErrorCallback(crserror); | |
| 2390 } | |
| 2391 } | |
| 2392 } | |
| 2393 | |
| 2394 /** | |
| 2395 * @brief RCCEx Clock Recovery System SYNCOK interrupt callback. | |
| 2396 * @retval none | |
| 2397 */ | |
| 2398 __weak void HAL_RCCEx_CRS_SyncOkCallback(void) | |
| 2399 { | |
| 2400 /* NOTE : This function should not be modified, when the callback is needed, | |
| 2401 the @ref HAL_RCCEx_CRS_SyncOkCallback should be implemented in the user file | |
| 2402 */ | |
| 2403 } | |
| 2404 | |
| 2405 /** | |
| 2406 * @brief RCCEx Clock Recovery System SYNCWARN interrupt callback. | |
| 2407 * @retval none | |
| 2408 */ | |
| 2409 __weak void HAL_RCCEx_CRS_SyncWarnCallback(void) | |
| 2410 { | |
| 2411 /* NOTE : This function should not be modified, when the callback is needed, | |
| 2412 the @ref HAL_RCCEx_CRS_SyncWarnCallback should be implemented in the user file | |
| 2413 */ | |
| 2414 } | |
| 2415 | |
| 2416 /** | |
| 2417 * @brief RCCEx Clock Recovery System Expected SYNC interrupt callback. | |
| 2418 * @retval none | |
| 2419 */ | |
| 2420 __weak void HAL_RCCEx_CRS_ExpectedSyncCallback(void) | |
| 2421 { | |
| 2422 /* NOTE : This function should not be modified, when the callback is needed, | |
| 2423 the @ref HAL_RCCEx_CRS_ExpectedSyncCallback should be implemented in the user file | |
| 2424 */ | |
| 2425 } | |
| 2426 | |
| 2427 /** | |
| 2428 * @brief RCCEx Clock Recovery System Error interrupt callback. | |
| 2429 * @param Error Combination of Error status. | |
| 2430 * This parameter can be a combination of the following values: | |
| 2431 * @arg @ref RCC_CRS_SYNCERR | |
| 2432 * @arg @ref RCC_CRS_SYNCMISS | |
| 2433 * @arg @ref RCC_CRS_TRIMOVF | |
| 2434 * @retval none | |
| 2435 */ | |
| 2436 __weak void HAL_RCCEx_CRS_ErrorCallback(uint32_t Error) | |
| 2437 { | |
| 2438 /* Prevent unused argument(s) compilation warning */ | |
| 2439 UNUSED(Error); | |
| 2440 | |
| 2441 /* NOTE : This function should not be modified, when the callback is needed, | |
| 2442 the @ref HAL_RCCEx_CRS_ErrorCallback should be implemented in the user file | |
| 2443 */ | |
| 2444 } | |
| 2445 | |
| 2446 /** | |
| 2447 * @} | |
| 2448 */ | |
| 2449 | |
| 2450 #endif /* CRS */ | |
| 2451 | |
| 2452 /** | |
| 2453 * @} | |
| 2454 */ | |
| 2455 | |
| 2456 /** @addtogroup RCCEx_Private_Functions | |
| 2457 * @{ | |
| 2458 */ | |
| 2459 | |
| 2460 /** | |
| 2461 * @brief Configure the parameters N & P & optionally M of PLLSAI1 and enable PLLSAI1 output clock(s). | |
| 2462 * @param PllSai1 pointer to an RCC_PLLSAI1InitTypeDef structure that | |
| 2463 * contains the configuration parameters N & P & optionally M as well as PLLSAI1 output clock(s) | |
| 2464 * @param Divider divider parameter to be updated | |
| 2465 * | |
| 2466 * @note PLLSAI1 is temporary disable to apply new parameters | |
| 2467 * | |
| 2468 * @retval HAL status | |
| 2469 */ | |
| 2470 static HAL_StatusTypeDef RCCEx_PLLSAI1_Config(RCC_PLLSAI1InitTypeDef *PllSai1, uint32_t Divider) | |
| 2471 { | |
| 2472 uint32_t tickstart = 0U; | |
| 2473 HAL_StatusTypeDef status = HAL_OK; | |
| 2474 | |
| 2475 /* check for PLLSAI1 Parameters used to output PLLSAI1CLK */ | |
| 2476 /* P, Q and R dividers are verified in each specific divider case below */ | |
| 2477 assert_param(IS_RCC_PLLSAI1SOURCE(PllSai1->PLLSAI1Source)); | |
| 2478 assert_param(IS_RCC_PLLSAI1M_VALUE(PllSai1->PLLSAI1M)); | |
| 2479 assert_param(IS_RCC_PLLSAI1N_VALUE(PllSai1->PLLSAI1N)); | |
| 2480 assert_param(IS_RCC_PLLSAI1CLOCKOUT_VALUE(PllSai1->PLLSAI1ClockOut)); | |
| 2481 | |
| 2482 /* Check that PLLSAI1 clock source and divider M can be applied */ | |
| 2483 if(__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_NONE) | |
| 2484 { | |
| 2485 /* PLL clock source and divider M already set, check that no request for change */ | |
| 2486 if((__HAL_RCC_GET_PLL_OSCSOURCE() != PllSai1->PLLSAI1Source) | |
| 2487 || | |
| 2488 (PllSai1->PLLSAI1Source == RCC_PLLSOURCE_NONE) | |
| 2489 || | |
| 2490 (((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM) >> POSITION_VAL(RCC_PLLCFGR_PLLM)) + 1U) != PllSai1->PLLSAI1M) | |
| 2491 ) | |
| 2492 { | |
| 2493 status = HAL_ERROR; | |
| 2494 } | |
| 2495 } | |
| 2496 else | |
| 2497 { | |
| 2498 /* Check PLLSAI1 clock source availability */ | |
| 2499 switch(PllSai1->PLLSAI1Source) | |
| 2500 { | |
| 2501 case RCC_PLLSOURCE_MSI: | |
| 2502 if(HAL_IS_BIT_CLR(RCC->CR, RCC_CR_MSIRDY)) | |
| 2503 { | |
| 2504 status = HAL_ERROR; | |
| 2505 } | |
| 2506 break; | |
| 2507 case RCC_PLLSOURCE_HSI: | |
| 2508 if(HAL_IS_BIT_CLR(RCC->CR, RCC_CR_HSIRDY)) | |
| 2509 { | |
| 2510 status = HAL_ERROR; | |
| 2511 } | |
| 2512 break; | |
| 2513 case RCC_PLLSOURCE_HSE: | |
| 2514 if(HAL_IS_BIT_CLR(RCC->CR, RCC_CR_HSERDY) && HAL_IS_BIT_CLR(RCC->CR, RCC_CR_HSEBYP)) | |
| 2515 { | |
| 2516 status = HAL_ERROR; | |
| 2517 } | |
| 2518 break; | |
| 2519 default: | |
| 2520 status = HAL_ERROR; | |
| 2521 break; | |
| 2522 } | |
| 2523 | |
| 2524 if(status == HAL_OK) | |
| 2525 { | |
| 2526 /* Set PLLSAI1 clock source and divider M */ | |
| 2527 MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM, PllSai1->PLLSAI1Source | (PllSai1->PLLSAI1M - 1U) << POSITION_VAL(RCC_PLLCFGR_PLLM)); | |
| 2528 } | |
| 2529 } | |
| 2530 | |
| 2531 if(status == HAL_OK) | |
| 2532 { | |
| 2533 /* Disable the PLLSAI1 */ | |
| 2534 __HAL_RCC_PLLSAI1_DISABLE(); | |
| 2535 | |
| 2536 /* Get Start Tick*/ | |
| 2537 tickstart = HAL_GetTick(); | |
| 2538 | |
| 2539 /* Wait till PLLSAI1 is ready to be updated */ | |
| 2540 while(READ_BIT(RCC->CR, RCC_CR_PLLSAI1RDY) != RESET) | |
| 2541 { | |
| 2542 if((HAL_GetTick() - tickstart) > PLLSAI1_TIMEOUT_VALUE) | |
| 2543 { | |
| 2544 status = HAL_TIMEOUT; | |
| 2545 break; | |
| 2546 } | |
| 2547 } | |
| 2548 | |
| 2549 if(status == HAL_OK) | |
| 2550 { | |
| 2551 if(Divider == DIVIDER_P_UPDATE) | |
| 2552 { | |
| 2553 assert_param(IS_RCC_PLLSAI1P_VALUE(PllSai1->PLLSAI1P)); | |
| 2554 /* Configure the PLLSAI1 Division factor P and Multiplication factor N*/ | |
| 2555 #if defined(RCC_PLLSAI1P_DIV_2_31_SUPPORT) | |
| 2556 MODIFY_REG(RCC->PLLSAI1CFGR, | |
| 2557 RCC_PLLSAI1CFGR_PLLSAI1N | RCC_PLLSAI1CFGR_PLLSAI1PDIV, | |
| 2558 (PllSai1->PLLSAI1N << POSITION_VAL(RCC_PLLSAI1CFGR_PLLSAI1N)) | | |
| 2559 (PllSai1->PLLSAI1P << POSITION_VAL(RCC_PLLSAI1CFGR_PLLSAI1PDIV))); | |
| 2560 #else | |
| 2561 MODIFY_REG(RCC->PLLSAI1CFGR, | |
| 2562 RCC_PLLSAI1CFGR_PLLSAI1N | RCC_PLLSAI1CFGR_PLLSAI1P, | |
| 2563 (PllSai1->PLLSAI1N << POSITION_VAL(RCC_PLLSAI1CFGR_PLLSAI1N)) | | |
| 2564 ((PllSai1->PLLSAI1P >> 4U) << POSITION_VAL(RCC_PLLSAI1CFGR_PLLSAI1P))); | |
| 2565 #endif /* RCC_PLLSAI1P_DIV_2_31_SUPPORT */ | |
| 2566 } | |
| 2567 else if(Divider == DIVIDER_Q_UPDATE) | |
| 2568 { | |
| 2569 assert_param(IS_RCC_PLLSAI1Q_VALUE(PllSai1->PLLSAI1Q)); | |
| 2570 /* Configure the PLLSAI1 Division factor Q and Multiplication factor N*/ | |
| 2571 MODIFY_REG(RCC->PLLSAI1CFGR, | |
| 2572 RCC_PLLSAI1CFGR_PLLSAI1N | RCC_PLLSAI1CFGR_PLLSAI1Q, | |
| 2573 (PllSai1->PLLSAI1N << POSITION_VAL(RCC_PLLSAI1CFGR_PLLSAI1N)) | | |
| 2574 (((PllSai1->PLLSAI1Q >> 1U) - 1U) << POSITION_VAL(RCC_PLLSAI1CFGR_PLLSAI1Q))); | |
| 2575 } | |
| 2576 else | |
| 2577 { | |
| 2578 assert_param(IS_RCC_PLLSAI1R_VALUE(PllSai1->PLLSAI1R)); | |
| 2579 /* Configure the PLLSAI1 Division factor R and Multiplication factor N*/ | |
| 2580 MODIFY_REG(RCC->PLLSAI1CFGR, | |
| 2581 RCC_PLLSAI1CFGR_PLLSAI1N | RCC_PLLSAI1CFGR_PLLSAI1R, | |
| 2582 (PllSai1->PLLSAI1N << POSITION_VAL(RCC_PLLSAI1CFGR_PLLSAI1N)) | | |
| 2583 (((PllSai1->PLLSAI1R >> 1U) - 1U) << POSITION_VAL(RCC_PLLSAI1CFGR_PLLSAI1R))); | |
| 2584 } | |
| 2585 | |
| 2586 /* Enable the PLLSAI1 again by setting PLLSAI1ON to 1*/ | |
| 2587 __HAL_RCC_PLLSAI1_ENABLE(); | |
| 2588 | |
| 2589 /* Get Start Tick*/ | |
| 2590 tickstart = HAL_GetTick(); | |
| 2591 | |
| 2592 /* Wait till PLLSAI1 is ready */ | |
| 2593 while(READ_BIT(RCC->CR, RCC_CR_PLLSAI1RDY) == RESET) | |
| 2594 { | |
| 2595 if((HAL_GetTick() - tickstart) > PLLSAI1_TIMEOUT_VALUE) | |
| 2596 { | |
| 2597 status = HAL_TIMEOUT; | |
| 2598 break; | |
| 2599 } | |
| 2600 } | |
| 2601 | |
| 2602 if(status == HAL_OK) | |
| 2603 { | |
| 2604 /* Configure the PLLSAI1 Clock output(s) */ | |
| 2605 __HAL_RCC_PLLSAI1CLKOUT_ENABLE(PllSai1->PLLSAI1ClockOut); | |
| 2606 } | |
| 2607 } | |
| 2608 } | |
| 2609 | |
| 2610 return status; | |
| 2611 } | |
| 2612 | |
| 2613 #if defined(RCC_PLLSAI2_SUPPORT) | |
| 2614 | |
| 2615 /** | |
| 2616 * @brief Configure the parameters N & P & optionally M of PLLSAI2 and enable PLLSAI2 output clock(s). | |
| 2617 * @param PllSai2 pointer to an RCC_PLLSAI2InitTypeDef structure that | |
| 2618 * contains the configuration parameters N & P & optionally M as well as PLLSAI2 output clock(s) | |
| 2619 * @param Divider divider parameter to be updated | |
| 2620 * | |
| 2621 * @note PLLSAI2 is temporary disable to apply new parameters | |
| 2622 * | |
| 2623 * @retval HAL status | |
| 2624 */ | |
| 2625 static HAL_StatusTypeDef RCCEx_PLLSAI2_Config(RCC_PLLSAI2InitTypeDef *PllSai2, uint32_t Divider) | |
| 2626 { | |
| 2627 uint32_t tickstart = 0U; | |
| 2628 HAL_StatusTypeDef status = HAL_OK; | |
| 2629 | |
| 2630 /* check for PLLSAI2 Parameters used to output PLLSAI2CLK */ | |
| 2631 /* P, Q and R dividers are verified in each specific divider case below */ | |
| 2632 assert_param(IS_RCC_PLLSAI2SOURCE(PllSai2->PLLSAI2Source)); | |
| 2633 assert_param(IS_RCC_PLLSAI2M_VALUE(PllSai2->PLLSAI2M)); | |
| 2634 assert_param(IS_RCC_PLLSAI2N_VALUE(PllSai2->PLLSAI2N)); | |
| 2635 assert_param(IS_RCC_PLLSAI2CLOCKOUT_VALUE(PllSai2->PLLSAI2ClockOut)); | |
| 2636 | |
| 2637 /* Check that PLLSAI2 clock source and divider M can be applied */ | |
| 2638 if(__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_NONE) | |
| 2639 { | |
| 2640 /* PLL clock source and divider M already set, check that no request for change */ | |
| 2641 if((__HAL_RCC_GET_PLL_OSCSOURCE() != PllSai2->PLLSAI2Source) | |
| 2642 || | |
| 2643 (PllSai2->PLLSAI2Source == RCC_PLLSOURCE_NONE) | |
| 2644 || | |
| 2645 (((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM) >> POSITION_VAL(RCC_PLLCFGR_PLLM)) + 1U) != PllSai2->PLLSAI2M) | |
| 2646 ) | |
| 2647 { | |
| 2648 status = HAL_ERROR; | |
| 2649 } | |
| 2650 } | |
| 2651 else | |
| 2652 { | |
| 2653 /* Check PLLSAI2 clock source availability */ | |
| 2654 switch(PllSai2->PLLSAI2Source) | |
| 2655 { | |
| 2656 case RCC_PLLSOURCE_MSI: | |
| 2657 if(HAL_IS_BIT_CLR(RCC->CR, RCC_CR_MSIRDY)) | |
| 2658 { | |
| 2659 status = HAL_ERROR; | |
| 2660 } | |
| 2661 break; | |
| 2662 case RCC_PLLSOURCE_HSI: | |
| 2663 if(HAL_IS_BIT_CLR(RCC->CR, RCC_CR_HSIRDY)) | |
| 2664 { | |
| 2665 status = HAL_ERROR; | |
| 2666 } | |
| 2667 break; | |
| 2668 case RCC_PLLSOURCE_HSE: | |
| 2669 if(HAL_IS_BIT_CLR(RCC->CR, RCC_CR_HSERDY) && HAL_IS_BIT_CLR(RCC->CR, RCC_CR_HSEBYP)) | |
| 2670 { | |
| 2671 status = HAL_ERROR; | |
| 2672 } | |
| 2673 break; | |
| 2674 default: | |
| 2675 status = HAL_ERROR; | |
| 2676 break; | |
| 2677 } | |
| 2678 | |
| 2679 if(status == HAL_OK) | |
| 2680 { | |
| 2681 /* Set PLLSAI2 clock source and divider M */ | |
| 2682 MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM, PllSai2->PLLSAI2Source | (PllSai2->PLLSAI2M - 1U) << POSITION_VAL(RCC_PLLCFGR_PLLM)); | |
| 2683 } | |
| 2684 } | |
| 2685 | |
| 2686 if(status == HAL_OK) | |
| 2687 { | |
| 2688 /* Disable the PLLSAI2 */ | |
| 2689 __HAL_RCC_PLLSAI2_DISABLE(); | |
| 2690 | |
| 2691 /* Get Start Tick*/ | |
| 2692 tickstart = HAL_GetTick(); | |
| 2693 | |
| 2694 /* Wait till PLLSAI2 is ready to be updated */ | |
| 2695 while(READ_BIT(RCC->CR, RCC_CR_PLLSAI2RDY) != RESET) | |
| 2696 { | |
| 2697 if((HAL_GetTick() - tickstart) > PLLSAI2_TIMEOUT_VALUE) | |
| 2698 { | |
| 2699 status = HAL_TIMEOUT; | |
| 2700 break; | |
| 2701 } | |
| 2702 } | |
| 2703 | |
| 2704 if(status == HAL_OK) | |
| 2705 { | |
| 2706 if(Divider == DIVIDER_P_UPDATE) | |
| 2707 { | |
| 2708 assert_param(IS_RCC_PLLSAI2P_VALUE(PllSai2->PLLSAI2P)); | |
| 2709 /* Configure the PLLSAI2 Division factor P and Multiplication factor N*/ | |
| 2710 MODIFY_REG(RCC->PLLSAI2CFGR, | |
| 2711 RCC_PLLSAI2CFGR_PLLSAI2N | RCC_PLLSAI2CFGR_PLLSAI2P, | |
| 2712 (PllSai2->PLLSAI2N << POSITION_VAL(RCC_PLLSAI2CFGR_PLLSAI2N)) | | |
| 2713 ((PllSai2->PLLSAI2P >> 4U) << POSITION_VAL(RCC_PLLSAI2CFGR_PLLSAI2P))); | |
| 2714 } | |
| 2715 else | |
| 2716 { | |
| 2717 assert_param(IS_RCC_PLLSAI2R_VALUE(PllSai2->PLLSAI2R)); | |
| 2718 /* Configure the PLLSAI2 Division factor R and Multiplication factor N*/ | |
| 2719 MODIFY_REG(RCC->PLLSAI2CFGR, | |
| 2720 RCC_PLLSAI2CFGR_PLLSAI2N | RCC_PLLSAI2CFGR_PLLSAI2R, | |
| 2721 (PllSai2->PLLSAI2N << POSITION_VAL(RCC_PLLSAI2CFGR_PLLSAI2N)) | | |
| 2722 (((PllSai2->PLLSAI2R >> 1U) - 1U) << POSITION_VAL(RCC_PLLSAI2CFGR_PLLSAI2R))); | |
| 2723 } | |
| 2724 | |
| 2725 /* Enable the PLLSAI2 again by setting PLLSAI2ON to 1*/ | |
| 2726 __HAL_RCC_PLLSAI2_ENABLE(); | |
| 2727 | |
| 2728 /* Get Start Tick*/ | |
| 2729 tickstart = HAL_GetTick(); | |
| 2730 | |
| 2731 /* Wait till PLLSAI2 is ready */ | |
| 2732 while(READ_BIT(RCC->CR, RCC_CR_PLLSAI2RDY) == RESET) | |
| 2733 { | |
| 2734 if((HAL_GetTick() - tickstart) > PLLSAI2_TIMEOUT_VALUE) | |
| 2735 { | |
| 2736 status = HAL_TIMEOUT; | |
| 2737 break; | |
| 2738 } | |
| 2739 } | |
| 2740 | |
| 2741 if(status == HAL_OK) | |
| 2742 { | |
| 2743 /* Configure the PLLSAI2 Clock output(s) */ | |
| 2744 __HAL_RCC_PLLSAI2CLKOUT_ENABLE(PllSai2->PLLSAI2ClockOut); | |
| 2745 } | |
| 2746 } | |
| 2747 } | |
| 2748 | |
| 2749 return status; | |
| 2750 } | |
| 2751 | |
| 2752 #endif /* RCC_PLLSAI2_SUPPORT */ | |
| 2753 | |
| 2754 /** | |
| 2755 * @} | |
| 2756 */ | |
| 2757 | |
| 2758 /** | |
| 2759 * @} | |
| 2760 */ | |
| 2761 | |
| 2762 #endif /* HAL_RCC_MODULE_ENABLED */ | |
| 2763 /** | |
| 2764 * @} | |
| 2765 */ | |
| 2766 | |
| 2767 /** | |
| 2768 * @} | |
| 2769 */ | |
| 2770 | |
| 2771 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | |
| 2772 |
