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

 
 
 
Reply to this topicStart new topic
> SAM7S64, работа после аппаратного сброса
Karl
сообщение Mar 28 2007, 10:48
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 4-02-05
Пользователь №: 2 429



Контроллер SAM7S64. После подачи питания работает нормально. После аппаратного сброса исчезают прерывания. При этом все, что с прерываниями не связано, работает в штатном режиме. При отладке через МТ-линк прерывания тоже не работали. Но я думал, что это связано с работой в режиме отладки... Что посоветуете?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 28 2007, 12:40
Сообщение #2


Гуру
******

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



Цитата(Karl @ Mar 28 2007, 09:48) *
Что посоветуете?
Вставить после инициализации контроллера прерываний
Код
    AT91C_BASE_AIC->AIC_EOICR = 0;                    // Reset AIC logic


--------------------
На любой вопрос даю любой ответ
"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
Karl
сообщение Mar 28 2007, 14:03
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 4-02-05
Пользователь №: 2 429



Цитата(Сергей Борщ @ 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 надо как-то конфигурировать?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 28 2007, 15:53
Сообщение #4


Гуру
******

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



Цитата(Karl @ Mar 28 2007, 13:03) *
А сам вывод RESET надо как-то конфигурировать?
Вообще-то да.


--------------------
На любой вопрос даю любой ответ
"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
Karl
сообщение Mar 29 2007, 07:18
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 4-02-05
Пользователь №: 2 429



С выводом RESET разобрался - он был сконфигурирован правильно. Но после ресета контроллер работает по-прежнему некорректно. Что еше может быть? И еще про JTAG: если стереть флэшь контроллера, то после этого Jtag работает с прерываниями нормально. Если же начать отладку поверх записанной программы - прерывания при отладке не работают.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 29 2007, 13:38
Сообщение #6


Гуру
******

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



Цитата(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");
}


--------------------
На любой вопрос даю любой ответ
"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
Karl
сообщение Mar 30 2007, 07:02
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 4-02-05
Пользователь №: 2 429



посмотрел - в mac файле у меня нет фенкции execUserReset(). Просто скопировать эти функции в мак - файл или еще что-то добавить надо будет?

Буду признателен, если выложите свой mac файл полностью, для примера.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 30 2007, 13:23
Сообщение #8


Гуру
******

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



Цитата(Karl @ Mar 30 2007, 06:02) *
Буду признателен, если выложите свой mac файл полностью, для примера.
Пожалуйста. Надеюсь, у вас ИАР wink.gif
Прикрепленные файлы
Прикрепленный файл  AT91_mac.zip ( 3.22 килобайт ) Кол-во скачиваний: 45
 


--------------------
На любой вопрос даю любой ответ
"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
misyachniy
сообщение Mar 30 2007, 17:35
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 716
Регистрация: 27-05-05
Из: Kyiv
Пользователь №: 5 454



Код
AT91C_BASE_AIC->AIC_EOICR = 0;

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

А так мы избавились от проблем:
Код
for (j=0; j<8; j++) AT91C_BASE_AIC->AIC_EOICR = 0;
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Apr 2 2007, 09:19
Сообщение #10


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



misyachniy
Чего это такое?


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
misyachniy
сообщение Apr 2 2007, 13:56
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 716
Регистрация: 27-05-05
Из: Kyiv
Пользователь №: 5 454



Код
AT91C_BASE_AIC->AIC_EOICR = 0;

Это уведомление контроллера прерывания о том, что прерывание отработано, можно разрешать/вызывать следующий обработчик прерывания.
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Apr 3 2007, 09:04
Сообщение #12


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



Да не я вот про это:
Код
for (j=0; j<8; j++) AT91C_BASE_AIC->AIC_EOICR = 0;


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
Karl
сообщение Apr 4 2007, 07:32
Сообщение #13


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 4-02-05
Пользователь №: 2 429



Цитата(Сергей Борщ @ Mar 30 2007, 16:23) *
Пожалуйста. Надеюсь, у вас ИАР wink.gif


Спасибо за помощь! Все заработало smile.gif Нашелся еще и мой косяк при инициализации таймера реального времени: я не читал регистр статуса RTTC_RTSR (При чтении регистра RTT_SR сбрасываются флаги RTTINC и ALMS). Из - за этого после включения питания все на 100% работало, а после аппаратного сброса на 100% не работало.
Go to the top of the page
 
+Quote Post

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

 


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


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