/************************************************************************************************/
/**
* @file               std_rcc.c
* @author             MCU Ecosystem Development Team
* @brief              RCC STD库驱动。
*                     实现RCC时钟频率获取等API。
*
*
**************************************************************************************************
* @attention
* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
*
**************************************************************************************************
*/

/************************************************************************************************/
/**
* @addtogroup STD_Driver
* @{
*/

/**
* @addtogroup RCC 
* @{
*
*/
/************************************************************************************************/


/*------------------------------------------includes--------------------------------------------*/
#include "std.h"

/*-------------------------------------------functions------------------------------------------*/

/************************************************************************************************/
/**
* @addtogroup RCC_External_Functions 
* @{
*
*/
/************************************************************************************************/ 

/**
* @brief  获取当前系统时钟频率（SYSCLK）
* @retval uint32_t 返回系统时钟频率（Hz）
*/
uint32_t std_rcc_get_sysclkfreq(void)
{
    uint32_t frequency = 0;
    
    /* 获取当前系统时钟源 */
    switch(std_rcc_get_sysclk_source())
    {        
        /* 系统时钟为LXTAL */
        case RCC_CFG_SYSWS_LXTAL:
        {
            frequency = LXTAL_VALUE;
        }break;
        
        /* 系统时钟为RCL */
        case RCC_SYSCLK_SRC_STATUS_RCL:
        {
            frequency = RCL_VALUE;
        }break;  
                
        /* 系统时钟为RCH */
        case RCC_SYSCLK_SRC_STATUS_RCH:
        {
            frequency = std_rcc_get_rchfreq();         
        }break;        
    }
    return frequency;
}


/**
* @brief  获取AHB时钟频率（HCLK）
* @retval uint32_t 返回HCLK时钟频率（Hz）
*/
uint32_t std_rcc_get_hclkfreq(void)
{
    uint32_t frequency = 0;
    uint32_t tmp, hclk_div;
    
    tmp = std_rcc_get_sysclkfreq();
    
    /* 获取AHB分频因子 */
    hclk_div = std_rcc_get_ahbdiv()>>RCC_CFG_HPRE_POS;
    frequency = tmp >> hclk_div;    

    return frequency;
}


/**
* @brief  获取RCH时钟频率
* @retval uint32_t 返回RCH时钟频率（Hz）
*/
uint32_t std_rcc_get_rchfreq(void)
{
    uint32_t frequency = 0;
    uint32_t tmp;
    
    tmp = std_rcc_get_rch_source();
    
    /* 获取RCH时钟频率 */
    switch (tmp)
    {
        case RCC_CSR1_RCHFREQ_RCH16:   
        {
            frequency = RCH16_VALUE;
        }break;
        case RCC_CSR1_RCHFREQ_RCH48:   
        {
            frequency = RCH48_VALUE;
        }break;        
        default:
        {
            frequency = RCH4_VALUE;         
        }break;              
    }
    
    return frequency;
}


/**
* @brief  获取APB时钟频率（PCLK）
* @retval uint32_t 返回PCLK1时钟频率（Hz）
*/
uint32_t std_rcc_get_pclkfreq(void)
{
    uint32_t frequency = 0;
    uint32_t tmp, pclk_div;
    
    tmp = std_rcc_get_hclkfreq();
    
    /* 获取APB分频因子 */
    pclk_div = std_rcc_get_apbdiv()>>RCC_CFG_PPRE_POS;
    
    if (pclk_div < 3)
    {
        frequency = tmp;
    }
    else
    {
        pclk_div -= 3;
        frequency = tmp >> pclk_div;
    }
    
    return frequency;
}



/**
* @brief  获取LPUART1异步时钟频率
* @retval uint32_t 返回LPUART1时钟频率（Hz）
*/
uint32_t std_rcc_get_lpuart1freq(void)
{
    uint32_t tmp_clk_src;
    uint32_t frequency = 0;
    
    tmp_clk_src = std_rcc_get_lpuart1clk_source();
    
    switch (tmp_clk_src)
    {
        /* LPUART1的时钟源为PCLK */
        case RCC_LPUART1_ASYNC_CLK_SRC_PCLK:   
        {
            frequency = std_rcc_get_pclkfreq();
        }break;
        
        /* LPUART1的时钟源为SYSCLK */
        case RCC_LPUART1_ASYNC_CLK_SRC_SYSCLK:
        {
            frequency = std_rcc_get_sysclkfreq();
        }break;
        
        /* LPUART1的时钟源为RCH */
        case RCC_LPUART1_ASYNC_CLK_SRC_RCH:
        {
            frequency = std_rcc_get_rchfreq();
        }break;
        
        /* LPUART1的时钟源为LXTAL */
        case RCC_LPUART1_ASYNC_CLK_SRC_LXTAL:
        {
            frequency = LXTAL_VALUE;
        }break;
         
        default:
        {
            frequency = 0;         
        }break;    
    } 
    
    return frequency;
}

/** 
* @} 
*/



/** 
* @} 
*/

/** 
* @} 
*/
