微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > MSP430学习笔记(二)

MSP430学习笔记(二)

时间:10-02 整理:3721RD 点击:

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

1.改变速度

这是在中断程序中改的。

  1. if(j == 40)
  2.     {   i = 0;
  3.         j = 0;
  4.         flag++;
  5.         if(flag == 4) flag = 0;
  6.         switch(speed)
  7.         {
  8.         case 0:
  9.             TACTL &=~ (ID0 + ID1);
  10.             TACTL |= ID_3;
  11.             break;
  12.         case 1:
  13.             TACTL &=~ (ID0 + ID1);
  14.             TACTL |= ID_2;
  15.             break;
  16.         case 2:
  17.             TACTL &=~ (ID0 + ID1);
  18.             TACTL |= ID_1;
  19.             break;
  20.         case 3:
  21.             TACTL &=~ (ID0 + ID1);
  22.             TACTL |= ID_0;
  23.             break;
  24.         default:
  25.             break;
  26.         }
  27.         if(flag != 3)   speed++;
  28.         if(speed == 4) speed = 0;
  29. }

复制代码


查找有关ID_0,ID_1,ID_2,ID_3的定义如下:

  1. #define ID_0   (0*0x40u)  /* Timer A input divider: 0 - /1 */
  2. #define ID_1   (1*0x40u)  /* Timer A input divider: 1 - /2 */
  3. #define ID_2   (2*0x40u)  /* Timer A input divider: 2 - /4 */
  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.时钟源


实验板上的晶振电路

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

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


MSP430的时钟系统

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

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

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


其中ACLK是由LFXT1CLK信号经1,2,4,8分频后得到的。

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

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

       验证一下:上一个程序中

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

    32768/2048=16

       然后:

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

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

验证结果正确。

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

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

即选择的SMCLK作为时钟源。

关于SMCLK的介绍如下:

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

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

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

SELS=1,SMCLK的时钟源是LFTX1CLK(MSP430F11XX)或者TX2CLK(MSP43013X X)

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


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

       divS0和divS1是选择SMCLK的分频因子的。

       00:不分频,01,2分频,10,4分频,11,8分频。

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

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

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

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

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

③控制位DCO0,DCO1和DCO2可分段调味节目DCOCLK频率。

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

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

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


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

根据:CCR0 = 50000;的设定,

即每62.5ms中断一次。


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



继续写吧~加油

不错

看看

不错

学习了呵呵

谢谢小编分享,学习了

写的非常不错!

不错,谢谢分享

共同学习、 谢谢分享。

好东西,要了。

我一直纠结DCO频率的问题,多谢了

支持小编,很好的学习帖子呐

谢谢分享啊。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top