TIMER0不执行多个比较匹配寄存器中断请求。(MSP430)

问题描述 投票:1回答:1

[好,所以我一直试图使用MSP430FR5994 TI启动板创建一些代码,该启动板利用Timer0和3个独立的比较寄存器来触发3个独立的isr。我已经成功地使一个工作,但是,一旦我添加了另一个比较寄存器,CCIFE标志集就会出现,并且从不竞争第二个isr的执行。我已经在CCstudio和IAR上的调试器中观看了代码,两者都发生了相同的事情,设置寄存器正确且TA0R寄存器正在计数,并将基于TA0CCR0触发第一个isr,但所有其他比较寄存器R1 2 3等将不会触发并成功执行。代码在下面,关于我在做什么错的想法将不胜感激。

#include "msp430.h"
#include <stdbool.h>
#define COUNT_1 12000 
#define COUNT_2 800


int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;

  PM5CTL0 &= ~LOCKLPM5;

  P1DIR |= BIT0 + BIT1;
  P1OUT = BIT0 + BIT1; 


   //set up and enable timer A or TA0 for continous mode 

  TA0CCR0 = COUNT_1;
  TA1CCR1 = COUNT_2;  
  TA0CTL = TASSEL__ACLK + MC_2;  //set the max period for 16bit timer operation
  TA1CTL = TASSEL__ACLK + MC_2;
  TA0CCTL0 = CCIE;  //enable compare reg 0
  TA1CCTL1 = CCIE;  //enable compare reg 1
  //TA0CTL |= TAIE;

  _BIS_SR( GIE); //ENABLE GLOBAL INTERRRUPTS

  //set the max period for 16bit timer operation


  while(true){}


  }

#pragma vector= TIMER0_A0_VECTOR    //compare interrupt 0 flahse red led
__interrupt void TIMER0_A0(void) {
  P1OUT ^= BIT1 ;

}

#pragma vector = TIMER1_A1_VECTOR   //compare interrupt 1 flashes green led
__interrupt void TIMER1_A1(void) {

 P1OUT ^= BIT0;

}
c timer msp430
1个回答
0
投票

用户指南在第25.2.6.1节中说:

当TAxCCR0中断时,TAxCCR0 CCIFG标志会自动重置请求已处理。

但是,其他CCRx中断不会发生这种情况,因为多个中断使用相同的中断向量。第25.2.5.2节说:

具有最高优先级的中断会在TAxIV寄存器中生成一个数字(请参见寄存器描述)。 […]对TAxIV寄存器的任何访问,读取或写入都将自动重置最高挂起的中断标志。

因此,您始终必须读取TAxIV寄存器(对于三个或更多CCR,您需要使用它来找出哪个CCR触发了中断):

__interrupt void TIMER1_A1(void) {
    switch (TA1IV) {
    case TAIV__TACCR1:
        P1OUT ^= BIT0;
        break;
    case TAIV__TACCR2:
        ...
        break;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.