MSP430F5529 上手小例程3

MSP430F5529 上手小例程3

*利用Timer_A比较模式的多路定时,让LED闪烁

查阅资料得知

MSP430有两类定时器:Timer_A(3个)&Timer_B(1个)
其中,每个定时器都配有不同的捕获比较寄存器:Timer0_A(5个)、Timer1_A(3个)、Timer2_A(3个)、Timer0_B(7个)。


F5529的芯片管脚图如下图所示:
在这里插入图片描述
可以看出,P1.1-P1.5即为Timer0_A的五个捕获比较寄存器。这里没用TA0CCR0,是因为它优先级最高,有一个专门的中断向量。

计数器存放计数值最大为0xFFFF,因此我们把它分为五段,由于采用连续模式,当计数器达到TA0CCR1的值,即13107时,中断标志CCIFG位置位,同时TAIFG中断标志置位。依次类推,直至溢出。

代码如下1

#include <msp430.h> 
#include <msp430f5529.h>

/**
 * main.c
 */
int main(void)
{
	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
	P1DIR |= (BIT1+BIT2+BIT3+BIT4+BIT5+BIT6);
	P1OUT = 0x00;
	TA0CCTL1 = CCIE;      //捕获比较寄存器开启CCIFG位中断
	TA0CCR1 = 13107;      //植入要比较的值0xffff/5=13107
	TA0CCTL2 = CCIE;
	TA0CCR2 = 26214;
    TA0CCTL3 = CCIE;
    TA0CCR3 = 39321;
    TA0CCTL4 = CCIE;
    TA0CCR4 = 52428;

    TA0CTL |= TACLR + TAIE; //开启中断并清零
    TA0CTL |= TASSEL_1 + MC_2 + TAIE;   //选择ACLK=32.768KHZ为时钟,连续模式,开中断

    __enable_interrupt();
    while(1);

	return 0;
}

#pragma vector = TIMER0_A1_VECTOR
__interrupt void Timer(void)
{
    switch(__even_in_range(TA0IV,14))   
    /*只有在TA0IV的值为0-14的偶数的时候才执行switch内的语句,
        可以提高switch语句的效率*/
    {
    case 2:
        P1OUT=BIT6;
        break;
    case 4:
        P1OUT=BIT2;
        break;
    case 6:
        P1OUT=BIT3;
        break;
    case 8:
        P1OUT=BIT4;
        break;
    case 14:    //定时器溢出
        P1OUT=BIT5;
        break;
    default:
        break;
    }
}

不能放视频就放个图片,就是五个小彩灯轮流闪烁
在这里插入图片描述


  1. 代码来自:https://download.csdn.net/download/berrynard/11426569 博主是个搬运工并实践了一下??? ↩︎

发布了22 篇原创文章 · 获赞 17 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/BerryNard/article/details/98262809