CIU32_L051_M307R/Peripheral/CIU32L051_Lib/Source/ciu32l051_std_rcc.c

218 lines
4.6 KiB
C
Raw Normal View History

/************************************************************************************************/
/**
* @file ciu32l051_std_rcc.c
* @author MCU Ecosystem Development Team
* @brief RCC STD<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* ʵ<EFBFBD><EFBFBD>RCCʱ<EFBFBD><EFBFBD>Ƶ<EFBFBD>ʻ<EFBFBD>ȡ<EFBFBD><EFBFBD>API<EFBFBD><EFBFBD>
*
*
**************************************************************************************************
* @attention
* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
*
**************************************************************************************************
*/
/************************************************************************************************/
/**
* @addtogroup CIU32L051_STD_Driver
* @{
*/
/**
* @addtogroup RCC
* @{
*
*/
/************************************************************************************************/
/*------------------------------------------includes--------------------------------------------*/
#include "ciu32l051_std.h"
/*-------------------------------------------functions------------------------------------------*/
/************************************************************************************************/
/**
* @addtogroup RCC_External_Functions
* @{
*
*/
/************************************************************************************************/
/**
* @brief <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ǰϵͳʱ<EFBFBD><EFBFBD>Ƶ<EFBFBD>ʣ<EFBFBD>SYSCLK<EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳʱ<EFBFBD><EFBFBD>Ƶ<EFBFBD>ʣ<EFBFBD>Hz<EFBFBD><EFBFBD>
*/
uint32_t std_rcc_get_sysclkfreq(void)
{
uint32_t frequency = 0;
uint32_t tmp = 0;
/* <20><>ȡ<EFBFBD><C8A1>ǰϵͳʱ<CDB3><CAB1>Դ */
switch(std_rcc_get_sysclk_source())
{
/* ϵͳʱ<CDB3><CAB1>ΪHXTAL<41><4C>HXTALĬ<4C><C4AC>8MHz */
case RCC_SYSCLK_SRC_STATUS_HXTAL:
{
frequency = HXTAL_VALUE;
}break;
/* ϵͳʱ<CDB3><CAB1>ΪPLL */
case RCC_SYSCLK_SRC_STATUS_PLLCLK:
{
frequency = std_rcc_get_pllfreq();
}break;
/* ϵͳʱ<CDB3><CAB1>ΪRCL */
case RCC_SYSCLK_SRC_STATUS_RCL:
{
frequency = RCL_VALUE;
}break;
/* ϵͳʱ<CDB3><CAB1>ΪLXTAL */
case RCC_SYSCLK_SRC_STATUS_LXTAL:
{
frequency = LXTAL_VALUE;
}break;
/* ϵͳʱ<CDB3><CAB1>ΪRCHSYS */
case RCC_SYSCLK_SRC_STATUS_RCHSYS:
default:
{
tmp = (1UL << ((RCC->CSR1 & (RCC_CSR1_RCHDIV_MASK))>> RCC_CSR1_RCHDIV_POS));
frequency = RCH_VALUE/tmp;
}break;
}
return frequency;
}
/**
* @brief <EFBFBD><EFBFBD>ȡPLLʱ<EFBFBD><EFBFBD>Ƶ<EFBFBD>ʣ<EFBFBD>SYSCLK<EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD><EFBFBD><EFBFBD>PLLʱ<EFBFBD><EFBFBD>Ƶ<EFBFBD>ʣ<EFBFBD>Hz<EFBFBD><EFBFBD>
*/
uint32_t std_rcc_get_pllfreq(void)
{
uint32_t frequency = 0;
uint32_t tmp = 0;
uint32_t pllm, plln, plldiv;
/* <20><>ȡ<EFBFBD><C8A1>ǰϵͳʱ<CDB3><CAB1>Դ */
if(std_rcc_get_pllsource() == RCC_PLLSRC_HXTAL)
{
/* PLLʱ<4C><CAB1>ԴΪHXTAL */
tmp = HXTAL_VALUE;
}
else
{
/* PLLʱ<4C><CAB1>ԴΪRCH */
tmp = RCH_VALUE;
}
pllm = (RCC->PLLCFG & RCC_PLLCFG_PLLM_MASK)>>RCC_PLLCFG_PLLM_POS;
plln = (RCC->PLLCFG & RCC_PLLCFG_PLLN_MASK)>>RCC_PLLCFG_PLLN_POS;
if(pllm == 0)
{
pllm = 32;
}
if(plln == 0)
{
plln = 8;
}
tmp = tmp*pllm/plln;
plldiv = (RCC->PLLCFG & RCC_PLLCFG_PLLDIV_MASK)>>RCC_PLLCFG_PLLDIV_POS;
frequency = tmp/(1UL<<plldiv);
return frequency;
}
/**
* @brief <EFBFBD><EFBFBD>ȡAHBʱ<EFBFBD><EFBFBD>Ƶ<EFBFBD>ʣ<EFBFBD>HCLK<EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD><EFBFBD><EFBFBD>HCLKʱ<EFBFBD><EFBFBD>Ƶ<EFBFBD>ʣ<EFBFBD>Hz<EFBFBD><EFBFBD>
*/
uint32_t std_rcc_get_hclkfreq(void)
{
uint32_t frequency = 0;
uint32_t tmp, hclk_div;
tmp = std_rcc_get_sysclkfreq();
/* <20><>ȡAHB<48><42>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD> */
hclk_div = std_rcc_get_ahbdiv()>>RCC_CFG_HPRE_POS;
frequency = tmp >> hclk_div;
return frequency;
}
/**
* @brief <EFBFBD><EFBFBD>ȡAPB1ʱ<EFBFBD><EFBFBD>Ƶ<EFBFBD>ʣ<EFBFBD>PCLK1<EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD><EFBFBD><EFBFBD>PCLK1ʱ<EFBFBD><EFBFBD>Ƶ<EFBFBD>ʣ<EFBFBD>Hz<EFBFBD><EFBFBD>
*/
uint32_t std_rcc_get_pclk1freq(void)
{
uint32_t frequency = 0;
uint32_t tmp, pclk1_div;
tmp = std_rcc_get_hclkfreq();
/* <20><>ȡAPB1<42><31>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD> */
pclk1_div = std_rcc_get_apb1div()>>RCC_CFG_P1PRE_POS;
if (pclk1_div < 3)
{
frequency = tmp;
}
else
{
pclk1_div -= 3;
frequency = tmp >> pclk1_div;
}
return frequency;
}
/**
* @brief <EFBFBD><EFBFBD>ȡAPB2ʱ<EFBFBD><EFBFBD>Ƶ<EFBFBD>ʣ<EFBFBD>PCLK2<EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD><EFBFBD><EFBFBD>PCLK2ʱ<EFBFBD><EFBFBD>Ƶ<EFBFBD>ʣ<EFBFBD>Hz<EFBFBD><EFBFBD>
*/
uint32_t std_rcc_get_pclk2freq(void)
{
uint32_t frequency = 0;
uint32_t tmp, pclk2_div;
tmp = std_rcc_get_hclkfreq();
/* <20><>ȡAPB2<42><32>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD> */
pclk2_div = std_rcc_get_apb2div()>>RCC_CFG_P2PRE_POS;
if (pclk2_div < 3)
{
frequency = tmp;
}
else
{
pclk2_div -= 3;
frequency = tmp >> pclk2_div;
}
return frequency;
}
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/