inport from local

Dependents:   Hobbyking_Cheetah_0511

Committer:
NYX
Date:
Mon Mar 16 06:35:48 2020 +0000
Revision:
0:85b3fd62ea1a
reinport to mbed;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
NYX 0:85b3fd62ea1a 1 /**
NYX 0:85b3fd62ea1a 2 ******************************************************************************
NYX 0:85b3fd62ea1a 3 * @file stm32f4xx_hal_sai_ex.c
NYX 0:85b3fd62ea1a 4 * @author MCD Application Team
NYX 0:85b3fd62ea1a 5 * @version V1.7.1
NYX 0:85b3fd62ea1a 6 * @date 14-April-2017
NYX 0:85b3fd62ea1a 7 * @brief SAI Extension HAL module driver.
NYX 0:85b3fd62ea1a 8 * This file provides firmware functions to manage the following
NYX 0:85b3fd62ea1a 9 * functionalities of SAI extension peripheral:
NYX 0:85b3fd62ea1a 10 * + Extension features functions
NYX 0:85b3fd62ea1a 11 *
NYX 0:85b3fd62ea1a 12 @verbatim
NYX 0:85b3fd62ea1a 13 ==============================================================================
NYX 0:85b3fd62ea1a 14 ##### SAI peripheral extension features #####
NYX 0:85b3fd62ea1a 15 ==============================================================================
NYX 0:85b3fd62ea1a 16
NYX 0:85b3fd62ea1a 17 [..] Comparing to other previous devices, the SAI interface for STM32F446xx
NYX 0:85b3fd62ea1a 18 devices contains the following additional features :
NYX 0:85b3fd62ea1a 19
NYX 0:85b3fd62ea1a 20 (+) Possibility to be clocked from PLLR
NYX 0:85b3fd62ea1a 21
NYX 0:85b3fd62ea1a 22 ##### How to use this driver #####
NYX 0:85b3fd62ea1a 23 ==============================================================================
NYX 0:85b3fd62ea1a 24 [..] This driver provides functions to manage several sources to clock SAI
NYX 0:85b3fd62ea1a 25
NYX 0:85b3fd62ea1a 26 @endverbatim
NYX 0:85b3fd62ea1a 27 ******************************************************************************
NYX 0:85b3fd62ea1a 28 * @attention
NYX 0:85b3fd62ea1a 29 *
NYX 0:85b3fd62ea1a 30 * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
NYX 0:85b3fd62ea1a 31 *
NYX 0:85b3fd62ea1a 32 * Redistribution and use in source and binary forms, with or without modification,
NYX 0:85b3fd62ea1a 33 * are permitted provided that the following conditions are met:
NYX 0:85b3fd62ea1a 34 * 1. Redistributions of source code must retain the above copyright notice,
NYX 0:85b3fd62ea1a 35 * this list of conditions and the following disclaimer.
NYX 0:85b3fd62ea1a 36 * 2. Redistributions in binary form must reproduce the above copyright notice,
NYX 0:85b3fd62ea1a 37 * this list of conditions and the following disclaimer in the documentation
NYX 0:85b3fd62ea1a 38 * and/or other materials provided with the distribution.
NYX 0:85b3fd62ea1a 39 * 3. Neither the name of STMicroelectronics nor the names of its contributors
NYX 0:85b3fd62ea1a 40 * may be used to endorse or promote products derived from this software
NYX 0:85b3fd62ea1a 41 * without specific prior written permission.
NYX 0:85b3fd62ea1a 42 *
NYX 0:85b3fd62ea1a 43 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
NYX 0:85b3fd62ea1a 44 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
NYX 0:85b3fd62ea1a 45 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
NYX 0:85b3fd62ea1a 46 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
NYX 0:85b3fd62ea1a 47 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
NYX 0:85b3fd62ea1a 48 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
NYX 0:85b3fd62ea1a 49 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
NYX 0:85b3fd62ea1a 50 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
NYX 0:85b3fd62ea1a 51 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
NYX 0:85b3fd62ea1a 52 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
NYX 0:85b3fd62ea1a 53 *
NYX 0:85b3fd62ea1a 54 ******************************************************************************
NYX 0:85b3fd62ea1a 55 */
NYX 0:85b3fd62ea1a 56
NYX 0:85b3fd62ea1a 57 /* Includes ------------------------------------------------------------------*/
NYX 0:85b3fd62ea1a 58 #include "stm32f4xx_hal.h"
NYX 0:85b3fd62ea1a 59
NYX 0:85b3fd62ea1a 60 /** @addtogroup STM32F4xx_HAL_Driver
NYX 0:85b3fd62ea1a 61 * @{
NYX 0:85b3fd62ea1a 62 */
NYX 0:85b3fd62ea1a 63
NYX 0:85b3fd62ea1a 64 /** @defgroup SAIEx SAIEx
NYX 0:85b3fd62ea1a 65 * @brief SAI Extension HAL module driver
NYX 0:85b3fd62ea1a 66 * @{
NYX 0:85b3fd62ea1a 67 */
NYX 0:85b3fd62ea1a 68
NYX 0:85b3fd62ea1a 69 #ifdef HAL_SAI_MODULE_ENABLED
NYX 0:85b3fd62ea1a 70
NYX 0:85b3fd62ea1a 71 #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \
NYX 0:85b3fd62ea1a 72 defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F413xx) || \
NYX 0:85b3fd62ea1a 73 defined(STM32F423xx)
NYX 0:85b3fd62ea1a 74
NYX 0:85b3fd62ea1a 75 /* Private typedef -----------------------------------------------------------*/
NYX 0:85b3fd62ea1a 76 /* Private define ------------------------------------------------------------*/
NYX 0:85b3fd62ea1a 77 /* SAI registers Masks */
NYX 0:85b3fd62ea1a 78 /* Private macro -------------------------------------------------------------*/
NYX 0:85b3fd62ea1a 79 /* Private variables ---------------------------------------------------------*/
NYX 0:85b3fd62ea1a 80 /* Private function prototypes -----------------------------------------------*/
NYX 0:85b3fd62ea1a 81 /* Private functions ---------------------------------------------------------*/
NYX 0:85b3fd62ea1a 82
NYX 0:85b3fd62ea1a 83 /** @defgroup SAI_Private_Functions SAI Private Functions
NYX 0:85b3fd62ea1a 84 * @{
NYX 0:85b3fd62ea1a 85 */
NYX 0:85b3fd62ea1a 86 /**
NYX 0:85b3fd62ea1a 87 * @}
NYX 0:85b3fd62ea1a 88 */
NYX 0:85b3fd62ea1a 89
NYX 0:85b3fd62ea1a 90 /* Exported functions --------------------------------------------------------*/
NYX 0:85b3fd62ea1a 91 /** @defgroup SAIEx_Exported_Functions SAI Extended Exported Functions
NYX 0:85b3fd62ea1a 92 * @{
NYX 0:85b3fd62ea1a 93 */
NYX 0:85b3fd62ea1a 94
NYX 0:85b3fd62ea1a 95 /** @defgroup SAIEx_Exported_Functions_Group1 Extension features functions
NYX 0:85b3fd62ea1a 96 * @brief Extension features functions
NYX 0:85b3fd62ea1a 97 *
NYX 0:85b3fd62ea1a 98 @verbatim
NYX 0:85b3fd62ea1a 99 ===============================================================================
NYX 0:85b3fd62ea1a 100 ##### Extension features Functions #####
NYX 0:85b3fd62ea1a 101 ===============================================================================
NYX 0:85b3fd62ea1a 102 [..]
NYX 0:85b3fd62ea1a 103 This subsection provides a set of functions allowing to manage the possible
NYX 0:85b3fd62ea1a 104 SAI clock sources.
NYX 0:85b3fd62ea1a 105
NYX 0:85b3fd62ea1a 106 @endverbatim
NYX 0:85b3fd62ea1a 107 * @{
NYX 0:85b3fd62ea1a 108 */
NYX 0:85b3fd62ea1a 109
NYX 0:85b3fd62ea1a 110 /**
NYX 0:85b3fd62ea1a 111 * @brief Configure SAI Block synchronization mode
NYX 0:85b3fd62ea1a 112 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
NYX 0:85b3fd62ea1a 113 * the configuration information for SAI module.
NYX 0:85b3fd62ea1a 114 * @retval SAI Clock Input
NYX 0:85b3fd62ea1a 115 */
NYX 0:85b3fd62ea1a 116 void SAI_BlockSynchroConfig(SAI_HandleTypeDef *hsai)
NYX 0:85b3fd62ea1a 117 {
NYX 0:85b3fd62ea1a 118 uint32_t tmpregisterGCR = 0U;
NYX 0:85b3fd62ea1a 119
NYX 0:85b3fd62ea1a 120 #if defined(STM32F446xx)
NYX 0:85b3fd62ea1a 121 /* This setting must be done with both audio block (A & B) disabled */
NYX 0:85b3fd62ea1a 122 switch(hsai->Init.SynchroExt)
NYX 0:85b3fd62ea1a 123 {
NYX 0:85b3fd62ea1a 124 case SAI_SYNCEXT_DISABLE :
NYX 0:85b3fd62ea1a 125 tmpregisterGCR = 0U;
NYX 0:85b3fd62ea1a 126 break;
NYX 0:85b3fd62ea1a 127 case SAI_SYNCEXT_OUTBLOCKA_ENABLE :
NYX 0:85b3fd62ea1a 128 tmpregisterGCR = SAI_GCR_SYNCOUT_0;
NYX 0:85b3fd62ea1a 129 break;
NYX 0:85b3fd62ea1a 130 case SAI_SYNCEXT_OUTBLOCKB_ENABLE :
NYX 0:85b3fd62ea1a 131 tmpregisterGCR = SAI_GCR_SYNCOUT_1;
NYX 0:85b3fd62ea1a 132 break;
NYX 0:85b3fd62ea1a 133 default:
NYX 0:85b3fd62ea1a 134 break;
NYX 0:85b3fd62ea1a 135 }
NYX 0:85b3fd62ea1a 136
NYX 0:85b3fd62ea1a 137 if((hsai->Init.Synchro) == SAI_SYNCHRONOUS_EXT_SAI2)
NYX 0:85b3fd62ea1a 138 {
NYX 0:85b3fd62ea1a 139 tmpregisterGCR |= SAI_GCR_SYNCIN_0;
NYX 0:85b3fd62ea1a 140 }
NYX 0:85b3fd62ea1a 141
NYX 0:85b3fd62ea1a 142 if((hsai->Instance == SAI1_Block_A) || (hsai->Instance == SAI1_Block_B))
NYX 0:85b3fd62ea1a 143 {
NYX 0:85b3fd62ea1a 144 SAI1->GCR = tmpregisterGCR;
NYX 0:85b3fd62ea1a 145 }
NYX 0:85b3fd62ea1a 146 else
NYX 0:85b3fd62ea1a 147 {
NYX 0:85b3fd62ea1a 148 SAI2->GCR = tmpregisterGCR;
NYX 0:85b3fd62ea1a 149 }
NYX 0:85b3fd62ea1a 150 #endif /* STM32F446xx */
NYX 0:85b3fd62ea1a 151 #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \
NYX 0:85b3fd62ea1a 152 defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F413xx) || defined(STM32F423xx)
NYX 0:85b3fd62ea1a 153 /* This setting must be done with both audio block (A & B) disabled */
NYX 0:85b3fd62ea1a 154 switch(hsai->Init.SynchroExt)
NYX 0:85b3fd62ea1a 155 {
NYX 0:85b3fd62ea1a 156 case SAI_SYNCEXT_DISABLE :
NYX 0:85b3fd62ea1a 157 tmpregisterGCR = 0U;
NYX 0:85b3fd62ea1a 158 break;
NYX 0:85b3fd62ea1a 159 case SAI_SYNCEXT_OUTBLOCKA_ENABLE :
NYX 0:85b3fd62ea1a 160 tmpregisterGCR = SAI_GCR_SYNCOUT_0;
NYX 0:85b3fd62ea1a 161 break;
NYX 0:85b3fd62ea1a 162 case SAI_SYNCEXT_OUTBLOCKB_ENABLE :
NYX 0:85b3fd62ea1a 163 tmpregisterGCR = SAI_GCR_SYNCOUT_1;
NYX 0:85b3fd62ea1a 164 break;
NYX 0:85b3fd62ea1a 165 default:
NYX 0:85b3fd62ea1a 166 break;
NYX 0:85b3fd62ea1a 167 }
NYX 0:85b3fd62ea1a 168 SAI1->GCR = tmpregisterGCR;
NYX 0:85b3fd62ea1a 169 #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx || STM32F413xx || STM32F423xx */
NYX 0:85b3fd62ea1a 170 }
NYX 0:85b3fd62ea1a 171 /**
NYX 0:85b3fd62ea1a 172 * @brief Get SAI Input Clock based on SAI source clock selection
NYX 0:85b3fd62ea1a 173 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
NYX 0:85b3fd62ea1a 174 * the configuration information for SAI module.
NYX 0:85b3fd62ea1a 175 * @retval SAI Clock Input
NYX 0:85b3fd62ea1a 176 */
NYX 0:85b3fd62ea1a 177 uint32_t SAI_GetInputClock(SAI_HandleTypeDef *hsai)
NYX 0:85b3fd62ea1a 178 {
NYX 0:85b3fd62ea1a 179 /* This variable used to store the SAI_CK_x (value in Hz) */
NYX 0:85b3fd62ea1a 180 uint32_t saiclocksource = 0U;
NYX 0:85b3fd62ea1a 181
NYX 0:85b3fd62ea1a 182 #if defined(STM32F446xx)
NYX 0:85b3fd62ea1a 183 if ((hsai->Instance == SAI1_Block_A) || (hsai->Instance == SAI1_Block_B))
NYX 0:85b3fd62ea1a 184 {
NYX 0:85b3fd62ea1a 185 saiclocksource = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SAI1);
NYX 0:85b3fd62ea1a 186 }
NYX 0:85b3fd62ea1a 187 else /* SAI2_Block_A || SAI2_Block_B*/
NYX 0:85b3fd62ea1a 188 {
NYX 0:85b3fd62ea1a 189 saiclocksource = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SAI2);
NYX 0:85b3fd62ea1a 190 }
NYX 0:85b3fd62ea1a 191 #endif /* STM32F446xx */
NYX 0:85b3fd62ea1a 192 #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \
NYX 0:85b3fd62ea1a 193 defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F413xx) || defined(STM32F423xx)
NYX 0:85b3fd62ea1a 194 uint32_t vcoinput = 0U, tmpreg = 0U;
NYX 0:85b3fd62ea1a 195
NYX 0:85b3fd62ea1a 196 /* Check the SAI Block parameters */
NYX 0:85b3fd62ea1a 197 assert_param(IS_SAI_CLK_SOURCE(hsai->Init.ClockSource));
NYX 0:85b3fd62ea1a 198
NYX 0:85b3fd62ea1a 199 /* SAI Block clock source selection */
NYX 0:85b3fd62ea1a 200 if(hsai->Instance == SAI1_Block_A)
NYX 0:85b3fd62ea1a 201 {
NYX 0:85b3fd62ea1a 202 __HAL_RCC_SAI_BLOCKACLKSOURCE_CONFIG(hsai->Init.ClockSource);
NYX 0:85b3fd62ea1a 203 }
NYX 0:85b3fd62ea1a 204 else
NYX 0:85b3fd62ea1a 205 {
NYX 0:85b3fd62ea1a 206 __HAL_RCC_SAI_BLOCKBCLKSOURCE_CONFIG((uint32_t)(hsai->Init.ClockSource << 2U));
NYX 0:85b3fd62ea1a 207 }
NYX 0:85b3fd62ea1a 208
NYX 0:85b3fd62ea1a 209 /* VCO Input Clock value calculation */
NYX 0:85b3fd62ea1a 210 if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI)
NYX 0:85b3fd62ea1a 211 {
NYX 0:85b3fd62ea1a 212 /* In Case the PLL Source is HSI (Internal Clock) */
NYX 0:85b3fd62ea1a 213 vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM));
NYX 0:85b3fd62ea1a 214 }
NYX 0:85b3fd62ea1a 215 else
NYX 0:85b3fd62ea1a 216 {
NYX 0:85b3fd62ea1a 217 /* In Case the PLL Source is HSE (External Clock) */
NYX 0:85b3fd62ea1a 218 vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)));
NYX 0:85b3fd62ea1a 219 }
NYX 0:85b3fd62ea1a 220 #if defined(STM32F413xx) || defined(STM32F423xx)
NYX 0:85b3fd62ea1a 221 /* SAI_CLK_x : SAI Block Clock configuration for different clock sources selected */
NYX 0:85b3fd62ea1a 222 if(hsai->Init.ClockSource == SAI_CLKSOURCE_PLLR)
NYX 0:85b3fd62ea1a 223 {
NYX 0:85b3fd62ea1a 224 /* Configure the PLLI2S division factor */
NYX 0:85b3fd62ea1a 225 /* PLL_VCO Input = PLL_SOURCE/PLLM */
NYX 0:85b3fd62ea1a 226 /* PLL_VCO Output = PLL_VCO Input * PLLN */
NYX 0:85b3fd62ea1a 227 /* SAI_CLK(first level) = PLL_VCO Output/PLLR */
NYX 0:85b3fd62ea1a 228 tmpreg = (RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U;
NYX 0:85b3fd62ea1a 229 saiclocksource = (vcoinput * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U))/(tmpreg);
NYX 0:85b3fd62ea1a 230
NYX 0:85b3fd62ea1a 231 /* SAI_CLK_x = SAI_CLK(first level)/PLLDIVR */
NYX 0:85b3fd62ea1a 232 tmpreg = (((RCC->DCKCFGR & RCC_DCKCFGR_PLLDIVR) >> 8U) + 1U);
NYX 0:85b3fd62ea1a 233
NYX 0:85b3fd62ea1a 234 saiclocksource = saiclocksource/(tmpreg);
NYX 0:85b3fd62ea1a 235
NYX 0:85b3fd62ea1a 236 }
NYX 0:85b3fd62ea1a 237 else if(hsai->Init.ClockSource == SAI_CLKSOURCE_PLLI2S)
NYX 0:85b3fd62ea1a 238 {
NYX 0:85b3fd62ea1a 239 /* Configure the PLLI2S division factor */
NYX 0:85b3fd62ea1a 240 /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */
NYX 0:85b3fd62ea1a 241 /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */
NYX 0:85b3fd62ea1a 242 /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SR */
NYX 0:85b3fd62ea1a 243 tmpreg = (RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U;
NYX 0:85b3fd62ea1a 244 saiclocksource = (vcoinput * ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U))/(tmpreg);
NYX 0:85b3fd62ea1a 245
NYX 0:85b3fd62ea1a 246 /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVR */
NYX 0:85b3fd62ea1a 247 tmpreg = ((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVR) + 1U);
NYX 0:85b3fd62ea1a 248 saiclocksource = saiclocksource/(tmpreg);
NYX 0:85b3fd62ea1a 249 }
NYX 0:85b3fd62ea1a 250 else if(hsai->Init.ClockSource == SAI_CLKSOURCE_HS)
NYX 0:85b3fd62ea1a 251 {
NYX 0:85b3fd62ea1a 252 if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE)
NYX 0:85b3fd62ea1a 253 {
NYX 0:85b3fd62ea1a 254 /* Get the I2S source clock value */
NYX 0:85b3fd62ea1a 255 saiclocksource = (uint32_t)(HSE_VALUE);
NYX 0:85b3fd62ea1a 256 }
NYX 0:85b3fd62ea1a 257 else
NYX 0:85b3fd62ea1a 258 {
NYX 0:85b3fd62ea1a 259 /* Get the I2S source clock value */
NYX 0:85b3fd62ea1a 260 saiclocksource = (uint32_t)(HSI_VALUE);
NYX 0:85b3fd62ea1a 261 }
NYX 0:85b3fd62ea1a 262 }
NYX 0:85b3fd62ea1a 263 else /* sConfig->ClockSource == SAI_CLKSource_Ext */
NYX 0:85b3fd62ea1a 264 {
NYX 0:85b3fd62ea1a 265 saiclocksource = EXTERNAL_CLOCK_VALUE;
NYX 0:85b3fd62ea1a 266 }
NYX 0:85b3fd62ea1a 267 #else
NYX 0:85b3fd62ea1a 268 /* SAI_CLK_x : SAI Block Clock configuration for different clock sources selected */
NYX 0:85b3fd62ea1a 269 if(hsai->Init.ClockSource == SAI_CLKSOURCE_PLLSAI)
NYX 0:85b3fd62ea1a 270 {
NYX 0:85b3fd62ea1a 271 /* Configure the PLLI2S division factor */
NYX 0:85b3fd62ea1a 272 /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */
NYX 0:85b3fd62ea1a 273 /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */
NYX 0:85b3fd62ea1a 274 /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */
NYX 0:85b3fd62ea1a 275 tmpreg = (RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> 24U;
NYX 0:85b3fd62ea1a 276 saiclocksource = (vcoinput * ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> 6U))/(tmpreg);
NYX 0:85b3fd62ea1a 277
NYX 0:85b3fd62ea1a 278 /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */
NYX 0:85b3fd62ea1a 279 tmpreg = (((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> 8U) + 1U);
NYX 0:85b3fd62ea1a 280 saiclocksource = saiclocksource/(tmpreg);
NYX 0:85b3fd62ea1a 281
NYX 0:85b3fd62ea1a 282 }
NYX 0:85b3fd62ea1a 283 else if(hsai->Init.ClockSource == SAI_CLKSOURCE_PLLI2S)
NYX 0:85b3fd62ea1a 284 {
NYX 0:85b3fd62ea1a 285 /* Configure the PLLI2S division factor */
NYX 0:85b3fd62ea1a 286 /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */
NYX 0:85b3fd62ea1a 287 /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */
NYX 0:85b3fd62ea1a 288 /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */
NYX 0:85b3fd62ea1a 289 tmpreg = (RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> 24U;
NYX 0:85b3fd62ea1a 290 saiclocksource = (vcoinput * ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U))/(tmpreg);
NYX 0:85b3fd62ea1a 291
NYX 0:85b3fd62ea1a 292 /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */
NYX 0:85b3fd62ea1a 293 tmpreg = ((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) + 1U);
NYX 0:85b3fd62ea1a 294 saiclocksource = saiclocksource/(tmpreg);
NYX 0:85b3fd62ea1a 295 }
NYX 0:85b3fd62ea1a 296 else /* sConfig->ClockSource == SAI_CLKSource_Ext */
NYX 0:85b3fd62ea1a 297 {
NYX 0:85b3fd62ea1a 298 /* Enable the External Clock selection */
NYX 0:85b3fd62ea1a 299 __HAL_RCC_I2S_CONFIG(RCC_I2SCLKSOURCE_EXT);
NYX 0:85b3fd62ea1a 300
NYX 0:85b3fd62ea1a 301 saiclocksource = EXTERNAL_CLOCK_VALUE;
NYX 0:85b3fd62ea1a 302 }
NYX 0:85b3fd62ea1a 303 #endif /* STM32F413xx || STM32F423xx */
NYX 0:85b3fd62ea1a 304 #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx || STM32F413xx || STM32F423xx */
NYX 0:85b3fd62ea1a 305 /* the return result is the value of SAI clock */
NYX 0:85b3fd62ea1a 306 return saiclocksource;
NYX 0:85b3fd62ea1a 307 }
NYX 0:85b3fd62ea1a 308
NYX 0:85b3fd62ea1a 309 /**
NYX 0:85b3fd62ea1a 310 * @}
NYX 0:85b3fd62ea1a 311 */
NYX 0:85b3fd62ea1a 312
NYX 0:85b3fd62ea1a 313 /**
NYX 0:85b3fd62ea1a 314 * @}
NYX 0:85b3fd62ea1a 315 */
NYX 0:85b3fd62ea1a 316
NYX 0:85b3fd62ea1a 317 #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F413xx || STM32F423xx */
NYX 0:85b3fd62ea1a 318 #endif /* HAL_SAI_MODULE_ENABLED */
NYX 0:85b3fd62ea1a 319 /**
NYX 0:85b3fd62ea1a 320 * @}
NYX 0:85b3fd62ea1a 321 */
NYX 0:85b3fd62ea1a 322
NYX 0:85b3fd62ea1a 323 /**
NYX 0:85b3fd62ea1a 324 * @}
NYX 0:85b3fd62ea1a 325 */
NYX 0:85b3fd62ea1a 326
NYX 0:85b3fd62ea1a 327 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/