5529的系统时钟可以采用好几种方式,现在的问题是LAB实验里面采用的是不是XT2?我看程序的时候,程序配置的都是跟DCO相关的配置寄存器,因为里面的寄存器都是以DCO为前缀的,而我又问了下其他人,说DCOCLK是数字RC振荡器,频率比较低,而另外一个LFXT1也是低频的,在MSP430系列单片机资料上看到对DCO振荡器的说明,不是非常明白,外部LFXT1和XT2失效时,DCO振荡器就会自动使用为MCLK为系统提供时钟源,此时振荡器就会产生失效,触发NMI中断响应请求,也就是每个主程序文件里面都会有一个NMI的中断服务程序,将振荡器触发的失效标志清零,我这样理解不知道对不对???
ZhaoF:
我的理解,仅供参考
(1)每个程序中,Board_init(void);这一函数中已经将XT1和XT2引脚声明了,但没有继续配置XT1的电容什么的。(XT2不需要配置)
(2)DCO模块运行需要参考时钟REFCLK,REFCLK可以来自REFOCLK、XT1CLK和XT2CLK,通过UCSCTL3的SELREF选择,默认使用的XT1CLK,但如果XT1CLK不可用则使用内部的REFOCLK。都是32.768KHZ
DCO模块有两个输出时钟信号,级DCOCLK和DCOCLKDIV,其中,倍频计算公式如下:
DCOCLK = D*(N+1)*(REFCLK/n)
DCOCLKDIV = (N+1)*(REFCLK/n)
其中:n即REFCLK输入时钟分频,可以通过UCSCTL3中的FLLCLKDIV设定,默认为1,也就是不分频;
D可以通过UCSCTL2中的FLLD来设定,默认为1,也就是2分频;
N可以通过UCSCTL2中的FLLN来设定,默认值为32。
所以,系统上电后如果不做任何设置,DCOCLK的实际值为2097152,DCOCLKDIV的实际值为1048576。即MCLK和SMCLK都为1.048576MHZ
(3)振荡器无效会使相应的标志位置位,不是中断。所以最好不用的话,就把外部时钟关掉。
Hardy Zhou:
楼上理解得不错,详细阐述了FLL输出频率的计算方法
1、开发板上XT1,XT2都有放置晶振电路,所以可以选择不同的时钟源来进行实验
2、DCOCLK是数字RC振荡器,频率可以从高达100多MHz,频率精度比较低。
3、时钟失效操作请参考 user guide: USC Module Fail-Safe Operation 章节
如果是能NMI中断,外部晶振故障可以触发程序执行NMI中断代码
Triton Zhang:
回复 Hardy Zhou:
纠正一个观点,
DCO是数字振荡器,并不是说数字振荡器的精度差,而是数字振荡器的调节是非连续的,即具有离散性。离散并不是精度不准。
具体到一个频点来说,有可能数字调节的振荡器不能恰好在这个频率,就会出现在这个频点上下跳动的情况。