hc32l19x_reference_manaul

hc32l19x_ddl_rev1.0.3
sysctrl.cen_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;
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()。