218 lines
4.6 KiB
C
218 lines
4.6 KiB
C
|
/************************************************************************************************/
|
|||
|
/**
|
|||
|
* @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;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* @}
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* @}
|
|||
|
*/
|
|||
|
|
|||
|
/**
|
|||
|
* @}
|
|||
|
*/
|