Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: проблемы с SAM7S256
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Китаев Владимир
Здравствуйте!
Столкнулся при работе с SAM7S256 с непонятной проблемой.
Использую прерывание SYS для обработки прерываний от DBGU и RTTC. В начале все работает, происходит несколько прерываний DBGU и RTTC, а затем прерывания перестают возникать вообще, хотя галочки pending и mask все время установлены. Сама прога в этот момент вертится в бесконечном цикле в main.
Что это может быть и как это можно исправить?
Спасибо.
aaarrr
Цитата(Китаев Владимир @ Feb 3 2009, 12:06) *
Что это может быть и как это можно исправить?

Может быть, Вы сконфигурировали источник SYS на работу по фронту.
Китаев Владимир
Цитата(aaarrr @ Feb 3 2009, 12:09) *
Может быть, Вы сконфигурировали источник SYS на работу по фронту.


Нет у меня работает по уровню: AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL.
DBGU работает в режиме PDC:
Код
...
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS] = (unsigned int) IRQ_DBGU;
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_SYS] = AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | 6;

AT91F_PDC_Open(AT91C_BASE_PDC_DBGU);    
AT91C_BASE_DBGU->DBGU_RPR = (unsigned int) buff_rx;
AT91C_BASE_DBGU->DBGU_RCR = 40;
...
Сергей Борщ
Цитата(Китаев Владимир @ Feb 3 2009, 11:20) *
DBGU работает в режиме PDC:
Покажите код обработчика прерывания SYS. Очень похоже, что в какой-то из веток вы забываете прописать AIC_EIOCR.
Китаев Владимир
Цитата(Сергей Борщ @ Feb 3 2009, 12:34) *
Покажите код обработчика прерывания SYS. Очень похоже, что в какой-то из веток вы забываете прописать AIC_EIOCR.

AIC_EIOCR сбрасывается в конце обработчика один раз. Нужно писать для каждой ветки свой?
aaarrr
Цитата(Китаев Владимир @ Feb 3 2009, 12:43) *
AIC_EIOCR сбрасывается в конце обработчика один раз. Нужно писать для каждой ветки свой?

Просто код приведите, а то мы еще долго будем упражняться в телепатии.
Китаев Владимир
Я уже привожу, просто убирал все лишнее...

Код
__irq void IRQ_DBGU(void)
    {char j, k, l, h;
    short i;
    long long temp;
    unsigned int status;
    long long TMP;
    int R;

    // get Usart status register and active interrupt
    status = AT91C_BASE_DBGU->DBGU_CSR;
    if (status & AT91C_US_RXBUFF)
        {     
        ...
        ОБРАБОТКА DBGU
        ...

        memcpy(buff_rx, buff_rx_null, sizeof(buff_rx_null));
        AT91C_BASE_DBGU->DBGU_RPR = (unsigned int) buff_rx;
        AT91C_BASE_DBGU->DBGU_RCR = 40;
        //* Reset the satus bit for error
        AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RSTSTA;
        }

    if (status & AT91C_US_TIMEOUT)
        {
        AT91C_BASE_DBGU->DBGU_CR = AT91C_US_STTTO;
        }

    //status = AT91C_RTTC_RTTINC;  
    status = AT91C_BASE_RTTC->RTTC_RTSR;
       if (status != 0)
           {
            ...
            ОБРАБОТКА RTTC
            ...
            }    
    AT91C_BASE_AIC->AIC_ICCR = (1 << AT91C_ID_SYS);
    AT91C_BASE_AIC->AIC_EOICR = 0;
    }
aaarrr
Цитата(Китаев Владимир @ Feb 3 2009, 12:48) *
Я уже привожу, просто убирал все лишнее...

Ничего криминального, кроме совершенно не нужной записи AIC_ICCR я не вижу.
А Вы учитываете, что RTT снимает запрос на прерывание только через 2 такта SCLK после чтения RTTC_RTSR?
Китаев Владимир
Цитата(aaarrr @ Feb 3 2009, 13:10) *
Ничего криминального, кроме совершенно не нужной записи AIC_ICCR я не вижу.
А Вы учитываете, что RTT снимает запрос на прерывание только через 2 такта SCLK после чтения RTTC_RTSR?

Попробовал просто внести задержку (пустым циклом) после чтения RTTC_RTSR - вроде бы помогло. Спасибо. Как это вообще более правильно реализовать? У меня из за этой задержки поплыли измерения, которые сделаны по прерыванию от таймера. Этой задержкой я просто торможу таймер.
aaarrr
Цитата(Китаев Владимир @ Feb 3 2009, 13:42) *
Как это вообще более правильно реализовать?

Правильно - не пользоваться RTT, ИМХО. Есть же вполне нормальные таймеры - TC, PIT.
Китаев Владимир
Цитата(aaarrr @ Feb 3 2009, 14:12) *
Правильно - не пользоваться RTT, ИМХО. Есть же вполне нормальные таймеры - TC, PIT.

TС все заняты, а о PIT неподумал ... спасибо. a14.gif
Сергей Борщ
Цитата(Китаев Владимир @ Feb 3 2009, 15:22) *
TС все заняты, а о PIT неподумал ... спасибо. a14.gif
Вот у меня тоже PIT, и обработчик примерно такой:
Код
        volatile dword Tmp = AT91C_BASE_PITC->PITC_PIVR >> 20;
        while (Tmp)
        {
            --Tmp;
            SystemTimer_Handler();
        }
  //дальше другие обработчики на  SYS
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.