001

Committer:
ganlikun
Date:
Sun Jun 12 14:02:44 2022 +0000
Revision:
0:13413ea9a877
00

Who changed what in which revision?

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