简介
以配置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);
}