#include "sr_rcc.h"


#ifdef SR_USE_RCC

#include "n32l40x_rcc.h"


SR_WEAK void BspSetSysclkToHsi(uint32_t sysclkFreq)
{
    switch(sysclkFreq)
    {
        case 64000000: 
        default: //16MHz
            RCC_ConfigHse(RCC_HSE_DISABLE);
            RCC_ConfigHsi(RCC_HSI_ENABLE);
            RCC_EnableHsi(ENABLE);
            while(RCC_WaitHsiStable()==ERROR);
                      
        break;

    }


}

/**
 * @brief RCC时钟配置
 * @note  配置系统时钟源和频率、LSI/LSE使能
 *
 * @param[in] cfg  系统时钟源配置结构体,可选值SR_RCC_CFG_T *类型
 *
 * @return 成功返回0，失败返回负值错误码
 */
int BspRccClkConfig(SR_RCC_CFG_T *cfg)
{

    switch(cfg->sysclkSrc)
    {
        case SR_SYSCLK_PLL:
            //待完善
            return SR_NOIMPT;
        break;
        
        case SR_SYSCLK_HSE:
            //待完善
            return SR_NOIMPT;
        break;
            
        default: //默认SR_SYSCLK_HSI
           //BspSetSysclkToHsi(cfg->sysclkFreq);
        break;
    }

    RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_PWR, ENABLE);
    if(cfg->lsiState) RCC_EnableLsi(ENABLE);
    if(cfg->lseState) RCC_ConfigLse(RCC_LSE_ENABLE);
    
    return SR_OK;
}


/**
 * @brief 获取时钟频率
 *
 * @param[in]  type    时钟类型，SR_CLK_TYPE_E枚举
 * @param[out] freq    频率值，uint32_t*类型单位Hz
 *
 * @return 成功返回0，失败返回负值错误码
 */
int BspRccGetClkFreq(SR_CLK_TYPE_E type,uint32_t *freq)
{
    RCC_ClocksType RCC_Clocks;
    RCC_GetClocksFreqValue(&RCC_Clocks);

    switch(type)
    {
        case SR_SYSCLK:
            *freq = RCC_Clocks.SysclkFreq;
        break;
        
        case SR_HCLK:
            *freq = RCC_Clocks.HclkFreq;
        break;

        case SR_PCLK1:
            *freq = RCC_Clocks.Pclk1Freq;
        break;

        case SR_PCLK2:
            *freq = RCC_Clocks.Pclk2Freq;
        break;

        default:
            *freq =0;
        break;
    }

    return SR_OK;
}

#endif