MSP430F149时钟源选择(部分转)
MSP430的基本时钟源有3个: LFXT1CLK, XT2CLK, DCOCLK ;
其中: LFXT1CLK:可以用低频钟表晶体、标准晶体、陶瓷谐振器或外接时钟源工作。
XT2CLK:可以用标准晶体、陶瓷谐振器或外接450khz~8mhz的时钟源工作。
DCOCLK:它是内部数字控制RC振荡器,可以调节。
MSP430的3种时钟信号是: ACLK, MCLK, SMCLK;
其中: ACLK(辅助系统时钟):可选时钟源LFXT1CLK(只能是外部时钟源),且一般为32768hz手表晶体)。
MCLK(主时钟):可选LFXT1CLK,XT2CLK, DCOCLK 三种时钟源。用于CPU和系统。
SMCLK(子时钟):可选LFXT1CLK,XT2CLK, DCOCLK 三种时钟源。用于外围器件.
(Notice:LFXT1CLK when XT2 oscillator not present on-chip.)
ACLK和MCLK的区别:ACLK一般用于低速外设
SMCLK主要用于高速外围模块
上电默认是内部800K的RC振荡器,
下面给出了切换LFXT和XT2作为系统时钟的例子:
切换为LFXT:
do
{
IFG1 &= ~OFIFG;
for (i = 0xFF; i > 0; i--);
}
while ((IFG1 & OFIFG));
BCSCTL2 |= SELM_3;//选择钟表时钟
切换为XT2:
BCSCTL1&=~XT2OFF;//启动XT2时钟
do
{
IFG1 &= ~OFIFG;
for (i = 0xFF; i > 0; i--);
}
while ((IFG1 & OFIFG));
BCSCTL2 |= SELM_2;
BCSCTL2 |= SELS;//选择XT2时钟
430的时钟问题 2009年10月04日 星期日 20:59
系统时钟问题: 系统默认使用DCO,使用外部高速晶振XT2时必须自己开启XT2,并延时50us等待XT2起振,然后手工清除IFG1中的OFIFG位 !!!!一定要注意操作顺序:打开XT2->等待XT2稳定->切换系统时钟为XT2 若后面两步操作反了,在通常情况下不会出现问题,但是在电压不稳MCU频繁复位的情况下,非常容易造成MCU死掉,只能掉电后重新上电才能可靠复位。 今天做了一下时钟的实验 对于MCLK若选择了XT2 的话,在外部晶振XT2的使用过程中,需要特别注意的是,一旦外部晶振失效的话带来什么样的效果?对于这个效果,经过测试发现,当使用XT2作为MCLK和SMCLK的时钟源时若XT2不稳定,丢失一些时钟信号时这时MCLK会自动转换DCO作为其时钟源,经过测试,而SMCLK确依然用的是XT2(XT2只是波动一下,并非不工作),但是用示波器怎么测不出8M的晶振呢,测其它的怎么能测呢?不过时钟这一点搞清楚了 振荡器失效时,msp430也会自动将DCO选作为MCLK的时钟源,用户可以在DCO维持下在中断中检测OFIFG标志位,设置使用另外一个晶体振荡器来临时替代问题时钟源俩继续工作或完成发生警报等应急处理工作。 MSP430的时钟周期(振荡周期)、机器周期、指令周期之间的关系 机器周期:在计算机中,常把一条指令的执行过程划分为若干个阶段,每一个阶段完成一项工作。每一项工作称为一个基本操作,完成一个基本操作所需要的时间称为机器周期。8051系列单片机的一个机器周期由6个S周期(状态周期)组成。一个S周期=2个时钟周期,所以8051单片机的一个机器周期=6个状态周期=12个时钟周期。 指令周期:执行一条指令所需要的时间,一般由若干个机器周期组成。指令不同,所需的机器周期也不同。 专用知识: 在430中,一个时钟周期= MCLK晶振的倒数。如果MCLK是8M,则一个时钟周期为1/8us即为125ns; 一个机器周期 =一个时钟周期,即430每个动作都能完成一个基本操作; 一个指令周期 = 1~6个机器周期,具体根据具体指令而定。 另:指令长度,只是一个存储单位与时间没有必然关系 MSP430的3种时钟信号:MCLK系统主时钟;SMCLK系统子时钟;ACLK辅助时钟。 (1)MCLK系统主时钟。除了CPU运算使用此时钟以外,外围模块也可以使用。MCLK可以选择任何一个振荡器所产生的时钟信号并进行1、2、4、8分频作为其信号源。 (2)SMCLK系统子时钟。供外围模块使用。并在使用前可以通过各模块的寄存器实现分频。SMCLK可以选择DCO和XT2所产生的时钟信号并进行1、2、4、8分频作为其信号源。 (3)ACLK辅助时钟。供外围模块使用。并在使用前可以通过各模块的寄存器实现分频。但ACLK只能由LFXT1进行1、2、4、8分频作为信号源。 430的一个时钟周期=MCLK晶振的倒数。如果MCLK是8M,则一个时钟周期为1/8微秒; _NOP()是单周期的指令,I/O口赋值是4周期的。 |