//代码分析
//首先进行了系统时钟的一个初始化
//1初始化内容
//设置初始TRIM值,本样例采用从小到大的方式来TRIM,故此处设置为'1',后续不断更新该值后进行TRIM,直到符合条件(校准)为止
M0P_SYSCTRL->RCL_CR_f.TRIM = 1;
///< 使能待校准时钟,本样例对RCL 32768Hz进行校准
Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE);//
///< 使能被监测时钟,本样例使用XTL
///< XTL 配置及使能
Sysctrl_XTLDriverCfg(SysctrlXtlAmp3, SysctrlXtalDriver3);
Sysctrl_SetXTLStableTime(SysctrlXtlStableCycle16384);
Sysctrl_ClkSourceEnable(SysctrlClkXTL, TRUE);
//初始化要点:1.设置了RCL_CR.TRIM的值为1。
//2打开RCL 32768
//3.TRIM的初始化
//打开TRIM外设时钟
Sysctrl_SetPeripheralGate(SysctrlPeripheralTrim, TRUE);//打开外设时钟? ///< 时钟校准
//TRIM校准流程
stcCfg.enMON = TrimMonDisable; //
stcCfg.enREFCLK = TrimRefMskXTL;
stcCfg.enCALCLK = TrimCalMskRCL;
stcCfg.u32RefCon = 328u; //10ms校准时间(增加该时间可提高TRIM精度)//根据参考时钟来的
stcCfg.u32CalCon = 0xFFFFFFFFu; //配置为默认值//这个可以先不用管。
Trim_Init(&stcCfg);
///< 打开TRIM中断使能//打开中断
Trim_EnableIrq();
///< 使能并配置TRIM 系统中断
EnableNvic(CLKTRIM_IRQn, IrqLevel3, TRUE);//中断中断号。
//4. Trim_Run();跑这个程序。
//主要是进入中断之后做什么事情。
volatile uint32_t u32CalCnt;
if(Trim_GetIntFlag(TrimStop))
{
u32CalCnt = Trim_CalCntGet();//获取的时间。
///<参考计数值计数完成(10ms)时,查看待校准计数值是否也为(10ms)计数值,或是否在允许误差范围内,此处为32768/100 = 328(±0.3%)
///<可根据实际修改该比较范围,提高TRIM校准精度。
if ((u32CalCnt <= (328u + 1u)) &&
(u32CalCnt >= (328u - 1u)))
{
Trim_Stop();
///< 校准结束,此时的TRIM值即为最佳频率值
u8TrimTestFlag = 0xFFu;
}
else
{
Trim_Stop();
///< 为达到目标精度,TRIM值增加1,继续校准
M0P_SYSCTRL->RCL_CR_f.TRIM += 1;
Trim_Run();
}
}
if(Trim_GetIntFlag(TrimCalCntOf)) //参考校准时间设置过长,导致待校准计数器溢出,此时需要重新配置参考校准时间及校准精度
{
u8TrimTestFlag = 0;
}
华大110时钟校准
最新推荐文章于 2023-11-01 15:45:03 发布