Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Real Time Timer & Periodic Interval Timer у SAM7S
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Timofey
Что то я запутался как правильно сконфигурировать прерывания у обоих. Код:
Код
int test_flag=0,test_flag2==0;
#define PIT_INTERRUPT_LEVEL 7
#define PIV_MS 60000         ////////////////////////////////////////////////
void Timer_handler(void)
{
  unsigned int status;
  //проверяем, прерывание от RTT или нет
  if (AT91C_BASE_RTTC->RTTC_RTSR & AT91C_RTTC_RTTINC) {
    
     if (test_flag==1) {
         AT91C_BASE_PIOB->PIO_SODR = (1<<22);
         test_flag=0;
         }
     else {
       AT91C_BASE_PIOB->PIO_CODR = (1<<22);
       test_flag=1;
     }
    
   }
  
  //проверчем преривание от PIT ли
  if (AT91C_BASE_PITC->PITC_PISR & AT91C_PITC_PITS) {
     status = AT91C_BASE_PITC->PITC_PIVR;//сброс прерывания
     status =status;
     if (test_flag2==0) {
         AT91C_BASE_PIOB->PIO_SODR = (1<<19);
         test_flag2==1
         }
     else {
       AT91C_BASE_PIOB->PIO_CODR = (1<<19);
       test_flag2==0;
     }
    
   }
  
  
  
  AT91C_BASE_AIC->AIC_EOICR=0x00;
  
}    /////////////////////////////////////////////
////////Конфигурирование Timer TC1///////////
/////////////////////////////////////////////
void CnfTime1 (void)
{
  AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA );//конфигурируем PIT
  AT91C_BASE_PITC->PITC_PIMR = AT91C_PITC_PITEN | AT91C_PITC_PITIEN | PIV_MS;
  //Конфигурируем RTT
  AT91C_BASE_RTTC->RTTC_RTMR=((unsigned int) 0x8000 <<  0)  |
                             ((unsigned int) 0x0 << 16)     |
                             ((unsigned int) 0x1 << 17)     |
                             ((unsigned int) 0x1 << 18)    ;
  
  
  AT91F_AIC_ConfigureIt (AT91C_BASE_AIC,
                         AT91C_ID_SYS,
                         PIT_INTERRUPT_LEVEL,
                         AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,
                         Timer_handler);
  
  AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_SYS);
  
} ////////////////////////////////////////
// Основная функция/////////////////////
////////////////////////////////////////
main (void)
{
//Запускаем колки на PIOA and PIOB
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_PIOB);


AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, AT91B_LED_MASK);
AT91F_PIO_SetOutput(AT91C_BASE_PIOB, AT91B_LED_MASK);

CnfTime1();
  //бесконечный цикл
while(1)
    {
    
    }
    
}
Вобщем когда выполняю из рам пошагово - нормально, мигают лампочки, когда жму кнопку Go то вылетает полностью. Тогда решил без дебага ... просто залил через самбу бинарик во флэш - реакция ноль. Нутром знаю что не так сконфигурировал перывание, но что не так?
beer_warrior
Это работает (PIT)

Код
//--------------------------------------------------------------------------
void InitSysTimer(void)
{
/*
//configure interrupt
AT91F_AIC_ConfigureIt    (AT91C_BASE_AIC,             //base adr
                        AT91C_ID_SYS,                //int number
                        AT91C_AIC_PRIOR_HIGHEST,    //priority
                        1,                            //int source type
                        SysTimerInterrupt            //handler
                        );            
*/                        
//---

unsigned int mask;
mask = 1 << AT91C_ID_SYS;
// Disable the interrupt on the interrupt controller
AT91C_BASE_AIC->AIC_IDCR = mask;
// Save the interrupt handler routine pointer and the interrupt priority
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS ] = (unsigned int) SysTimerInterrupt;
// Store the Source Mode Register
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_SYS ] = 1 | (AT91C_AIC_PRIOR_HIGHEST-1);
// Clear the interrupt on the interrupt controller
AT91C_BASE_AIC->AIC_ICCR = mask;

//---                    
//init 100uS timer
//AT91F_PITInit(AT91C_BASE_PITC,100,48);
AT91C_BASE_PITC->PITC_PIMR = 100? (100 * 48 + 8) >> 4 : 0;
AT91C_BASE_PITC->PITC_PIMR |= AT91C_PITC_PITEN;    

//enable interrupt
//AT91F_PITEnableInt(AT91C_BASE_PITC);
AT91C_BASE_PITC->PITC_PIMR |= AT91C_PITC_PITIEN;    
//AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_SYS);
AT91C_BASE_AIC->AIC_IECR = 0x1 << AT91C_ID_SYS;
hTimer_100us  = NULL;
hTimer_1ms  = NULL;
hTimer_1s  = NULL;
}
//--------------------------------------------------------------------------
Сергей Борщ
Цитата(Timofey @ Apr 4 2007, 11:29) *
но что не так?
Не видно кода перехода по вектору прерывания. Есть подозрение, что это кусок на ассемблере из одной команды LDR PC, AT91C_AIC_IVR. Тогда прерывание должно быть описано как __irq void Timer_handler(void)
Timofey
Спасибо за ответы. Но у меня по отдельности эти прерывания работают.Они оба "сидят" на одном ID (если я правильно понял даташит). Вот в этом у меня и получилась загвоздка. Вместе они не хотят работать. Пару раз иногда индикатор на плате мигнет (который зажигается в RTT) и все глохнет. __irq сделал - эффекта не дало. Как заставить работать оба прерывания? Или я не правильно понял даташит? По идее ведь я разрешаю прерывание и у того, и у того. Само прерывание настраиваю на AT91C_ID_SYS и в функции прерывания просто смотрю какое из них сработало. Логика правильная? Или нет?
SpiritDance
Код
if (test_flag2==0) {
         AT91C_BASE_PIOB->PIO_SODR = (1<<19);
         test_flag2==1;
         }
     else {
       AT91C_BASE_PIOB->PIO_CODR = (1<<19);
       test_flag2==0;
     }


хехе А может все-таки вот так?
Код
if (test_flag2==0) {
         AT91C_BASE_PIOB->PIO_SODR = (1<<19);
         test_flag2=1
         }
     else {
       AT91C_BASE_PIOB->PIO_CODR = (1<<19);
       test_flag2=0;
     }




Кстати а что это за PIOB в S серии?
Timofey
Цитата(SpiritDance @ Apr 9 2007, 12:25) *
хехе А может все-таки вот так?
Код
if (test_flag2==0) {
         AT91C_BASE_PIOB->PIO_SODR = (1<<19);
         test_flag2=1
         }
     else {
       AT91C_BASE_PIOB->PIO_CODR = (1<<19);
       test_flag2=0;
     }
Извиняюсь. Но это так и есть. Просто не правильно в форум скопировал. К тому же если бы я их оставил, компилятор бы меня не пустил smile.gif
Цитата(SpiritDance @ Apr 9 2007, 12:25) *
Кстати а что это за PIOB в S серии?
Это не S, это Х серия: SAM7X256
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.