Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Перерывания от USART
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Tcom
Генерится непрерывно прерывание по приёму байта, по форуму искал...

Инициализация
Код
    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
aaarrr
Цитата(Tcom @ Jul 8 2008, 15:19) *
Код
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_US0] = (unsigned int) RX_interrapt;
...
void RX_interrapt (void)

А где оформление процедуры как irq?
Tcom
Код
__irq void RX_interrapt (void)

так?
aaarrr
Это от компилятора зависит. Для Keil/RVDS так.
Tcom
У меня IAR, выковырял этот код их екземпла IAR.
Почемуто он так вот неправельно рабтает.

Когда подаю питание на девайс и запускаю отлатку,прерывания генерятся. потом останавливаю редактирую код, не связаный с переываниями, запускаю отладку, все перерывания не работают.
Как лечить?Не дёргать жеш питание каждый раз.

__irq void RX_interrapt (void) эффект равен 0
aaarrr
Цитата(Tcom @ Jul 8 2008, 15:50) *
Когда подаю питание на девайс и запускаю отлатку,прерывания генерятся. потом останавливаю редактирую код, не связаный с переываниями, запускаю отладку, все перерывания не работают.
Как лечить?Не дёргать жеш питание каждый раз.

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

Цитата(Tcom @ Jul 8 2008, 15:50) *
__irq void RX_interrapt (void) эффект равен 0

Для IAR'а, как я понимаю, слово то же самое. Эффект не может быть равен 0, так как один из вариантов неправильный. После вектора у Вас процессор куда попадает? Сразу читает AIC, или есть еще один обработчик?
Tcom
Цитата(aaarrr @ Jul 8 2008, 15:04) *
Так у Вас одна проблема или много?


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

Цитата(aaarrr @ Jul 8 2008, 15:04) *
Эффект не может быть равен 0, так как один из вариантов неправильный. После вектора у Вас процессор куда попадает? Сразу читает AIC, или есть еще один обработчик?


Вектор один, перывание попадает на обработчик. Это я проверял пошаговым выполнением.
aaarrr
Цитата(Tcom @ Jul 8 2008, 16:14) *
Вектор один, перывание попадает на обработчик. Это я проверял пошаговым выполнением.

То есть по адресу вектора (0x18) стоит команда ldr pc, [pc, #-0xf20]? Тогда модификатор __irq для обработчиков нужен обязательно.
Tcom
Цитата(aaarrr @ Jul 8 2008, 15:17) *
То есть по адресу вектора (0x18) стоит команда ldr pc, [pc, #-0xf20]? Тогда модификатор __irq для обработчиков нужен обязательно.

поставил, ничего не изменилось smile3046.gif
aaarrr
Цитата(Tcom @ Jul 8 2008, 16:30) *
поставил, ничего не изменилось smile3046.gif

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

Что касается работы под отладчиком, то убедитесь, что он не считывает во время остановки регистры периферии - эффекты от этого могут быть самые разные.
Andryha
Хм.. странно, никогда не использовал модификатор __irq и все работал.. а зачем он нужен? объясните плиз..
meister
Цитата(Andryha @ Jul 18 2008, 11:12) *
Хм.. странно, никогда не использовал модификатор __irq и все работал..


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

Цитата(Andryha @ Jul 18 2008, 11:12) *
а зачем он нужен? объясните плиз..


Чтобы компилятор правильно генерировал пролог и эпилог функции, а так же генерировал код в режиме ARM.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.