×
单片机 > 单片机程序设计 > 详情

MSP430学习笔记(3)时钟模块

发布时间:2020-06-03 发布时间:
|

1.时钟模块包括高速晶体振荡器、低俗晶体振荡器、数字控制振荡器DCO、锁频环FLL以及锁频环增强版本FLL+等部件构成。


2.时钟模块产生3个输出结果:ACLK(辅助时钟),MCLK(主系统时钟)和SMCLK(子系统时钟)。


3.MSP430采用锁频环FLL以及锁频环增强版本FLL+等部件将晶体频率倍频至系统频率。数字控制振荡器DCO和锁频环FLL计数相结合可实现快速启动。在晶体振荡器失效时DCO可自动用于系统时钟。


4.3个时钟输入源:


a)LFXT1CLK:低频时钟源


b)XT2CLK:高频时钟源


c)DCOCLK:数字控制RC振荡器


5.3种时钟信号


a)ACLK:由LFXT1CLK信号经1、2、4、8分频后得到。ACLK可由软件选做各外围模块的时钟信号,一般用于低俗外设。


b)MCLK:由软件选择来自LFXT1CLK、XT2CLK、DCOCLK,然后经过1、2、4、8分频得到。MCLK主要用于CPU和系统。


c)SMCLK:可由软件选择来自LFXT1CLK和DCOCLK,然后经过1、2、4、8分频得到。SMCLK主要用于高速外围模块。


6.低速晶体振荡模块LFXT1


a)接手表晶振(32768Hz)时直接接在XIN和XOUT两个脚上,不需要其他外部器件,所有保持工作稳定的原件和移相电容都集成在芯片中。


b)也可通过外接450kHz~8MHz的高速晶体振荡器来工作在高频模式,这时两个引脚要外接电容。


7. 高速晶体振荡器XT2


a)MSP430外接高速晶体振荡器XT2的频率为450kHz~8MHz。


8.DCO振荡器


a)当LFXT1和XT2失效时,DCO振荡器会自动被选作MCLK的时钟源。振荡器失效引起的NMI中断请求可以得到响应,甚至在CPU关闭的情况下也可以。


b)DCO振荡器是一个可数字控制的RC振荡器,它的频率随供电电压和温度变化而具有一定的不稳定性。MSP430可以通过操作控制寄存器软件调节来增强振荡频率的稳定性。


9.时钟模块寄存器


a)DCO控制寄存器DCOCTL


i. DCOx:定义8种频率之一,可分段调节DCOCLK的频率,相邻两频率相差10%。而频率由注入直流发生器的电流定义。(默认为3)。


ii.MODx:定义在32个DCO周期中插入的fdco+1的个数,而在余下的DCO周期中为fdco周期,控制切换DCO和DCO+1两种频率。如果DCO常数为7,表示已经选择最高频率,此时不能利用MODx进行频率调整。


b)基本时钟系统控制寄存器1 BCSCTL1


 i.XT2OFF: 0使XT2开启,1使XT2关闭。(默认关闭)


ii.XTS:控制LFXT1的工作模式,选择须结合实际晶体振荡器的连接情况。为0时工作在低频,为1时工作在高频。(默认为低频,在高频时必须连接相应的高频时钟源)。


iii.DIVAx:控制ACLK分频。0为不分频,1为2分频,2为4分频,3为8分频。(默认不分频)。


iv.XT5V:此位设置为0。


v.RSELx:3位控制某个内部电阻以决定标称频率。为0为最低,依次增加,7为最高。(默认为4。)(由DCO默认值为3,RSELx默认值为4可以推算出DCO的默认频率为1000kHz左右。注意DCO的频率不稳定。)


c)基本时钟系统控制寄存器2 BCSCTL2


i.SELMx:选择MCLK时钟源,0为DCOCLK,1为DCOCLK,2为TX2CLK,3为LFTXT1CLK。(默认为DCO)


ii.DIVMx:选择MCLK分频,0为1分频,1为2分频,2为4分频,3为8分频。(默认1分频)


iii.SELS:选择SMCLK时钟源,0为DCO,1为TX2CLK(默认DCO)


iv.DIVSx:选择SMCLK分频,0为1分频,1为2分频,2为4分频,3为8分频。(默认为1分频,即SMCLK与MCLK一样)


v.DCOR:选择DCO电阻,0为内部电阻,1为外部电阻


d)SFR中断使能寄存器1


i.IE1是中断允许寄存器,IE1.1是振荡器故障中断允许位OFIE,置位表示允许中断,复位表示不允许中断。


e)SFR中断标志寄存器1


i.IFG1是中断标志寄存器,IFG1.1是振荡器故障中断标志位OF1FG,置位表示有振荡器故障,复位表示没有发生故障。


10.  PUC信号后DCOCLK被自动选作MCLK时钟信号,根据需要MCLK的时钟源可以另外设置为LFXT1或者XT2.顺序如下:


a)复位OSCOFF


b)清除OFIFG


c)延时等待至少50us


d)再检查OFIFG,如果置位,则重复3,4步,直到OFIFG=0


e)代码:


do


{


         IFG1 &=~OFIFG;


         for(I = 0xff;i> 0;i --);


}


while((IFG1 & OFIFG) != 0);



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址