in CORTEX_M0_FT32F072_KEIL/Source/Libraries/FT32F0xx_Driver/Src/ft32f0xx_rcc.c [842:994]
void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)
{
uint32_t tmp = 0, pllmull = 0, pllsource = 0, prediv1factor = 0, presc = 0, pllclk = 0;
/* Get SYSCLK source -------------------------------------------------------*/
tmp = RCC->CFGR & RCC_CFGR_SWS;
switch (tmp)
{
case 0x00: /* HSI used as system clock */
RCC_Clocks->SYSCLK_Frequency = HSI_VALUE;
break;
case 0x04: /* HSE used as system clock */
RCC_Clocks->SYSCLK_Frequency = HSE_VALUE;
break;
case 0x08: /* PLL used as system clock */
/* Get PLL clock source and multiplication factor ----------------------*/
pllmull = RCC->CFGR & RCC_CFGR_PLLMULL;
pllsource = RCC->CFGR & RCC_CFGR_PLLSRC;
pllmull = ( pllmull >> 18) + 2;
if (pllsource == 0x00)
{
/* HSI oscillator clock divided by 2 selected as PLL clock entry */
pllclk = (HSI_VALUE >> 1) * pllmull;
}
else
{
prediv1factor = (RCC->CFGR2 & RCC_CFGR2_PREDIV1) + 1;
/* HSE oscillator clock selected as PREDIV1 clock entry */
pllclk = (HSE_VALUE / prediv1factor) * pllmull;
}
RCC_Clocks->SYSCLK_Frequency = pllclk;
break;
case 0x0C: /* HSI48 used as system clock */
RCC_Clocks->SYSCLK_Frequency = HSI48_VALUE;
break;
default: /* HSI used as system clock */
RCC_Clocks->SYSCLK_Frequency = HSI_VALUE;
break;
}
/* Compute HCLK, PCLK clocks frequencies -----------------------------------*/
/* Get HCLK prescaler */
tmp = RCC->CFGR & RCC_CFGR_HPRE;
tmp = tmp >> 4;
presc = APBAHBPrescTable[tmp];
/* HCLK clock frequency */
RCC_Clocks->HCLK_Frequency = RCC_Clocks->SYSCLK_Frequency >> presc;
/* Get PCLK prescaler */
tmp = RCC->CFGR & RCC_CFGR_PPRE;
tmp = tmp >> 8;
presc = APBAHBPrescTable[tmp];
/* PCLK clock frequency */
RCC_Clocks->PCLK_Frequency = RCC_Clocks->HCLK_Frequency >> presc;
/* ADCCLK clock frequency */
if((RCC->CFGR3 & RCC_CFGR3_ADCSW) != RCC_CFGR3_ADCSW)
{
/* ADC Clock is HSI14 Osc. */
RCC_Clocks->ADCCLK_Frequency = HSI14_VALUE;
}
else
{
if((RCC->CFGR & RCC_CFGR_ADCPRE) != RCC_CFGR_ADCPRE)
{
/* ADC Clock is derived from PCLK/2 */
RCC_Clocks->ADCCLK_Frequency = RCC_Clocks->PCLK_Frequency >> 1;
}
else
{
/* ADC Clock is derived from PCLK/4 */
RCC_Clocks->ADCCLK_Frequency = RCC_Clocks->PCLK_Frequency >> 2;
}
}
/* CECCLK clock frequency */
/* I2C1CLK clock frequency */
if((RCC->CFGR3 & RCC_CFGR3_I2C1SW) != RCC_CFGR3_I2C1SW)
{
/* I2C1 Clock is HSI Osc. */
RCC_Clocks->I2C1CLK_Frequency = HSI_VALUE;
}
else
{
/* I2C1 Clock is System Clock */
RCC_Clocks->I2C1CLK_Frequency = RCC_Clocks->SYSCLK_Frequency;
}
/* USART1CLK clock frequency */
if((RCC->CFGR3 & RCC_CFGR3_USART1SW) == 0x0)
{
/* USART1 Clock is PCLK */
RCC_Clocks->USART1CLK_Frequency = RCC_Clocks->PCLK_Frequency;
}
else if((RCC->CFGR3 & RCC_CFGR3_USART1SW) == RCC_CFGR3_USART1SW_0)
{
/* USART1 Clock is System Clock */
RCC_Clocks->USART1CLK_Frequency = RCC_Clocks->SYSCLK_Frequency;
}
else if((RCC->CFGR3 & RCC_CFGR3_USART1SW) == RCC_CFGR3_USART1SW_1)
{
/* USART1 Clock is LSE Osc. */
RCC_Clocks->USART1CLK_Frequency = LSE_VALUE;
}
else if((RCC->CFGR3 & RCC_CFGR3_USART1SW) == RCC_CFGR3_USART1SW)
{
/* USART1 Clock is HSI Osc. */
RCC_Clocks->USART1CLK_Frequency = HSI_VALUE;
}
/* USART2CLK clock frequency */
RCC_Clocks->USART2CLK_Frequency=RCC_Clocks->PCLK_Frequency;
/* USART2CLK clock frequency */
// if((RCC->CFGR3 & RCC_CFGR3_USART2SW) == 0x0)
// {
// /* USART Clock is PCLK */
// RCC_Clocks->USART2CLK_Frequency = RCC_Clocks->PCLK_Frequency;
// }
// else if((RCC->CFGR3 & RCC_CFGR3_USART2SW) == RCC_CFGR3_USART2SW_0)
// {
// /* USART Clock is System Clock */
// RCC_Clocks->USART2CLK_Frequency = RCC_Clocks->SYSCLK_Frequency;
// }
// else if((RCC->CFGR3 & RCC_CFGR3_USART2SW) == RCC_CFGR3_USART2SW_1)
// {
// /* USART Clock is LSE Osc. */
// RCC_Clocks->USART2CLK_Frequency = LSE_VALUE;
// }
// else if((RCC->CFGR3 & RCC_CFGR3_USART2SW) == RCC_CFGR3_USART2SW)
// {
// /* USART Clock is HSI Osc. */
// RCC_Clocks->USART2CLK_Frequency = HSI_VALUE;
// }
/* USART3CLK clock frequency */
/* USBCLK clock frequency */
if((RCC->CFGR3 & RCC_CFGR3_USBSW) != RCC_CFGR3_USBSW)
{
/* USB Clock is HSI48 */
RCC_Clocks->USBCLK_Frequency = HSI48_VALUE;
}
else
{
/* USB Clock is PLL clock */
RCC_Clocks->USBCLK_Frequency = pllclk;
}
}