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

 
 
> PIO IRQ на AT91SAM7X, затык, не могу заставить работать
Norton
сообщение Aug 6 2008, 06:44
Сообщение #1





Группа: Новичок
Сообщений: 12
Регистрация: 7-04-08
Из: Пермь
Пользователь №: 36 538



Использую AT91SAM7X - EK и yagarto
Надо повесить джойстик на прерывание.
Перерыл все примеры, сделал как там - все равно не работает.
Инициализация
Код
        
        AT91C_BASE_PIOA->PIO_PER = (0x1F <<21);
        AT91C_BASE_PIOA->PIO_ODR = (0x1F <<21);
        AT91C_BASE_PIOA->PIO_IFER = (0x1F <<21);
        AT91C_BASE_PIOA->PIO_CODR = (0x1F <<21);
        AT91C_BASE_PIOA->PIO_IER = (0x1F <<21);
        AT91C_BASE_PIOA->PIO_MDDR = (0x1F <<21);
        AT91C_BASE_PIOA->PIO_PPUER = (0x1F <<21);
        AT91C_BASE_PIOA->PIO_OWDR = (0x1F <<21);
        //LEDS
        AT91C_BASE_PIOB->PIO_PER = (0xF<<19);
        AT91C_BASE_PIOB->PIO_OER = (0xF<<19);
        AT91C_BASE_PIOB->PIO_IFDR = (0xF<<19);
        AT91C_BASE_PIOB->PIO_SODR = (0xF<<19);
        AT91C_BASE_PIOB->PIO_IDR = (0xF<<19);
        AT91C_BASE_PIOB->PIO_MDDR = (0xF<<19);
        AT91C_BASE_PIOB->PIO_PPUDR = (0xF<<19);
        AT91C_BASE_PIOB->PIO_OWDR = (0xF<<19);
        //interrupts
        AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOA;
        AT91F_AIC_ConfigureIt(AT91C_ID_PIOA, BUTT_INT_LEVEL_PRIORITY, AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE, ( void (*)( void ) ) ButtonsISR_Test );
        AT91C_BASE_AIC->AIC_IMR = 1 << AT91C_ID_PIOA;
        AT91C_BASE_AIC->AIC_IECR = 1 << AT91C_ID_PIOA;


Обработчик (в отдельном модуле, компилится по ARM)
Код
void __attribute__((interrupt("IRQ"), naked )) ButtonsISR_Test()
{
    AT91C_BASE_PIOB->PIO_CODR = (0x1<<19);
}


Подскажите, может я где-то что-то упустил? заранее спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Aug 6 2008, 08:01
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Norton @ Aug 6 2008, 09:44) *
Использую AT91SAM7X - EK и yagarto
Код
void __attribute__((interrupt("IRQ"), naked )) ButtonsISR_Test()
Совершенно непонятно, зачем вы комбинируете IRQ и naked, они ведь взаимно исключающие. IRQ указывает формировать пролог/эпилог обработчика исключения IRQ, а naked - не формировать пролога/эпилога. Покажите, что у вас находится по вектору 0x18, т.е. каким образом происходит выбор обработчика из AIC.
Не знаю как последняя версия yagarto, но весенняя имела в себе старый-старый баг GCC с прологом/эпилогом функций с атрибутом IRQ (можно поискать по форуму, klen описывал, кажется в теме "Вливаюсь в ряды АРМоводов") - там дважды вычитается 4 из LR. Не видя вашего обработчика на векторе 0x18 трудно советовать что-то еще.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



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

 


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


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