在调试HC32L130 过程中,发现串口波特率有误差,然后调整RCH时钟到24MHZ, 波特率依然有2.8%左右的误差。通过测试PB00的输出波形,发现输出的RCH频率大约为24.8MHZ。这种问题是什么原因导致的?RCH_CR_TRIM_24M_VAL (*((volatile uint16_t*) (0x00100C00ul))) 里面的值怎么确定的?我测试了六七个单片机里面的值都是不一样的,感觉这个值应该是出厂调试好的,输出频率应该是精准的。下面是我的时钟初始化函数,是按照demo写的。
//时钟初始化配置
void App_ClkInit(void)
{
stc_sysctrl_clk_cfg_t stcCfg;
///< 开启FLASH外设时钟
Sysctrl_SetPeripheralGate(SysctrlPeripheralFlash, TRUE);
///<========================== 时钟初始化配置 ===================================
///< 因要使用的时钟源HCLK小于24M:此处设置FLASH 读等待周期为0 cycle(默认值也为0 cycle)
Flash_WaitCycle(FlashWaitCycle0);
///< 时钟初始化前,优先设置要使用的时钟源:此处设置RCH为4MHz
Sysctrl_SetRCHTrim(SysctrlRchFreq4MHz);
///< 选择内部RCH作为HCLK时钟源;
stcCfg.enClkSrc = SysctrlClkRCH;
///< HCLK SYSCLK/1
stcCfg.enHClkDiv = SysctrlHclkDiv1;
///< PCLK 为HCLK/1
stcCfg.enPClkDiv = SysctrlPclkDiv1;
///< 系统时钟初始化
Sysctrl_ClkInit(&stcCfg);
}
//将时钟从RCH4MHz切换至RCH24MHz,
void App_Rch4MHzTo24MHz(void)
{
///<============== 将时钟从RCH4MHz切换至RCH24MHz ==============================
///< RCH时钟不同频率的切换,需要先将时钟切换到RCL,设置好频率后再切回RCH
Sysctrl_SetRCLTrim(SysctrlRclFreq32768);
Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE);
Sysctrl_SysClkSwitch(SysctrlClkRCL);
///< 加载目标频率的RCH的TRIM值
Sysctrl_SetRCHTrim(SysctrlRchFreq24MHz);
///< 使能RCH(默认打开,此处可不需要再次打开)
//Sysctrl_ClkSourceEnable(SysctrlClkRCH, TRUE);
///< 时钟切换到RCH
Sysctrl_SysClkSwitch(SysctrlClkRCH);
///< 关闭RCL时钟
Sysctrl_ClkSourceEnable(SysctrlClkRCL, FALSE);
} |