#include "hdl_clk.h"

/********************************************************************************************************
*  @函数名   hdl_xtal_init						                                                           
*  @描述     外部晶振初始化							                                     
*  @参数     无
*  @返回值   无   
*  @注意     无
********************************************************************************************************/

#if USING_XTAL
static void hdl_xtal_init(void)
{
	stc_clock_xtal_init_t stcXtalInit;

    /* XTAL 引脚配置 */
    GPIO_AnalogCmd(GPIO_PORT_H, GPIO_PIN_00 | GPIO_PIN_01, ENABLE);
	
    (void)CLK_XtalStructInit(&stcXtalInit);
    /* 配置XTAL和启用XTAL */
    stcXtalInit.u8State = CLK_XTAL_ON;
    stcXtalInit.u8Mode = CLK_XTAL_MD_OSC;
    stcXtalInit.u8Drv = CLK_XTAL_DRV_ULOW;
    stcXtalInit.u8StableTime = CLK_XTAL_STB_2MS;
    (void)CLK_XtalInit(&stcXtalInit);
}
#endif


/********************************************************************************************************
*  @函数名   hdl_pll_init						                                                           
*  @描述     锁相环倍频初始化							                                     
*  @参数     无
*  @返回值   无   
*  @注意     无
********************************************************************************************************/
static void hdl_pll_init(void)
{
	stc_clock_pll_init_t      stcMPLLInit;

    (void)CLK_PLLStructInit(&stcMPLLInit);
	
    /* MPLL 配置 */
    /* 16MHz/M*N = 16/2*50/2 = 200MHz */
    stcMPLLInit.PLLCFGR = 0UL;
    stcMPLLInit.PLLCFGR_f.PLLM = (2UL - 1UL);
    stcMPLLInit.PLLCFGR_f.PLLN = (50UL - 1UL);
    stcMPLLInit.PLLCFGR_f.PLLP = (2UL - 1UL);
    stcMPLLInit.PLLCFGR_f.PLLQ = (2UL - 1UL);
    stcMPLLInit.PLLCFGR_f.PLLR = (2UL - 1UL);
    stcMPLLInit.u8PLLState = CLK_PLL_ON;
    stcMPLLInit.PLLCFGR_f.PLLSRC = CLK_PLL_SRC_HRC;     /* HRC = 16MHz */
    (void)CLK_PLLInit(&stcMPLLInit);
}


/********************************************************************************************************
*  @函数名   hdl_clk_init						                                                           
*  @描述     时钟初始化							                                     
*  @参数     无
*  @返回值   无   
*  @注意     无
********************************************************************************************************/
void hdl_clk_init(void)
{
	/* 解除写保护 */
    LL_PERIPH_WE(LL_PERIPH_EFM | LL_PERIPH_FCG | LL_PERIPH_GPIO | LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM);
    
	/* 设置时钟分频 */
    CLK_SetClockDiv(CLK_BUS_CLK_ALL, (CLK_HCLK_DIV1 | CLK_EXCLK_DIV2 | CLK_PCLK0_DIV1 | CLK_PCLK1_DIV2 | \
                                      CLK_PCLK2_DIV4 | CLK_PCLK3_DIV4 | CLK_PCLK4_DIV2));

    /* SRAM初始化包括读/写等待周期设置 */
    SRAM_SetWaitCycle(SRAM_SRAM_ALL, SRAM_WAIT_CYCLE1, SRAM_WAIT_CYCLE1);
    SRAM_SetWaitCycle(SRAM_SRAMH, SRAM_WAIT_CYCLE0, SRAM_WAIT_CYCLE0);
	
    /* 闪存读取等待周期设置 */
    EFM_SetWaitCycle(EFM_WAIT_CYCLE5);

    /* XTAL 初始化 */
//    hdl_xtal_init();
    /* XTAL32 初始化 */

    /* MPLL 初始化 */
    hdl_pll_init();
	
    /* enable LRC */

    /* enable HRC */
    /* 3 cycles for 126MHz ~ 200MHz */
    GPIO_SetReadWaitCycle(GPIO_RD_WAIT3);
    
    /* 切换驱动能力 */
    PWC_HighSpeedToHighPerformance();
	
    EFM_DataCacheResetCmd(ENABLE);
       
    EFM_DataCacheResetCmd(DISABLE);
    /* Enable cache */
    EFM_CacheCmd(ENABLE);
    
    /* 使能写保护 */
    LL_PERIPH_WP(LL_PERIPH_EFM | LL_PERIPH_GPIO | LL_PERIPH_SRAM);
	
	/* 设置系统时钟源 */
	CLK_SetSysClockSrc(CLK_SYSCLK_SRC_PLL);
	
	/* 使能systick */
	(void)SysTick_Init(1000U);
}

void hdl_delay_us(uint16_t us)
{
	for(int i=0;i<us;i++)
	{
		for(int j=0;j<35;j++)
		{
			__NOP();
		}
	}
}

void hdl_delay_ms(uint16_t ms)
{
	for(int i=0;i<ms;i++)
	{
		for(int j=0;j<13000;j++)
		{
			__NOP();
		}
	}
}
