新闻中心

EEPW首页>嵌入式系统>设计应用> MSP430学习笔记(3)时钟模块

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

作者: 时间:2016-11-27 来源:网络 收藏
1.时钟模块包括高速晶体振荡器、低俗晶体振荡器、数字控制振荡器DCO、锁频环FLL以及锁频环增强版本FLL+等部件构成。

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

本文引用地址://m.amcfsurvey.com/article/201611/322337.htm

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);



评论


技术专区

关闭