微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > MSP430 工作笔记一(转)

MSP430 工作笔记一(转)

时间:11-13 来源:互联网 点击:

注意与Timer0_A的不同

{

P1SEL|=BIT2;//选择P12作为捕捉的输入端子Timer0_A

//TACCTL1|=CM_3+SCS+CAP+CCIE;//上下沿都触发捕捉,用于测脉宽,同步模式、时能中断CCI1A

TACCTL1|=CM_1+SCS+CAP+CCIE;//上升沿触发捕捉,同步模式、时能中断CCI1A

TACTL|=TASSEL1+MC_2;//选择SMCLK时钟作为计数时钟源,不分频增计数模式不行,必须连续计数模式

P2SEL|=BIT1;//选择P21作为捕捉的输入端子Timer1_A

//TA1CCTL1|=CM_3+SCS+CAP+CCIE;//上下沿都触发捕捉,用于测脉宽,同步模式、时能中断CCI1A

TA1CCTL1|=CM_1+SCS+CAP+CCIE;//上升沿触发捕捉,同步模式、时能中断CCI1A

TA1CTL|=TASSEL1+MC_2;//选择SMCLK时钟作为计数时钟源,不分频增计数模式不行,必须连续计数模式

}

相对应的中断函数如下:

#pragmavector=TIMER0_A1_VECTOR//Timer0_ACC1的中断向量

__interruptvoidTimer_A(void)

{

//CCI0A使用的捕捉比较寄存器是TA0CCR0,TA0CCR0单独分配给一个

//中断向量TIMER1_A0_VECTOR,所以进入中断后直接就是Timer0_ACC0产生的中断,不用经过类似

//下面的方法判断中断源了。

//Timer0_ACC1-4,TA0公用一个中断向量TIMER0_A1_VECTOR,所以进入了中断后还要用下面

//的方法进行判断是哪一个中断源产生的中断

switch(TAIV)//如果是Timer0_ACC1产生的中断

{

case2:

{

flag=1;

LPM1_EXIT;//退出低功耗模式

//_BIC_SR_IRQ(LPM1_bits);

//_bic_SR_register_on_exit(LPM1_bits);

break;

}

case4:break;

case10:break;

}

}

#pragmavector=TIMER1_A1_VECTOR//Timer1_ACC1的中断向量

__interruptvoidTimer_A1(void)

{

//P1OUT|=BIT0;//led调试用的

//LPM1_EXIT;//退出低功耗模式因为使用的是CCI0A使用的捕捉比较寄存器是TA1CCR0,TA1CCR0单独分配给一个

//中断向量TIMER1_A0_VECTOR,所以进入中断后直接就是Timer1_ACC0产生的中断,不用经过类似

//下面注释掉的方法判断。

//而Timer1_ACC1-4,TA1则公用一个中断向量TIMER1_A1_VECTOR,所以进入了中断后还要用下面

//的方法进行判断是哪一个中断源产生的中断

switch(TA1IV)//如果是Timer1_ACC1产生的中断

{

case2:

{

flag=2;

LPM1_EXIT;//退出低功耗模式

//_BIC_SR_IRQ(LPM1_bits);

//_bic_SR_register_on_exit(LPM1_bits);

break;

}

case4:break;

case10:break;

}

}

//如果要测量更低频率的信号的话,可以在中断中判断溢出中断发生的次数,这样就可以得到溢出的次数,从而可以测量更

//低频率的信号

5,Timer_A的计数模式

计数模式有:增计数模式,连续计数模式和增减计数模式。具体的各个模式的详解,参见用户指南。

6,定时器的定时中断

在使用定时器的定时中断时,要注意定时器计数模式的选择。在使用中断时,要注意中断向量的使用和中断源的判断,下面就举一个例子,注释的也较详细:

#include

unsignedintt=0;

voidmain(void)

{

WDTCTL=WDTPW+WDTHOLD;//StopWDT

P1DIR|=0x01;//P1.0output

CCTL0=CCIE;//CCTLx是捕获/比较控制寄存器interruptenabledCCIE=0x0010时能定时器A中断

CCR0=50000;//捕获/比较寄存器设置计数器CCR0的初值16位寄存器,最大值为65535

//默认SMCLK使用的是DCO,默认的DCO大约为800KHz,而CCR0=50000,所以中断产生的频率大约为16Hz

TACTL=TASSEL_2+MC_2;//SMCLK,contmode连续计数模式从0计到0FFFFh

//TACTL=TASSEL_2+MC_1;//SMCLK,upmode增计数模式从0计到CCR0

_BIS_SR(LPM0_bits+GIE);//EnterLPM0w/interrupt进入低功耗模式0,允许中断

}

//TimerA0interruptserviceroutine

#pragmavector=TIMER0_A0_VECTOR

__interruptvoidTimer_A(void)//CCIFG中断被响应后,该标志位自动清零

{

//P1OUT^=0x01;//ToggleP1.0

t++;

if(t==5)

{

P1OUT^=BIT0;//ToggleP1.0

t=0;

}

CCR0+=50000;//AddOffsettoCCR0增加CCR0偏移

//定时器总是从0开始往上计数,一直到计满再从0开始,在连续计数模式下,当定时器的值等于CCR0时,产生中断

//在中断中对CCR0增加50000,这样的话定时器从当前值到下一时刻再次等于CCR0时的间隔为50000,恒定

//这样产生中断的时间间隔就相等了

//所以在连续计数模式下,要想使中断的时间间隔一定,就要有CCR0+=n;这句话

//在中断中CCR0不需要从新赋值,区别于51

}

中断的使用注意情况:还是把举个例子吧:

#include

voidmain(void)

{

WDTCTL=WDTPW+WDTHOLD;//StopWDT

P1DIR|=0x01;//P1.0output

TACTL=TASSEL_2+MC_2+TAIE;//SMCLK,contmode,interruptTAIE允许定时器溢出中断

_BIS_SR(LPM0_bits+GIE);//EnterLPM0w/interruptGIE允许中断

}

//Timer_A3InterruptVector(TA0IV)handler

#pragmavector=TIMER0_A1_VECTOR

__interruptv

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

网站地图

Top