Ti msp430 источник прерывания
-
26-09-2019 - |
Вопрос
Я знаю, что при работе с CCSV4 MSP430F2619 и Ti я могу получить более одного прерывания, чтобы использовать тот же обработчик прерываний с кодом, который выглядит что-то подобное:
#pragma vector=TIMERA1_VECTOR
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void){
ServiceWatchdogTimer();
}
Мой вопрос в том, когда я нахожусь в этом прерывании, есть ли способ выяснить, какой из этих прерываний получил меня здесь?
Решение
Общий ответ на ваш вопрос отсутствует Нет прямого метода для обнаружения, какое прерывание в настоящее время называется. Однако каждое прерывание имеет свой собственный флаг прерывания, чтобы вы могли проверить каждый флаг в прерывании. Вы должны и флаг с включенным, чтобы убедиться, что вы обрабатываете прерывание, которое фактически называлось. Также с таймами на 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 отдельные обработчики прерываний призывают ту же функцию?
что-то вроде
__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();
}
Глядя на то MSP430x1xx Руководство пользователя семьи, Похоже, что устройство не поддерживает реестр состояния прерывания с этой информацией напрямую. Вам либо нужно будет иметь 2 отдельных прерывания векторов, чтобы вы могли определить разницу напрямую, или вам нужно будет запрашивать оба устройства, чтобы увидеть, что требует обслуживания.
Если вы используете 2 вектора прерываний, они могут, безусловно, вызовут или прыгают (если вы используете сборку) к той же процедуре для выполнения массы работы, как в Ответ, данный Arrz.
Обратите внимание, что у чипов уже есть таблица вектора прерывания, поэтому делать то, о чем вы говорите в комментарии, который вы сделали в другом ответе, вам просто нужно указать векторные записи прерывания для «неиспользованных» прерываний к процедуру, которая бросает ошибка.