MSP430Timer_A example(原创)
0赞
前面我们对定时器A计数模块有了一定的认识,下面让我们通过三个例子来对其的使用了解一下。
为了让大家对定时器A的中断有一个比较贴切的认识,我们首先给出一个小的例子一,定时器A自动溢出。
#include<msp430x24x.h>
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P1DIR|= 0x01;
TACTL = TASSEL_1 + MC_2+ TAIE;
_BIS_SR(LPM3_bits+GIE);
}
//Timer_A3 中断向量(TAIV)处理程序
#pragma vector = TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
Switch(TAIV)
{
case 2:break; //CCR1比较/捕获寄存器的中断入口,本例未使用
case 4:break; //CCR2比较/捕获寄存器的中断入口,本例未使用
case 10: P1OUT^=0x01;break; //定时器A在溢出中断向量入口,本例使用
}
}
本例使用的是定时器A的溢出中断来实现的功能。
第二个例子我们使用定时器A的增计数模式,选择外接信号源的ACLK信号作为计数器的信号源,信号源为32KHZ的手表晶振,通过定时器A模块中的CCR0捕获/比较寄存器的值与定时器A的值进行比较。如果比较相等就产生CCR0中断,进入TimerA中断服务程序进行中断处理。产生计数中断时候通过P1.0的取反表现出来。
/*************************************************************************
说明:用32kHZ钟表晶振和定时器中断实现精度秒的LED闪烁
************************************************************************/
#include<msp430x24x.h>
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD; //关闭看门狗
TACTL=TASSEL0+TACLR; //ACLK,清TAR
CCTL0=CCIE; //CCR0中断允许
CCR0 = 16384; //设定中断间隔,kHZ晶振,0.5s
P1DIR |= 0x01; //P1.0为输出
TACTL = MC0; //Timer_A为增计数模式
_EINT(); //中断允许
for(;;)
{
_BIS_SR(CPUOFF);
_NOP();
}
}
#pragmavector= TIMERA0_VECTOR //Timer_A中断函数
__interrupt void Timer_A(void)
{
P1OUT ^= BIT0;
}
例子三通过定时器A输出周期一定占空比不同的两个PWM矩形波,使用到了计数模块,捕获/比较模块,以及输出模块。
/*************************************************************************
*名称:pwm
*功能:利用Timer_A输出周期为512/32768=15.625ms、占空比分别为75%和25%的PWM矩形波
*入口参数:无
*出口参数:无
*说明:处于仿真的需要使用P1.0口属于Timer_A的系统时钟,使用的msp249可以选择多组
pwm输出 在此 使用P1.2和P1.3
************************************************************************/
#include<msp430x24x.h>
void main(void)
{
WDTCTL=WDTPW+WDTHOLD;
TACTL=TACLR;
CCR0 = 512-1;
CCTL1=OUTMOD_7;
CCR1=384;
CCTL2=OUTMOD_7;
CCR2=128;
P1DIR|= 0x04;
P1SEL|= 0x04;
P1DIR|= 0x08;
P1SEL|= 0x08;
TACTL |= MC0;
for(;;)
{
_BIS_SR(LPM3_bits);
_NOP();
}
}
由仿真图可以对运行结果有直观的查看,P1.2输出了占空比为75%的PWM矩形波,P1.3输出了占空比为25%的矩形波。