Clock Tree
一般情况下,STM32系列都有内置RC振荡器,在对时钟信号精度要求不高的情况之下,这个内置RC振荡器可以代替外置晶振,以达到节省成本和PCB空间之目的。但对振荡器精度有着严格要求的电路应用,建议使用外部晶振来代替内部时钟,这类似于独立显卡与集成显卡的区别。
内置RC振荡器和外置晶振在精度上差距很大,分析如下:
举例:
假如在某一个应用中,需要精确延时9999秒钟,使用定时器进行定时中断,设置10ms的定时周期,需要经过9999 / 10 * 1000=999900个定时周期才能完成。而定时器的时钟源是由APB2(文档上写的是APB1,程序上是APB2)提供的,APB2的时钟最终来自HSI、PLL、HSE三个时钟源。
由于直接测量9999秒钟的时间较为繁琐,我们选择测量2秒钟的时间即可,看看定时2秒钟,内外时钟源分别能提供怎样的精度,采集设备使用逻辑分析仪或者示波器即可。
- 使用HSI时钟测到的2秒钟的波形:
可以看到实际定时时间为2.004270583秒钟,规定 α = Ta / Tb,其中Ta表示设定的定时时间,Tb表示实际定时时间,阿尔法为比例系数,大致按照比例缩放来计算,如果定时为9999秒,实际定时时间为Ta = Tb * α = 10020.3507797085秒,实际误差高达21秒钟。
- 使用外置晶振进行测试:
可以看到实际定时时间为2.000074417秒,按照同样的方法进行计算可以得到Ta = Tb * α = 9999.3720477915秒,误差0.372秒。如果需要更高精度的定时时间,可以选择更高精度的晶振,当然也可以使用频率值高一点的晶振,然后下调PLL倍频系数。
通常情况下,晶振频率误差可看作为固定值,经PLL倍频之后,误差同样会被放大,降低PLL倍频系数可以减少误差的放大。另外,可以直接选取标称频率为48MHz的晶振,SYSCLK的时钟源直接选择HSE即可,这样误差可以做到更小。