[1-3]玩转MSP430F5529之定时器中断

一、实验内容

1、控制MSP430F5529上的LED按要求进行闪烁显示

2、LED亮0.5s,灭0.5s

二、实验方法

1、使用Timer_A的溢出中断

#include <msp430.h>
int main(void)
{
	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
	P1DIR |= BIT0;//P1.0设置为输出
	TA0R = 65535-16384;//设置开始的计数值;16384/32768=0.5s  65535-16384
	//TA0CTL = TASSEL_ACLK + MC_2 + TAIE;//选择ACLK,连续计数模式,不清除TAR
	TA0CTL = TASSEL_1 + MC_2 + TAIE;//选择ACLK,连续计数模式,不清除TAR
	_EINT();//开启中断
	while(1)
	{
	    _no_operation();//调试用
	}
}
//Timer0 A1中断服务函数
#pragma vector=TIMER0_A1_VECTOR
__interrupt void TIMER0_A0_ISR(void)
{
    switch(_even_in_range(TA0IV,14))
    {
    case 0:break;//无中断
    case 2:break;//CCR1中断
    case 4:break;//CCR2中断
    case 6:break;//CCR3中断
    case 8:break;//CCR4中断
    case 10:break;//CCR5中断
    case 12:break;//CCR6中断
    //溢出中断
    case 14:
        TA0R=65535-16384;
        P1OUT ^= BIT0;
        break;
    default:break;
    }
}

2、使用TA0,CCR0

TACLK=SMCLK/1=1M,1/M=1us,16位计数器,最大值为65535,即~65ms

 500ms->50ms*10次,10ms*50次

#include <msp430.h> 
unsigned char u8_count_10ms;
int main(void)
{
	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
	P1DIR |= BIT0;//P1.0设置为输出
	TA0CCTL0=CCIE;
	TA0CCR0=10000;
	//TA0CTL = TASSEL_SMCLK + MC_1 + TACLR;//选择SMCLK,增计数模式,清除TAR
	TA0CTL = TASSEL_2+ MC_1 + TACLR;//选择SMCLK,增计数模式,清除TAR
	u8_count_10ms=0;
	_EINT();
	while(1)
	{
	    _no_operation();
	}
}
//Timer0 A0中断服务函数
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void)
{
    u8_count_10ms++;
    if(u8_count_10ms>=50)
    {
        P1OUT ^= BIT0;
        u8_count_10ms=0;
    }
}

3、使用TA0,CCR0降低时钟频率,分频:TACLK=SMCLK/2/5=10us,计数值为50000,即500ms

#include <msp430.h> 
int main(void)
{
	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
	P1DIR |= BIT0;//P1.0设置为输出
	TA0CCTL0=CCIE;
	TA0CCR0=50000;
	//TA0CTL=TASSEL_SMCLK+ID_2+MC_1+TACLR;
	TA0CTL=TASSEL_2+ID_2+MC_1+TACLR;//选择SMCLK,增计数模式,清除TAR
	TA0EX0=TAIDEX_5;
	_EINT();
	while(1)
	{
	    _no_operation();
	}
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void)
{
    P1OUT ^= BIT0;
}

4、使用TA0,CCR0换一个时钟源,不分频,TACLK=ACLK/1=1/32768s,计数值为16384,0.5s

#include <msp430.h> 
int main(void)
{
	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
	P1DIR |= BIT0;//P1.0设置为输出
	TA0CCTL0=CCIE;//使能CCR0中断
	TA0CCR0=16384;
	TA0CTL=TASSEL_1+MC_1+TACLR;//选择SMCLK,增计数模式,清除TAR
	_EINT();
	while(1)
	{
	    __no_operation();
	}
}
//Timer0 A0中断服务函数
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void)
{
    P1OUT ^= BIT0;//P1.0的输出取反
}

5、使用Timer_A的连续计数模式,并配置一个中断服务函数来处理定时器的溢出中断

#include <msp430.h> 
/**
 * 溢出中断
 */
int main(void)
{
	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
	P1DIR |= BIT0;//P1.0设置为输出
	TA0R=65535-16384;//设置开始的计数值;16384/32768=0.5s  65535-16384
	//TA0CTL=TASSEL_ACLK+MC_2+TACLR;
	TA0CTL=TASSEL_1+MC_2+TAIE;//选择ACLK,连续计数模式,不清除TAR
	_EINT();//开启中断
	while(1)
	{
	    _no_operation();//试调用
	}
}
//Timer0 A1中断服务函数
#pragma vector=TIMER0_A1_VECTOR
__interrupt void TIMER0_A0_ISR(void)
{
    switch(_even_in_range(TA0IV,14))
    {
    case 0:break;//无中断
    case 2:break;//CCR1中断
    case 4:break;//CCR2中断
    case 6:break;//CCR3中断
    case 8:break;//CCR4中断
    case 10:break;//CCR5中断
    case 12:break;//CCR6中断
    //溢出中断
    case 14:
        TA0R=65535-16384;
        P1OUT ^= BIT0;
        break;
    default:break;
    }
}

6、使用TA0,CCR1 换一个时钟源,不分频,TACLK=ACLK/1=1/32768s,计数值为16384,0.5s

#include <msp430.h> 
int main(void)
{
	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
	P1DIR |= BIT0;//P1.0设置为输出
	TA0CCTL1=CCIE;//使能CCR0中断-->CCR1,TA0CCTL0=CCIE
	TA0CCR1=16384;//设置目标计数值,TA0CCR0=16384
    TA0CTL=TASSEL_1+MC_2+TACLR;//选择SMCLK,增计数模式,清除TAR
	_EINT();//开启中断
	while(1)
	{
	    _no_operation();//试调用
	}
}
/*
 * 共用一个时钟源
 * 进入中断后,再根据中断标志来判断
 */
//Timer0 A1中断服务函数
#pragma vector=TIMER0_A1_VECTOR
__interrupt void TIMER0_A1_ISR(void)
{
    switch(__even_in_range(TA0IV,14))
    {
    case 0:break;//无中断
    case 2:P1OUT ^= BIT0;
          // TA0CTL=TASSEL_ACLK+MC_2+TACLR;
           TA0CTL=TASSEL_1+MC_2+TACLR;
           break;//CCR1中断
    case 4:break;//CCR2中断
    case 6:break;//CCR3中断
    case 8:break;//CCR4中断
    case 10:break;//CCR5中断
    case 12:break;//CCR6中断
    //溢出中断
    case 14:break;
    default:break;
    }
}

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值