一、实验内容
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;
}
}