HC32F460之时钟(晶振)设置

简介

以配置16M晶振为例,具体操作配置如下:

代码如下(修改点1)

void clock_init(void)
{
    stc_clk_xtal_cfg_t   stcXtalCfg; //高速外部震荡器
    stc_clk_mpll_cfg_t   stcMpllCfg; //倍频器/分频器
    stc_clk_sysclk_cfg_t stcSysClkCfg;  //系统时钟 

    MEM_ZERO_STRUCT(stcSysClkCfg);
    MEM_ZERO_STRUCT(stcXtalCfg);
    MEM_ZERO_STRUCT(stcMpllCfg);

    /* Set bus clk div. */
	stcSysClkCfg.enHclkDiv  = ClkSysclkDiv1;  //200M
    stcSysClkCfg.enExclkDiv = ClkSysclkDiv2;  //100M
    stcSysClkCfg.enPclk0Div = ClkSysclkDiv1;  //200M
    stcSysClkCfg.enPclk1Div = ClkSysclkDiv1;  //200M
    stcSysClkCfg.enPclk2Div = ClkSysclkDiv2;  //100M
    stcSysClkCfg.enPclk3Div = ClkSysclkDiv2;  //100M
    stcSysClkCfg.enPclk4Div = ClkSysclkDiv8;  //50M
    CLK_SysClkConfig(&stcSysClkCfg);
    CLK_SetPeriClkSource(ClkPeriSrcPclk);

    /* Switch system clock source to MPLL. */
    /* Use Xtal as MPLL source. */
    stcXtalCfg.enMode = ClkXtalModeOsc; //配置震荡器
    stcXtalCfg.enDrv = ClkXtalMidDrv; //16M属于中速(或低速)驱动能力
    stcXtalCfg.enFastStartup = Enable;  //使能快速启动
    CLK_XtalConfig(&stcXtalCfg); //配置参数
    CLK_XtalCmd(Enable); //使能震荡器

    /* flash read wait cycle setting */
    EFM_Unlock();
    //配置延迟周期(参考表3),这个参数跟HCLK配置频率有关系 
    EFM_SetLatency(EFM_LATENCY_4);
    EFM_Lock();

    /* Switch driver ability */
    PWC_HS2HP();

	/* MPLL config. */
/* 分频系数  (16M)晶振频率/(2)mdiv*(50)plln = MPLL频率 400MHz  */
	stcMpllCfg.pllmDiv = 2ul;    
    stcMpllCfg.plln =	50ul;		        /* 倍频系数 *100 = 400M */
		
    /* MPLL_P 分频系数  MPLL频率/p =  MPLL_P频率 200MHz */
    stcMpllCfg.PllpDiv = 2ul;	
 
    /* MPLL_Q 分频系数  MPLL频率/q =  MPLL_Q频率 200MHZ */
    stcMpllCfg.PllqDiv = 2ul;	

   /* MPLL_R 分频系数  MPLL频率/r =  MPLL_R频率 200MHZ */
    stcMpllCfg.PllrDiv = 2ul;	

    /* MPLL config. */
/* 分频系数  (8M)晶振频率/(1)mdiv*(50)plln = MPLL频率 400MHz  */
//    stcMpllCfg.pllmDiv = 1u; /* XTAL 8M / 1 */
//    stcMpllCfg.plln = 50u;   /* 8M*50 = 400M */
//    stcMpllCfg.PllpDiv = 2u; /* MLLP = 200M */
//    stcMpllCfg.PllqDiv = 2u; /* MLLQ = 200M */
//    stcMpllCfg.PllrDiv = 2u; /* MLLR = 200M */


    CLK_SetPllSource(ClkPllSrcXTAL); /* 配置时钟源 外部高速振荡器 */
    CLK_MpllConfig(&stcMpllCfg); /* 配置MPLL参数 */

    /* Enable MPLL. */
    CLK_MpllCmd(Enable);

    /* Wait MPLL ready. */
    while (Set != CLK_GetFlagStatus(ClkFlagMPLLRdy))
    {
    }

    /* Switch system clock source to MPLL. */
    CLK_SetSysClkSource(CLKSysSrcMPLL);
}

修改点2

在文件system_hc32f46x.h中加入:

#define XTAL_VALUE ((uint32_t)16000000) /*!< External high speed OSC freq. */

#if !defined (XTAL_VALUE)
    #define XTAL_VALUE ((uint32_t)8000000) /*!< External high speed OSC freq. */
#endif

时钟获取验证

void get_all_clock(void)
{
    stc_clk_freq_t   stcClkFreq;
    stc_pll_clk_freq_t stcPllClkFreq;

	MEM_ZERO_STRUCT(stcClkFreq);
    MEM_ZERO_STRUCT(stcPllClkFreq);

	CLK_GetClockFreq(&stcClkFreq);
	CLK_GetPllClockFreq(&stcPllClkFreq);
}

版权声明:本文为qq_32348883原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。