如何触发MSP430的中断?

如何触发MSP430的中断?,msp430,Msp430,我需要一些关于MSP430编程的帮助。这是一个课堂作业。我需要生成一个正弦波,我正试图通过使用TimerA每1/50周期改变一个输出来实现这一点。Im使用以下设置: int main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer TACCTL0 = CCIE; TACTL = TASSEL_2 + MC_1 + ID_3 + TAIE; //CLK(1MHz) /8 TACCR0 = 25; //25-100 Hz 250-

我需要一些关于MSP430编程的帮助。这是一个课堂作业。我需要生成一个正弦波,我正试图通过使用TimerA每1/50周期改变一个输出来实现这一点。Im使用以下设置:

int main(void) {
WDTCTL = WDTPW + WDTHOLD;   // Stop watchdog timer
TACCTL0 = CCIE;
TACTL = TASSEL_2 + MC_1 + ID_3 + TAIE; //CLK(1MHz) /8
TACCR0 = 25; //25-100 Hz 250-10Hz

P1DIR   = 0x00;
P2DIR   = 0xFF; //DAC Ouptut
P3DIR   = 0x00; //ADC Input
P4DIR   = 0x00; //Digital Input
P3SEL  |= BIT6 + BIT7;

ADC10CTL0  = SREF_0 + ADC10SHT_3 + MSC + ADC10ON + ADC10IE;
ADC10CTL1  = INCH_7 + ADC10DIV_3 + CONSEQ_1;
ADC10AE0  |= 0xC0; //Turn on ADC of 3.6 and 3.7
ADC10DTC1  = 2;

double amp = 0;
double freq = 0;
unsigned int ADC[2];

for(;;)
{
    wave_sel =P4IN;

    ADC10CTL0 &= ~ENC;
    while (ADC10CTL1 & BUSY);
    ADC10SA = (unsigned int)ADC;
    ADC10CTL0 |= ENC + ADC10SC;

    freq = (double)ADC[0]/1023;
    amp  = (double)ADC[1]/1023;

    TACCR0 = 25 + (freq*225);
    dout *= amp;
    dac_write(dout);
}
}
以及具有以下标题的中断:

#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A0(void)
{

但是当我运行程序时,我无法触发中断。我可以在调试器中看到计时器正在计数,一旦它按应有的方式命中TACCR0,它就会重置,但中断中什么也没有发生。我在里面放了一个断点,但它从来没有碰到过。我是否声明ISR错误?

确保启用了常规中断。要启用它们,请设置状态寄存器的
GIE

一个常见的习惯用法是在初始化代码结束时启用低功耗模式和中断。为此,请将此行放在
TACCR0=25
之后:

 _BIS_SR(LPM0_bits + GIE);

看起来您使用了两个中断:一个用于计时器A0上的捕获比较(
CCIE
),另一个用于计时器A溢出(
TAIE
)。如果您陷入了ISR_陷阱,那么这可以解释为您没有定时器溢出中断的处理程序

如果不打算使用计时器溢出,则需要更改此行:

TACTL = TASSEL_2 + MC_1 + ID_3 + TAIE; //CLK(1MHz) /8
为此:

TACTL = TASSEL_2 + MC_1 + ID_3; //CLK(1MHz) /8

如果您确实打算将第二个中断用于定时器A溢出,那么您需要确保每次输入中断时都读取
TAIV
寄存器。有多个源导致中断,寄存器告诉您是哪一个导致了中断。但是,在您阅读之前,它不会被清除(请参阅《MSP430 F2xx系列用户指南》中的第12.2.6.2节,中断向量生成器)。

您可以告诉我们您正在使用的许多不同MSP430芯片中的哪一个。查看芯片的示例代码或使用driverlib可能会有所帮助。显示整个设置代码。是的,对不起,是MSP430F2272。我会编辑主帖子,把整个设置放进去。这个建议确实有帮助,但我认为我还是做错了什么。在进入ISR一次后,SR的GIE位就会失效,然后我陷入了一个叫做“ISR_陷阱”的东西,这让我觉得我写错了什么。我课堂上的参考资料没有提到除了你想做的动作之外,还必须在ISR中做任何特殊的事情,但我是否应该在每次使用中断时重置GIE?在中断后,SR位会恢复。ISR_陷阱适用于引发但未编写处理函数的中断。我不太明白。我知道我写了一个中断,因为它在我进入陷阱之前运行一次。除了中断功能外,我还需要其他功能吗?你是不是碰巧使用了可能引发中断的任何其他模块(计时器除外)?好的,我发现了问题所在,我需要为TimerA1编写另一个中断。但现在我把它放进去了,那个中断永远不会终止。它只是:#pragma vector=TIMER0_A1_vector u中断无效计时器_A1(void){}但它像那样卡住了,我明白了。我不想要溢出中断,我只是认为我需要为计数器中断打开该位。我想这可能会解决我的问题,谢谢。