TI MSP430 Источник прерывания - PullRequest
4 голосов
/ 13 апреля 2010

Я знаю, что при работе с MSP430F2619 и CCSv4 от TI я могу получить более одного прерывания, чтобы использовать один и тот же обработчик прерываний с кодом, который выглядит примерно так:

#pragma vector=TIMERA1_VECTOR
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void){

ServiceWatchdogTimer();
}

У меня вопрос: когда я нахожусь в этом прерывании, есть ли способ выяснить, какое из этих прерываний привело меня сюда?

Ответы [ 3 ]

5 голосов
/ 14 апреля 2010

Общий ответ на ваш вопрос: нет, прямого метода для определения того, какое прерывание вызывается в данный момент, нет. Однако каждое прерывание имеет свой собственный флаг прерывания, поэтому вы можете проверить каждый флаг в прерывании. Вы должны и флаг с разрешением, чтобы убедиться, что вы обрабатываете прерывание, которое фактически было вызвано. Также с таймерами на MSP430 есть вектор TAIV, который может сказать вам, что обрабатывать в обработчике A1. Случай 0 TAIV заключается в том, что для обработчика A1 прерывания не было, поэтому в этом случае можно предположить, что это обработчик A0.

Я бы сделал что-то вроде следующего.

#pragma vector=TIMERA0_VECTOR
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A (void)
{
   switch (TAIV)         // Efficient switch-implementation
   {
     case  TAIV_NONE:          // TACCR0             TIMERA0_VECTOR
        break;
     case  TAIV_TACCR1:        // TACCR1             TIMERA1_VECTOR
        break;
     case  TAIV_TACCR2:        // TACCR2             TIMERA1_VECTOR
        break;
     case TBIV_TBIFG:          // Timer_A3 overflow  TIMERA1_VECTOR
        break;
     default;
        break;
   }
   ServiceWatchdogTimer();
}
2 голосов
/ 14 апреля 2010

Если посмотреть на Руководство пользователя семейства MSP430x1xx , похоже, что устройство не поддерживает регистр состояния прерываний с этой информацией напрямую. Либо вам нужно будет иметь 2 отдельных вектора прерываний, чтобы вы могли непосредственно идентифицировать разницу, либо вам нужно будет запросить оба устройства, чтобы узнать, какая из них нуждается в обслуживании.

Если вы используете 2 вектора прерывания, они, безусловно, могут вызывать или переходить (если вы используете сборку) к той же процедуре, чтобы выполнить основную часть работы, как в ответе , данном Earlz .

Обратите внимание, что в микросхеме уже есть таблица векторов прерываний, поэтому, чтобы сделать то, о чем вы говорите в комментарии, который вы сделали в другом ответе, вам просто нужно указать записи вектора прерываний для «неиспользуемых» прерываний на подпрограмма, которая выдает ошибку.

2 голосов
/ 14 апреля 2010

Не совсем «хороший» ответ, но почему бы не заставить 2 отдельных обработчика прерываний вызывать одну и ту же функцию?

что-то вроде

__interrupt void Timer_A0_handler (void){
  Timer_Handler(0);
}
__interrupt void Timer_A1_handler (void){
  Timer_Handler(1);
}
void Timer_Handler(int which){
  if(which==1){
    ...
  }else{
    ...
  }
  ...
  ServiceWatchdogTimer();
}
...