MSP430的时钟模块由低速晶体振荡器LFXT1、高速晶体振荡器XT2(MSP430X11X,MSP430X12X没有)、数字控制振荡器DCO、琐相环FLL(MSP430X16X以上包括)和增强型琐相环FLL+等部件组成。
MSP430X1XX基本时钟模块有三个时钟输入源LFXT1CLK(低速32768Hz,高速450Hz到8MHz)、XT2CLK(450Hz到8MHz)、DCOCLK,提供以下三种时钟信号
1.ACLK辅助时钟:由LFXT1CLK信号经1、2、4、8分频后得到,可以由软件选作各个外围模块的时钟信号,一般用于低速外设。
2.MCLK系统主时钟:MCLK可由软件选择来自LFXT1CLK、XT2CLK、DCOCLK三者之一,然后经1、2、4、8分频得到,MCLK主要用于CPU和系统。
3.SMCLK子系统时钟:可由软件选自LFXT1CLK和DCOCLK(MSP430X11X、MSP430X12X系列,因其不含XT2),或XT2CLK和DCOCLK,然后经1、2、4、8分频得到。SMCLK主要用于高速外围模块。
系统频率与系统的工作电压密切相关(MSP430工作电压1.8V~3.6V,编程电压2.7V~3.6V),所以不同的工作电压,需要选择不同的系统时钟。当两个外部振荡器失效时,DCO振荡器会自动被选作MCLK的时钟源。PUC信号之后,DCOCLK被自动选作MCLK和SMCLK的时钟信号,LFXT1CLK被选作ACLK的时钟信号,根据需要MCLK和SMCLK的时钟源可以另外设置。
控制时钟模块的三个寄存器为DCO控制寄存器DCOCTL、基本时钟系统控制寄存器1BCSCTL1、基本时钟控制寄存器2BCSCTL2
1.DCOCTL
7 6 5 4 3 2 1 0
DCO2 DCO1 DCO0 MOD4 MOD3 MOD2 MOD1 MOD0
DCO.0~DCO.2 定义8种频率之一(DCO=0~DCO=8),可分段调节DCOCLK频率,相领两种频率相差10%。
MOD.0~MOD.4 定义在32个DCO周期中插入的fdco+1周期个数,而余下的周期为fdco周期,控制切换DCO和DCO+1选择的两种频率,如果DCO常数为7,表示已经选择最高频率,此时不能利用MOD.0~MOD.4进行频率调整。
DCOCTL POR后初始值为60H。
2.BCSCTL1
7 6 5 4 3 2 1 0
XT2OFF XTS DIVA1 DIVA0 XT5V RSEL2 RSEL1 RSEL0
BCSCTL1初始值为84H
XT2OFF 控制XT2的开启和关闭
0 XT2振荡器开启
1 XT2振荡器关闭(默认)
XTS 控制LFXT1工作模式
0 低频模式(默认)
1 高频模式
DIVA1、DIVA0 控制ACLK分频
0 0 不分频(默认)
0 1 2分频
1 0 4分频
1 1 8分频
XT5V 此位设置为0
RSEL0~RSEL2 三位控制内部电阻以决定标称频率
0 选择最低标称频率
... ......
7 选择最高标称频率
3.BCSCLK2
7 6 5 4 3 2 1 0
SELM1 SELM0 DIVM1 DIVM0 SELS DIVS1 DIVS0 DCOR
SELM1 SELM0 选择MCLK时钟源
0 0 DCOCLK(默认)
0 1 DCOCLK
1 0 LFXT1CLK对于MSP430F11/12X,XT2CLK对于MSP430F13/14/15/16X
1 1 LFXT1CLK
DIVM1 DIVM0 选择MCLK分频
0 0 不分频
0 1 2分频
1 0 4分频
1 1 8分频
SELS 选择SMCLK时钟源
0 DCLK(默认)
1 LFXT1CLK对于MSP430F11/12X,XT2CLK对于MSP430F13/14/15/16X
DIVS1 DIVS0 选择SMCLK分频
0 0 不分频
0 1 2分频
1 0 4分频
1 1 8分频
DCOR 选择DCO电阻
0 内部电阻
1 外部电阻
时钟模块的应用
一、设置MCLK=XT2,SMCLK=DCOCLK,将MCLK由P5.4输出(MSP430X14X中引脚P5.4和MCLK复用)
#include "msp430x14x.h"
void main(void)
{
unsigned int i;
WDTCTL= WDTPW+WDTHOLD; //Stop watchdog to prevent to overflow
P5DIR | = 0X10; //Set P5.4 to output
P5SEL | = 0X10; //Set P5.4 to MCLK mode
BCSCTL1 &= ~XT2OFF; //Enable XT2
do{
IFG1 & = ~OFIFG; //Clear OFIFG
for(i=0xff;i>0;i--); //Set a delay
}while(IFG1&OFIFG); //check-up the OFIFG
BCSCTL2 | = SELM_2; //Set XT2CLK the clock of MCLK
for(;;);
}
二、 设置ACLK=MCLK=LFXT1=HF,将ACLK用P2.0(复用)输出。
#include "msp430x14x.h"
void main(void)
{
unsigned int i,j;
WDTCTL = WDTPW+ WDTHOLD;
P1DIR =0x02;
P2DIR =0x01;
P2SEL=0x01;
BCSCTL1 | = XTS;
do{
IFG1 & = ~OFIFG;
for(i=0xff;i>0;i--);
}while(IFG1 & OFIFG);
BCSCTL2 | = SELM_3;
for(;;);
}
版主,新人刚刚接触MSP430,为什么我看的示例代码中有的是BCSCTL1 但有的又是UCSSCTL?
这两个的区别是什么?或者是不同的型号不同的名称而已?
哦,了解了,谢谢版主的细心解答,我得先多看看资料了
楼主讲的挺好的,我也是刚学完时钟模块,嘿嘿,过来复习一遍。时钟频率,可以通过编程,用示波器在P5.4、P5.5和P5.6观测波形。从程序上还可以调节频率。ACLK,MCLK和SMCLK的波形都可以看的。
UCSCTL1 = DCORSEL_2; // 设置DCO范围 如何求解啊
DCO.0~DCO.2 定义8种频率之一(DCO=0~DCO=8),可分段调节DCOCLK频率,相领两种频率相差10%。
版主,新人求教,我用msp430f149测量光电编码器的脉冲数时,用了P1口中断和TA捕获的方法,20缝的码盘转动一圈后能进几百次中断(设变量,每进一次中断自加1,一圈下来变成几百了)而且不稳定。。。请问怎样将脉冲信号设置成TA的时钟源进行测量脉冲数呢?谢谢版主
我是用下降沿的,,,难道是边沿选择问题?不知为什么会一次脉冲进几十次中断