C MSP430定时器1中断

C MSP430定时器1中断,c,timer,msp430,C,Timer,Msp430,快速提问。如何使用此特定中断设置10秒1分钟的中断?我试过使用下面的计数器,但不起作用。当这个程序运行时,它会中断1秒。我通常会在这样的时候去找教授,但是,他在日本 #include <msp430.h> #define RedLED BIT0 #define GreenLED BIT6 #define RedLEDToggle (P1OUT ^= RedLED) #define GreenLEDToggle (P1OUT ^= GreenLED) unsigned int

快速提问。如何使用此特定中断设置10秒1分钟的中断?我试过使用下面的计数器,但不起作用。当这个程序运行时,它会中断1秒。我通常会在这样的时候去找教授,但是,他在日本

#include <msp430.h>

#define RedLED BIT0
#define GreenLED BIT6

#define RedLEDToggle (P1OUT ^= RedLED)
#define GreenLEDToggle (P1OUT ^= GreenLED)



unsigned int i = 0;

void main(void)
{

WDTCTL = WDTPW|WDTHOLD;


 P1DIR = RedLED|GreenLED;
 P1OUT = RedLED|GreenLED;

 TACTL = TASSEL_2|ID_3|MC_3|TAIE;

 TACCR0 = 62500;



 _enable_interrupts();

 LPM1;
}

#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer_A(void){

if (int i == 10)
{
    switch(TAIV)
         {
          case 0x02: break;
          case 0x04: break;
          case 0x0A: RedLEDToggle|GreenLEDToggle;;
          break;
         }
}
else
{
i++;
}
}
#包括
#定义红色位0
#定义绿色位6
#定义红色切换(P1OUT^=RedLED)
#定义绿色切换(P1OUT^=GreenLED)
无符号整数i=0;
真空总管(真空)
{
WDTCTL=WDTPW | WDTHOLD;
P1DIR=红色|绿色;
P1OUT=红色LED |绿色LED;
TACTL=TASSEL|U 2 | ID|U 3 | MC|U 3 | TAIE;
TACCR0=62500;
_启用_中断();
LPM1;
}
#pragma向量=TIMER0\u A1\u向量
__中断无效计时器(无效){
如果(int i==10)
{
开关(TAIV)
{
案例0x02:中断;
案例0x04:中断;
案例0x0A:红色切换|绿色切换;;
打破
}
}
其他的
{
i++;
}
}

要实现10秒的中断间隔,需要对计时器应用输入除法器。如果没有外围设备支持,不可能达到1分钟(但可以通过软件计数器实现)

问题是msp430微控制器有16位寄存器,不能保存大于65535的数值。使用运行频率为32768 Hz的低频振荡器(通常情况下,您不会提供系统硬件时钟源的任何详细信息,如果它们具有不同的频率,请注意),除非应用了输入分频器,否则寄存器每2秒溢出一次。MSP430x2xxx系列MCU上输入除法器的最大值为8,因此未来不可能将硬件计时器设置为超过8*2=16秒。有关更多详细信息,请参阅

此代码在10秒钟内调用中断一次:

#include <msp430.h>

#define RedLED BIT0
#define GreenLED BIT6

#define RedLEDToggle (P1OUT ^= RedLED)
#define GreenLEDToggle (P1OUT ^= GreenLED)

// 10 seconds, assuming 32768 Hz ACLK source and divider 8
#define TIMER_PERIOD (10u * (32768 / 8))

void main(void)
{
    WDTCTL = WDTPW | WDTHOLD;

    P1DIR = RedLED | GreenLED;
    P1OUT = RedLED | GreenLED;

    // reset timer A config (not strictly needed)
    TACTL = TACLR;

    // ACLK as clock source, divider 8, continuous mode, interrupt enabled
    TACTL = TASSEL_1 | ID_3 | MC_2 | TAIE;

    // set the period
    TACCR1 = TIMER_PERIOD;

    // enable capture/compare interrupts for CCR1
    TACCTL1 = CCIE;

    _enable_interrupts();

    LPM1;
}

#pragma vector=TIMER0_A1_VECTOR

__interrupt void Timer_A(void)
{
    switch (TAIV) {
    case TA0IV_TACCR1:
        // CCR1 interrupt
        RedLEDToggle;
        GreenLEDToggle;
        // set the time of the next interrupt
        TACCR1 += TIMER_PERIOD;
        break;
    }
}
#包括
#定义红色位0
#定义绿色位6
#定义红色切换(P1OUT^=RedLED)
#定义绿色切换(P1OUT^=GreenLED)
//10秒,假设32768 Hz ACLK源和除法器8
#定义定时器周期(10u*(32768/8))
真空总管(真空)
{
WDTCTL=WDTPW | WDTHOLD;
P1DIR=红色|绿色;
P1OUT=红色LED |绿色LED;
//重置计时器A配置(不严格需要)
TACTL=TACLR;
//ACLK作为时钟源,除法器8,连续模式,中断启用
TACTL=TASSEL|U 1 | ID|U 3 | MC|U 2 | TAIE;
//设定期限
TACCR1=定时器周期;
//为CCR1启用捕获/比较中断
TACCTL1=CCIE;
_启用_中断();
LPM1;
}
#pragma向量=TIMER0\u A1\u向量
__中断无效计时器(无效)
{
开关(TAIV){
案例TA0IV_TACCR1:
//CCR1中断
红色钮扣;
绿色钮扣;
//设置下一个中断的时间
TACCR1+=定时器周期;
打破
}
}

您在初始寄存器中使用#define常量,但没有告诉我们这些#define常量是什么,因此我对确切问题的帮助有限。是不是只打断了一次,再也不会打断?它每1秒是连续的吗?您是否希望在某个公共时基中断1次,然后计数到您的较高时间?可能很难,但TI是否有专门的论坛来询问(编程)有关其微控制器的问题?我认为这里没有多少专门的嵌入式程序员掌握MSP430控制器的确切知识。我也会回答这个问题,因为另一个问题已经搁置。您可能想删除其中一个(或两个)并用一个问题重新开始。@DaanTimmer在msp430标签上有200多个追随者,其中肯定有相当多的活跃用户。