Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SAM7S64
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Karl
Контроллер SAM7S64. После подачи питания работает нормально. После аппаратного сброса исчезают прерывания. При этом все, что с прерываниями не связано, работает в штатном режиме. При отладке через МТ-линк прерывания тоже не работали. Но я думал, что это связано с работой в режиме отладки... Что посоветуете?
Сергей Борщ
Цитата(Karl @ Mar 28 2007, 09:48) *
Что посоветуете?
Вставить после инициализации контроллера прерываний
Код
    AT91C_BASE_AIC->AIC_EOICR = 0;                    // Reset AIC logic
Karl
Цитата(Сергей Борщ @ Mar 28 2007, 15:40) *
Вставить после инициализации контроллера прерываний
Код
    AT91C_BASE_AIC->AIC_EOICR = 0;                    // Reset AIC logic


Эта строчка присутствует - не помогает sad.gif Может с инициализацией контроллера прерываний что-то не то? У меня нет выделенной отдельным модулем инициализации контроллера прерываний. При инициализации периферии, требующей работы мс прерываниями, настраиваю контроллер прерываний. Например, при инициализации SPI:
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_SPI, 2,AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE, SPI_c_irq_handler);

AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_SPI);

Примерно таким же образом включены прерывания от таймера реального времени.
Что-то еще для иниуиализации требуется?


А сам вывод RESET надо как-то конфигурировать?
Сергей Борщ
Цитата(Karl @ Mar 28 2007, 13:03) *
А сам вывод RESET надо как-то конфигурировать?
Вообще-то да.
Karl
С выводом RESET разобрался - он был сконфигурирован правильно. Но после ресета контроллер работает по-прежнему некорректно. Что еше может быть? И еще про JTAG: если стереть флэшь контроллера, то после этого Jtag работает с прерываниями нормально. Если же начать отладку поверх записанной программы - прерывания при отладке не работают.
Сергей Борщ
Цитата(Karl @ Mar 29 2007, 06:18) *
С выводом RESET разобрался - он был сконфигурирован правильно. Но после ресета контроллер работает по-прежнему некорректно. Что еше может быть?
Не знаю.
Цитата(Karl @ Mar 29 2007, 06:18) *
И еще про JTAG: если стереть флэшь контроллера, то после этого Jtag работает с прерываниями нормально. Если же начать отладку поверх записанной программы - прерывания при отладке не работают.
Дело в том, что при запуске процессор начинает выполнять программу из флеш. И до того, как управление перехватит JTAG успевают выполниться какие-то команды из флеш, например настроиться какая-то периферия. Команда reset через JTAG сбрасывает только ядро. Контроллер прерываний и периферия не сбрасывается. Поэтому если вы полагаетесь на какие-то значения по умолчанию - они могут быть изменены. Если были какие-то необработанные прерывания - они "повиснут" ибо для повторной генерации прерывания от, например, PIT, необходимо прочитать его статусный регистр, что делается в обработчике в который мы не попадаем. Поэтому обычно скриптами отладчика после сброса периферия принудительно приводится в исходное состояние. В AT91 это сделать довольно легко записав в RSTC_CR бит PERRRST. Правда при этом сбрасываются и настройки PLL, а PLL могла использоваться отладчиком - тут надо осторожнее. У меня для IAR кусок скрипта примерно такой:
Код
Reset()
{
    __writeMemory32(0xA5000004, 0xFFFFFD00, "Memory");              // reset the peripherals
    if( __driverType("jlink") )
    {
        __sleep(1000000);                                           // wait
        __emulatorSpeed(32000);                                     // set JTAG speed ~ slow clock
    }
    __writeMemory32(0x00000001, 0xFFFFFC20,"Memory");               // OSC enable, no timeout

    while (! (__readMemory32(0xFFFFFC68, "Memory") & (1 << 0)) );   // wait until MOSCS

                                                                    // Assuming 18.432 MHz osc
    __writeMemory32(0x00190605, 0xFFFFFC2C,"Memory");               // *26/5 set LOCK after 6 SCLK

    __writeMemory32(0x00000004, 0xFFFFFC30,"Memory");               // PRES = 2
    while (! (__readMemory32(0xFFFFFC68, "Memory") & (1 << 3)) );   // wait untli MCKRDY

    __writeMemory32(0x00000007, 0xFFFFFC30,"Memory");               // MCK = PLLCK / 2
    while (! (__readMemory32(0xFFFFFC68, "Memory") & (1 << 3)) );   // wait untli MCKRDY

    if( __driverType("jlink") )
    {
        __emulatorSpeed(0);                                         // auto-detect new JTAG speed
        __sleep(1000000);                                           // wait
    }
    __message " MCK ready ";
}
execUserReset()
{
    Reset();

    Remap_FLASH();

    __writeMemory32(0xD3,0x98,"Register");                          // CPSR = SVC mode, ARM, IRQ, FIQ disabled
    __writeMemory32(0x00000000,0xB4,"Register");
}
Karl
посмотрел - в mac файле у меня нет фенкции execUserReset(). Просто скопировать эти функции в мак - файл или еще что-то добавить надо будет?

Буду признателен, если выложите свой mac файл полностью, для примера.
Сергей Борщ
Цитата(Karl @ Mar 30 2007, 06:02) *
Буду признателен, если выложите свой mac файл полностью, для примера.
Пожалуйста. Надеюсь, у вас ИАР wink.gif
misyachniy
Код
AT91C_BASE_AIC->AIC_EOICR = 0;

Не всегда помогает.
Стек 8-ми уровневый.

А так мы избавились от проблем:
Код
for (j=0; j<8; j++) AT91C_BASE_AIC->AIC_EOICR = 0;
SpiritDance
misyachniy
Чего это такое?
misyachniy
Код
AT91C_BASE_AIC->AIC_EOICR = 0;

Это уведомление контроллера прерывания о том, что прерывание отработано, можно разрешать/вызывать следующий обработчик прерывания.
SpiritDance
Да не я вот про это:
Код
for (j=0; j<8; j++) AT91C_BASE_AIC->AIC_EOICR = 0;
Karl
Цитата(Сергей Борщ @ Mar 30 2007, 16:23) *
Пожалуйста. Надеюсь, у вас ИАР wink.gif


Спасибо за помощь! Все заработало smile.gif Нашелся еще и мой косяк при инициализации таймера реального времени: я не читал регистр статуса RTTC_RTSR (При чтении регистра RTT_SR сбрасываются флаги RTTINC и ALMS). Из - за этого после включения питания все на 100% работало, а после аппаратного сброса на 100% не работало.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.