单片机/MCU论坛
直播中

胡秋阳

14年用户 5430经验值
私信 关注

MSP430学习笔记(二)

第二个例子功能是:实现流水灯以三种流动方式和四种流动速度,的不同组合而进行点亮"流动",对于流动方式我兴趣不大,只是算法而已。看一看速度的变化,这个例子是用改变时钟频率的方法来实现速度的变化。
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.时钟源
20110722212043001.jpg
实验板上的晶振电路
430X13X/14X系列的里钟有高速晶体低速晶体DCO三种。(其他还有一些系列具有FLL和FLL+两种)。
各个系列的不同基础里钟模块产生相同的结果:输出3种不同频率里钟ACLK、MCLK和SMCLK(辅助时钟、主系统时钟和子系统时钟),送给各种不同需求的模块。
20110722212043002.gif
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两者之一,那么究竟是哪一个呢?
20110722212044003.jpg
进入调试,可以观察到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的频率偏差挺大的,那只是一个估值。
进入调试后,可以手工改变
20110722212044004.jpg
我们假定DCO是800K,SMCLK不分频,也是800K。周期为1.25us
根据:CCR0 = 50000;的设定,
即每62.5ms中断一次。


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


回帖(14)

北纬的尾

2011-7-27 09:27:58
继续写吧~加油
举报

kerby568640675

2012-6-1 07:40:21
不错
举报

苍星石

2012-6-18 14:49:48
看看
举报

于为

2012-7-11 08:30:49
不错
举报

oyl

2012-7-13 09:26:20
举报

朱思建

2012-12-15 10:28:27
学习了呵呵
举报

小罗

2012-12-15 10:33:50
谢谢楼主分享,学习了
举报

asdg

2012-12-26 18:56:48
写的非常不错!
举报

233161

2013-4-1 22:06:15
不错,谢谢分享
举报

宋鹏

2013-4-17 13:47:42
共同学习、 谢谢分享。。
举报

deeson

2013-4-18 16:52:07
好东西,要了。。。。。。。
举报

zz寒秋

2013-5-4 14:21:00
我一直纠结DCO频率的问题,多谢了
举报

liujinlu866

2013-6-27 22:55:03
支持楼主,很好的学习帖子呐
举报

lmc123ms

2013-8-6 18:28:18
谢谢分享啊。。。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分