原创 MSP430学习笔记(2)

2011-7-22 21:23 2834 6 6 分类: MCU/ 嵌入式

  第二个例子功能是:实现流水灯以三种流动方式和四种流动速度,的不同组合而进行点亮"流动",对于流动方式我兴趣不大,只是算法而已。看一看速度的变化,这个例子是用改变时钟频率的方法来实现速度的变化。

1.改变速度

这是在中断程序中改的。

   if(j == 40)

    {   i = 0;

        j = 0;

        flag++;

        if(flag == 4) flag = 0;

        switch(speed)

        {

        case 0:

            TACTL &=~ (ID0 + ID1);

            TACTL |= ID_3;

            break;

        case 1:

            TACTL &=~ (ID0 + ID1);

            TACTL |= ID_2;

            break;

        case 2:

            TACTL &=~ (ID0 + ID1);

            TACTL |= ID_1;

            break;

        case 3:

            TACTL &=~ (ID0 + ID1);

            TACTL |= ID_0;

            break;

        default:

            break;

        }

        if(flag != 3)   speed++;

        if(speed == 4) speed = 0;

}

 

查找有关ID_0ID_1ID_2ID_3的定义如下:

#define ID_0   (0*0x40u)  /* Timer A input divider: 0 - /1 */

#define ID_1   (1*0x40u)  /* Timer A input divider: 1 - /2 */

#define ID_2   (2*0x40u)  /* Timer A input divider: 2 - /4 */

#define ID_3   (3*0x40u)  /* Timer A input divider: 3 - /8 */

应该分别是不分频、2分频、4分频和8分频?那么速度就应该是这样一种关系,下面来看一看能不能观察这个速度。

2.查看时间

IAR没有如同keil一样能观察时间,搜索一下,找到查看方法。

进入Debug后,选菜单View/Register,出现Register窗口,里面有个Cycles,它就是CPU运行的周期数,除以CPU频率,就是运行时间了。 如果CPU频率是1M的话,那个数正好是CPU运行的us数。

但是进入调试后,没有能够进入中断。所以没有能够查看到。

没有其他办法,只有详细研究MSP430的时钟模块了。

3.时钟源

20110722212043001.jpg

实验板上的晶振电路

430X13X/14X系列的里钟有高速晶体、低速晶体和DCO三种。(其他还有一些系列具有FLLFLL+两种)。

各个系列的不同基础里钟模块产生相同的结果:输出3种不同频率里钟ACLKMCLKSMCLK(辅助时钟、主系统时钟和子系统时钟),送给各种不同需求的模块。

20110722212043002.gif

MSP430的时钟系统

其中LFXT1CLK是低频时钟晶体产生的低频时钟源

XT2CLK是标准晶体或陶瓷谐振器产生的高频时钟源

DCOCLK是由片内数字控制的RC振荡器。

 

其中ACLK是由LFXT1CLK信号经1248分频后得到的。

而在这个电路中LFXT1CLK信号就是32768晶体。

那么,在没有特别设置的情况下,ACLK应该是1分频,也就是32768了?

       验证一下:上一个程序中

    CCR0 = 2047;   //设定周期0.5S

    32768/2048=16

       然后:

TACTL = TASSEL_1 + ID_3 + MC_1; //定时器A的时钟源选择ACLK,增计数模式

    ID_38分频,那么16/8=2Hz,也就是0.5s

验证结果正确。

       回到本例中来。在main函数中有这样一行:

TACTL = TASSEL_2 + ID_3 + MC_1; //定时器A的时钟源选择SMCLK,增计数模式

即选择的SMCLK作为时钟源。

关于SMCLK的介绍如下:

SMCLK,可以由软件选择来自LFXT1CLK,XT2CLK,DCOCLK三都之一,然后经过1248分频得到。

那么在没有特别安排的情况下SMCLK选择的是哪一个时钟源,又是多少分频呢?

       BCSCTL2地址为58HPUC后的值是00H,其中SELS是用来选择 MCLK的时钟源。SELS=0SMCLK的时钟源是DCOCLK

SELS=1SMCLK的时钟源是LFTX1CLKMSP430F11XX)或者TX2CLKMSP43013X\14X

       那么对于本板来说,由于主芯片是MFS430F149,因此只可能是DCOCLK或者是TX2CLK两者之一,那么究竟是哪一个呢?

20110722212044003.jpg

进入调试,可以观察到BCSCTL2的值是00,即选择DCOCLK

       DIVS0DIVS1是选择SMCLK的分频因子的。

       00:不分频,012分频,104分频,118分频。

即选择DCOCLK,不分频。那么DCOCLK的值是多少呢?

查看关于DCOCLK的介绍,可真复杂。

DCO将一个内部或外部电阻接到直流发生器,它的阻值决定了DCOCLK的基础频率。

DCO基础频率由内部或外部电阻身体DC发生器注入的电流决定,由DCOR控制位选择片内或片外面电阻。

②基础频率由控制位RSEL2,RSEL1,RSEL0分频为8个标称频率范围,而这些频率范围因不同型号而异。 

③控制位DCO0DCO1DCO2可分段调味节目DCOCLK频率。

④由5个调整位MOD0~MOD4控制切换DCODCO+1选择的两种频率。

上电后,4系列的默认是1.048576MHz,因为它有锁频环,其他没有锁频环的430DCO800k左右,DCO的频率偏差挺大的,那只是一个估值。

进入调试后,可以手工改变

20110722212044004.jpg

我们假定DCO800KSMCLK不分频,也是800K。周期为1.25us

根据:CCR0 = 50000;的设定,

即每62.5ms中断一次。

 

 

4、再回过来看一看MSP430的工作模式吧

20110722212045005.jpg

 

文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /2 下一条