在之前写的文章[1] https://blog.csdn.net/NoDistanceY/article/details/103858833 中,我提及了我将NUCLEO-H743ZI2评估板进行修改,将通信芯片上25MHz的晶振换到MCU的HLE的晶振接口上。发现的现象是晶振频率变成了8M。但这里要说的是,如果出现这种现象,请直接换晶振,否则将画大量时间在时间异常的处理上。
如果知道出现这种异常的原理,请解释一下。
使用到的代码
uint32_t TIM_get_TIM2_CNT(void)
{
return (TIM2_Handler.Instance->CNT)&(0x7fffffffffffffff);
}
void TIM_set_TIM2_CNT(uint32_t cnt)
{
HAL_TIM_Base_Stop(&TIM2_Handler);
TIM2_Handler.Instance->CNT = cnt & (0x7fffffffffffffff);
HAL_TIM_Base_Start(&TIM2_Handler);
//TIM2_Init(1000-1,2000-1);
}
异常分析
虽然这里可以看出频率大概是8M,但正常的25M晶振测量的震荡频率就是25M,并且是正弦波波形,由于当初没记录,请遇到类似情况的人自行用示波器检测。另外,因为是大概估计,并不能准确的获取震荡频率的误差值。
黄线时GPS芯片的PPS信号,这个信号每1s中会得到一个误差为微妙级的持续时间为100ms的秒冲,它将作为晶振频率评估的参考对象。设置一个每10ms产生一次的定时器,有定时器控制一个GPIO翻转,GPIO信号也接到示波器,即为上图的蓝线。当收到PPS信号时,用TIM_set_TIM2_CNT(0)重置定时器,于是在下一个1s到达时,假设测得的是99个完成10ms数据段和一段不足10ms的时间段(如上图所示),利用游标卡尺的思想,可知时间1s种慢了2.5ms,即可根据此值计算出晶振的频率实际为8*(1-0.0025)=7.98MHz。
正常晶振的评估
正常晶振的误差较小,不能通过下图来看出误差。
定时器方案不变,但有定时器中寄存器值来评估晶振。这个增量寄存器时每10ms增加1000,并到1000时自动归零。于是,在1PPS中断发生时,读取一下这个增量寄存器的值,并观察每秒钟的区别。
以我测试为例,使用函数TIM_get_TIM2_CNT()获取寄存器值,第1s测得531,第2s测得532,依次规律每秒增加1。也就是说晶振比参考源每秒增加10us,这就是晶振的误差。
当然,更准确的方法是通过更长时间尺度的测量来测得晶振的误差了。