问题记录:华大 HC32L19x 时钟初始化函数存在缺陷

hc32l19x_reference_manaul

hc32l19x_ddl_rev1.0.3

sysctrl.c
en_result_t Sysctrl_SysClkSwitch(en_sysctrl_clk_source_t enSource)
{
en_result_t enRet = Ok;

en_sysctrl_clk_source_t ClkNew = enSource;

_SysctrlUnlock();
M0P_SYSCTRL->SYSCTRL0_f.CLKSW = ClkNew;

//更新Core时钟(HCLK)
SystemCoreClockUpdate();

return enRet;
}

en_result_t Sysctrl_ClkInit(stc_sysctrl_clk_cfg_t *pstcCfg)
{
en_result_t enRet = Ok;

//系统时钟参数配置
switch(pstcCfg->enClkSrc)
{
case SysctrlClkRCH:

break;
case SysctrlClkXTH:
Sysctrl_XTHDriverCfg(SysctrlXtalDriver3);
Sysctrl_SetXTHStableTime(SysctrlXthStableCycle16384);
break;
case SysctrlClkRCL:
Sysctrl_SetRCLStableTime(SysctrlRclStableCycle256);
break;
case SysctrlClkXTL:
Sysctrl_XTLDriverCfg(SysctrlXtlAmp3, SysctrlXtalDriver3);
Sysctrl_SetXTLStableTime(SysctrlXtlStableCycle16384);
break;
case SysctrlClkPLL:
Sysctrl_SetPLLStableTime(SysctrlPllStableCycle16384);
break;
default:
enRet = ErrorInvalidParameter;
break;
}

//时钟源使能
Sysctrl_ClkSourceEnable(pstcCfg->enClkSrc, TRUE);

//时钟源切换
Sysctrl_SysClkSwitch(pstcCfg->enClkSrc);

//时钟分频设置
Sysctrl_SetHCLKDiv(pstcCfg->enHClkDiv);
Sysctrl_SetPCLKDiv(pstcCfg->enPClkDiv);

return enRet;
}

Sysctrl_SysClkSwitch() 调用了 SystemCoreClockUpdate() 来更新 SystemCoreClock。这没问题,问题是在这之后又去设置了 HCLK 的值,这就会导致 SystemCoreClock 与实际的 HCLK 不一致。

通过修改驱动库,将「时钟源切换」和「时钟分频设置」的执行顺序对调即可解决该问题,若不想直接修改驱动库,可以在调用 Sysctrl_ClkInit() 之后再调用一遍 SystemCoreClockUpdate()。