Перейти к содержанию
    

Перерывания от USART

Генерится непрерывно прерывание по приёму байта, по форуму искал...

 

Инициализация

    AT91C_BASE_SYS->PIOA_IDR = 0xffffffff;
   // AT91C_BASE_US0->US_IER = AT91C_US_RXRDY;
    //* Disable the interrupt on the interrupt controller
    AT91C_BASE_AIC->AIC_IDCR = 1<<AT91C_ID_US0;
    //* Save the interrupt handler routine pointer and the interrupt priority
    AT91C_BASE_AIC->AIC_SVR[AT91C_ID_US0] = (unsigned int) RX_interrapt;
    //* Store the Source Mode Register
    AT91C_BASE_AIC->AIC_SMR[AT91C_ID_US0] = AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | 2 ;
    //* Clear the interrupt on the interrupt controller
    AT91C_BASE_AIC->AIC_ICCR = 1<<AT91C_ID_US0;
    
    AT91C_BASE_AIC->AIC_IECR = 0x1 << AT91C_ID_US0;

 

Обработчик

void RX_interrapt (void)
{


    status = AT91C_BASE_US0->US_CSR;
                status = AT91C_BASE_US0->US_RHR;
    
     AT91C_BASE_US0->US_CR = AT91C_US_RSTSTA;
                 AT91C_BASE_SYS->AIC_EOICR = 0;
}

 

Срабатывание прерывания проверял брекпоинтом, если убрать брекпоинт, нажать на паузу - продолжить то программа улетает в

 __data_handler:
        ldr  pc,[pc,#+24]            ;; Data abort

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

AT91C_BASE_AIC->AIC_SVR[AT91C_ID_US0] = (unsigned int) RX_interrapt;
...
void RX_interrapt (void)

А где оформление процедуры как irq?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня IAR, выковырял этот код их екземпла IAR.

Почемуто он так вот неправельно рабтает.

 

Когда подаю питание на девайс и запускаю отлатку,прерывания генерятся. потом останавливаю редактирую код, не связаный с переываниями, запускаю отладку, все перерывания не работают.

Как лечить?Не дёргать жеш питание каждый раз.

 

__irq void RX_interrapt (void) эффект равен 0

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Когда подаю питание на девайс и запускаю отлатку,прерывания генерятся. потом останавливаю редактирую код, не связаный с переываниями, запускаю отладку, все перерывания не работают.

Как лечить?Не дёргать жеш питание каждый раз.

Так у Вас одна проблема или много? В первом посте пишите, что постоянно генерируется прерывание по приему USART, а теперь что прерывания не работают после остановки отладки.

 

__irq void RX_interrapt (void) эффект равен 0

Для IAR'а, как я понимаю, слово то же самое. Эффект не может быть равен 0, так как один из вариантов неправильный. После вектора у Вас процессор куда попадает? Сразу читает AIC, или есть еще один обработчик?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так у Вас одна проблема или много?

 

Может проблеммы 2, я просто описал состояние в которм находится железо, может это подтолкнёт к решению моей проблемы.

 

Эффект не может быть равен 0, так как один из вариантов неправильный. После вектора у Вас процессор куда попадает? Сразу читает AIC, или есть еще один обработчик?

 

Вектор один, перывание попадает на обработчик. Это я проверял пошаговым выполнением.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вектор один, перывание попадает на обработчик. Это я проверял пошаговым выполнением.

То есть по адресу вектора (0x18) стоит команда ldr pc, [pc, #-0xf20]? Тогда модификатор __irq для обработчиков нужен обязательно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

То есть по адресу вектора (0x18) стоит команда ldr pc, [pc, #-0xf20]? Тогда модификатор __irq для обработчиков нужен обязательно.

поставил, ничего не изменилось :smile3046:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

поставил, ничего не изменилось :smile3046:

А зачем поставили и что стояло? Вы в курсе организации системы прерываний у ARM7TDMI и SAM7? Так можно долго блуждать в потемках.

 

Что касается работы под отладчиком, то убедитесь, что он не считывает во время остановки регистры периферии - эффекты от этого могут быть самые разные.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хм.. странно, никогда не использовал модификатор __irq и все работал.. а зачем он нужен? объясните плиз..

Изменено пользователем Andryha

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хм.. странно, никогда не использовал модификатор __irq и все работал..

 

Вероятно, у Вас пролог и эпилог прерывания от операционки (FreeRTOS, например).

 

а зачем он нужен? объясните плиз..

 

Чтобы компилятор правильно генерировал пролог и эпилог функции, а так же генерировал код в режиме ARM.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...