Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AM1707. Не удается настроить ни FIQ, ни IRQ
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
kovigor
Добрый день !
Вот проект (IAR):

http://zalil.ru/30575306

Бьюсь четвертый день с DevKit'ом от Spectrum Digital. Ничего не выходит. Идея такая: при возникновении фронта или спада на линии GPIO, Bank0, Pin11 должно генерироваться прерывание FIQ. Однако обработчик прерывания управления не получает, а вместо этого программа виснет при возникновении прерывания. Сил и идей у меня больше нет. Примеров с прерываниями для этого МК нет тоже, причем нигде. Посмотрите, пожалуйста, где я накосячил, или поделитесь рабочим примером (сразу скажу, что Linux меня не интересует).

Краткие пояснения:

Прерывания настраиваются в файле "evmam170x_dip.c" в функции "DIP_init".
Обработчик прерывания находится в файле "main.c".
Начальная инициализация, как всегда, описана в файле "am17xx_cstartup.s"

Заранее спасибо ...
aaarrr
"Верхние" вектора в CP15 включить не забыли часом?
kovigor
Цитата(aaarrr @ Feb 27 2011, 01:56) *
"Верхние" вектора в CP15 включить не забыли часом?


А что это за вектора такие ? AT91SAM9XE512 - это тоже ARM926EJ-S, но там ничего подобного нет. Сейчас буду выяснять. Спасибо ...

P.S.
Да, забыл сказать. MMU и MPU выключены и не используются, проект простейший, учебный ...

P.P.S
Я, кажется, понял, о чем вы. вы имеете в виду то, что таблицу векторов нужно отобразить по адресу 0xFFFF0000, а для этого нужно установить бит №13 в "Control Register c1". Что я и сделал только что, добавив строчку в startup - файле "am17xx_cstartup.s":

Код
// Disable Addr translation, D cache and enable I cache
//"0xFFFFEFFA": Bit12: I-cache En/Dis, Bit2: D-cache En/Dis,  Bit0: MMU En/Dis
        MRC         p15,0,R1,C1,C0,0;Read Control Register (C1)
        LDR         R0,=CP_DIS_MASK;0xFFFFEFFA
        AND         R1,R1,R0;I-cache, D-cache and MMU Disabling
        ORR         R1,R1,#(1<<12);Bit12 <- 1: I-cache Enabling
        ORR         R1,R1,#(1<<13);Bit13 <- 1: VINTH (or VINITHI) <- 1
            ;(High exception vectors selected, address
            ;range = 0xFFFF 0000 to 0xFFFF 001C.)
        MCR         p15,0,R1,C1,C0,0;Write Control Register (C1)


Но пока это не помогло. Разбираюсь дальше ...

P.P.P.S
За-ра-бо-та-ло !!! Надо же еще было эту самую таблицу векторов скопировать по адресу 0xFFFF0000:

Код
/** private data **/
#pragma segment=".intvec"

/** private functions **/
void Copy_Vectors(void)
{
unsigned int i;
unsigned char * Src = __section_begin(".intvec");

for (i = 0; i < 64; i++){
*((unsigned char *)(0xffff0000 + i)) = * Src++;
                               }
}


Так что большое спасибо за помощь ...
aaarrr
Цитата(kovigor @ Feb 27 2011, 14:29) *
За-ра-бо-та-ло !!! Надо же еще было эту самую таблицу векторов скопировать по адресу 0xFFFF0000

Только лучше все же это сделать средствами линкера, а не вручную.
kovigor
Цитата(aaarrr @ Feb 28 2011, 00:18) *
Только лучше все же это сделать средствами линкера, а не вручную.


Ничего, вручную тоже пойдет. Так даже яснее получается. Кстати, тот бит в "Control register", похоже, по умолчанию уже установлен в "1", поскольку все работает и без принудительной его установки (достаточно просто скопировать таблицу векторов прерываний в память по адресу 0xFFFF0000) ...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.