реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Перерывания от USART, AT91SAM7Sxx
Tcom
сообщение Jul 8 2008, 11:19
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 360
Регистрация: 3-01-06
Из: Украина Запорожская обл.
Пользователь №: 12 792



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

Инициализация
Код
    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
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 8 2008, 11:33
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Tcom @ Jul 8 2008, 15:19) *
Код
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_US0] = (unsigned int) RX_interrapt;
...
void RX_interrapt (void)

А где оформление процедуры как irq?
Go to the top of the page
 
+Quote Post
Tcom
сообщение Jul 8 2008, 11:43
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 360
Регистрация: 3-01-06
Из: Украина Запорожская обл.
Пользователь №: 12 792



Код
__irq void RX_interrapt (void)

так?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 8 2008, 11:45
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Это от компилятора зависит. Для Keil/RVDS так.
Go to the top of the page
 
+Quote Post
Tcom
сообщение Jul 8 2008, 11:50
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 360
Регистрация: 3-01-06
Из: Украина Запорожская обл.
Пользователь №: 12 792



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

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

__irq void RX_interrapt (void) эффект равен 0
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 8 2008, 12:04
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

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

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

Для IAR'а, как я понимаю, слово то же самое. Эффект не может быть равен 0, так как один из вариантов неправильный. После вектора у Вас процессор куда попадает? Сразу читает AIC, или есть еще один обработчик?
Go to the top of the page
 
+Quote Post
Tcom
сообщение Jul 8 2008, 12:14
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 360
Регистрация: 3-01-06
Из: Украина Запорожская обл.
Пользователь №: 12 792



Цитата(aaarrr @ Jul 8 2008, 15:04) *
Так у Вас одна проблема или много?


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

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


Вектор один, перывание попадает на обработчик. Это я проверял пошаговым выполнением.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 8 2008, 12:17
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

То есть по адресу вектора (0x18) стоит команда ldr pc, [pc, #-0xf20]? Тогда модификатор __irq для обработчиков нужен обязательно.
Go to the top of the page
 
+Quote Post
Tcom
сообщение Jul 8 2008, 12:30
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 360
Регистрация: 3-01-06
Из: Украина Запорожская обл.
Пользователь №: 12 792



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

поставил, ничего не изменилось smile3046.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 8 2008, 12:37
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

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

Что касается работы под отладчиком, то убедитесь, что он не считывает во время остановки регистры периферии - эффекты от этого могут быть самые разные.
Go to the top of the page
 
+Quote Post
Andryha
сообщение Jul 18 2008, 07:12
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 6-04-07
Пользователь №: 26 805



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

Сообщение отредактировал Andryha - Jul 18 2008, 07:13
Go to the top of the page
 
+Quote Post
meister
сообщение Jul 18 2008, 08:07
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484



Цитата(Andryha @ Jul 18 2008, 11:12) *
Хм.. странно, никогда не использовал модификатор __irq и все работал..


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

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


Чтобы компилятор правильно генерировал пролог и эпилог функции, а так же генерировал код в режиме ARM.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 04:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.01465 секунд с 7
ELECTRONIX ©2004-2016