TIMER0 не выполняет многократные запросы прерываний регистра сравнения сравнения (MSP430) - PullRequest
1 голос
/ 19 апреля 2020

ОК, поэтому я пытался создать некоторый код, используя стартовую панель TI MSP430FR5994, которая использует Timer0 и 3 отдельных регистра сравнения для запуска 3 отдельных isr. Я успешно получил один для работы, однако, как только я добавляю другой регистр сравнения наборы флагов CCIFE и никогда не конкурирует за выполнение второго isr. Я наблюдал за кодом в отладчике как на CCstudio, так и на IAR. То же самое происходит и в обоих, настроенные регистры верны, и регистры TA0R считают и будут запускать первый isr на основе TA0CCR0, но все остальные регистры сравнения R1 2 3 et c не сработает и не выполнится успешно. Код ниже, идея о том, что я делаю неправильно, будет высоко ценится.

#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;

}

1 Ответ

0 голосов
/ 20 апреля 2020

В Руководстве пользователя сказано в разделе 25.2.6.1:

Флаг TAxCCR0 CCIFG автоматически сбрасывается при обслуживании запроса на прерывание TAxCCR0.

Однако это делает не произойдет для других прерываний 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;
    }
}
...