51 #ifdef HAL_SAI_MODULE_ENABLED
53 #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \
54 defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F413xx) || \
100 uint32_t tmpregisterGCR;
102 #if defined(STM32F446xx)
106 case SAI_SYNCEXT_DISABLE :
109 case SAI_SYNCEXT_OUTBLOCKA_ENABLE :
110 tmpregisterGCR = SAI_GCR_SYNCOUT_0;
112 case SAI_SYNCEXT_OUTBLOCKB_ENABLE :
113 tmpregisterGCR = SAI_GCR_SYNCOUT_1;
120 if ((hsai->
Init.
Synchro) == SAI_SYNCHRONOUS_EXT_SAI2)
122 tmpregisterGCR |= SAI_GCR_SYNCIN_0;
127 SAI1->GCR = tmpregisterGCR;
131 SAI2->GCR = tmpregisterGCR;
134 #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \
135 defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F413xx) || defined(STM32F423xx)
139 case SAI_SYNCEXT_DISABLE :
142 case SAI_SYNCEXT_OUTBLOCKA_ENABLE :
143 tmpregisterGCR = SAI_GCR_SYNCOUT_0;
145 case SAI_SYNCEXT_OUTBLOCKB_ENABLE :
146 tmpregisterGCR = SAI_GCR_SYNCOUT_1;
152 SAI1->GCR = tmpregisterGCR;
164 uint32_t saiclocksource = 0U;
166 #if defined(STM32F446xx)
176 #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \
177 defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F413xx) || defined(STM32F423xx)
178 uint32_t vcoinput = 0U, tmpreg = 0U;
190 __HAL_RCC_SAI_BLOCKBCLKSOURCE_CONFIG((uint32_t)(hsai->
Init.
ClockSource << 2U));
194 if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI)
197 vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM));
202 vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)));
204 #if defined(STM32F413xx) || defined(STM32F423xx)
212 tmpreg = (RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U;
213 saiclocksource = (vcoinput * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U)) / (tmpreg);
216 tmpreg = (((RCC->DCKCFGR & RCC_DCKCFGR_PLLDIVR) >> 8U) + 1U);
218 saiclocksource = saiclocksource / (tmpreg);
227 tmpreg = (RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U;
228 saiclocksource = (vcoinput * ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U)) / (tmpreg);
231 tmpreg = ((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVR) + 1U);
232 saiclocksource = saiclocksource / (tmpreg);
236 if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE)
239 saiclocksource = (uint32_t)(HSE_VALUE);
244 saiclocksource = (uint32_t)(HSI_VALUE);
249 saiclocksource = EXTERNAL_CLOCK_VALUE;
259 tmpreg = (RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> 24U;
260 saiclocksource = (vcoinput * ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> 6U)) / (tmpreg);
263 tmpreg = (((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> 8U) + 1U);
264 saiclocksource = saiclocksource / (tmpreg);
273 tmpreg = (RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> 24U;
274 saiclocksource = (vcoinput * ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U)) / (tmpreg);
277 tmpreg = ((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) + 1U);
278 saiclocksource = saiclocksource / (tmpreg);
283 __HAL_RCC_I2S_CONFIG(RCC_I2SCLKSOURCE_EXT);
285 saiclocksource = EXTERNAL_CLOCK_VALUE;
290 return saiclocksource;
uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk)
Return the peripheral clock frequency for a given peripheral(SAI..)
void SAI_BlockSynchroConfig(const SAI_HandleTypeDef *hsai)
Configure SAI Block synchronization mode.
uint32_t SAI_GetInputClock(const SAI_HandleTypeDef *hsai)
Get SAI Input Clock based on SAI source clock selection.
SAI_Block_TypeDef * Instance
This file contains all the functions prototypes for the HAL module driver.