第二个例子功能是:实现流水灯以三种流动方式和四种流动速度,的不同组合而进行点亮"流动",对于流动方式我兴趣不大,只是算法而已。看一看速度的变化,这个例子是用改变时钟频率的方法来实现速度的变化。
这是在中断程序中改的。
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_0,ID_1,ID_2,ID_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分频?那么速度就应该是这样一种关系,下面来看一看能不能观察这个速度。
IAR没有如同keil一样能观察时间,搜索一下,找到查看方法。
进入Debug后,选菜单View/Register,出现Register窗口,里面有个Cycles,它就是CPU运行的周期数,除以CPU频率,就是运行时间了。 如果CPU频率是1M的话,那个数正好是CPU运行的us数。
但是进入调试后,没有能够进入中断。所以没有能够查看到。
没有其他办法,只有详细研究MSP430的时钟模块了。
实验板上的晶振电路
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\14X)
那么对于本板来说,由于主芯片是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中断一次。
文章评论(0条评论)
登录后参与讨论