本文介绍的是MSP430内部的定时器1
测试代码如下:
#include "io430.h"
#include "in430.h"
//demo,led闪烁
void Init_TimeA(void);
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
Init_TimeA();
P2DIR = 0XFF;
P2OUT = 0XFF;
return 0;
}
void Init_TimeA(void)
{
TACTL = TASSEL_1 + ID_3 + MC_1;//定时器的时钟源选择ACLK,增计数模式 32.768k
CCTL0 = CCIE;//使能CCR0中断
CCR0 = 4096;//设定周期为1s
_EINT();//使能总中断
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
P2OUT =~P2OUT;
}
#include "io430.h"
#include "in430.h"
void Init_TimeA(void);
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
Init_TimeA();
P2DIR =0XFF;
P2OUT =0XFF;
return 0;
}
void Init_TimeA(void)
{
TACTL = TASSEL_2 + ID_3 + MC_1;//定时器的时钟源选择ACLK,增计数模式 800khz
CCTL0 = CCIE;//使能CCR0中断
CCR0 = 50000;//设定周期为0.5s
_EINT();//使能总中断
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
P2OUT =~P2OUT;
}
如果要精准定时则要使用外部晶振进行定时计数:
#include<msp430f149.h>
#include "clock.h"
/****************************************************************************
初始化时钟
******************************************************************************/
void Int_Clk(void)
{
uchar i;
BCSCTL1&=~XT2OFF; //开启XT2振荡器
BCSCTL2|=SELM_2+SELS; //选择MCLK时钟源为XT2CLK;选择SMCLK时钟源为XT2CLK
do
{
IFG1&=~OFIFG;
for(i=0;i<100;i++)
_NOP();
}
while((IFG1&OFIFG)!=0);
IFG1&=~OFIFG;
}
#include<msp430f149.h>
#include"DataType.h"
/****************************************************************************
初始定时器A
******************************************************************************/
void Int_TimerA(void)
{
TACTL = TASSEL_2 + ID_3 + MC_1;//定时器的时钟源选择ACLK,增计数模式 8M
CCTL0 = CCIE;//使能CCR0中断
CCR0 = 50000;//设定周期为1s
_EINT();//使能总中断
}
#include "io430.h"
#include "Timer.h"
#include "clock.h"
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
Int_Clk();
Int_TimerA();
P2DIR = 0XFF;
P2OUT = 0XFF;
return 0;
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
P2OUT = ~P2OUT;
}