|
|
  |
SAM7S64, работа после аппаратного сброса |
|
|
|
Mar 28 2007, 12:40
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Mar 28 2007, 14:03
|
Частый гость
 
Группа: Свой
Сообщений: 179
Регистрация: 4-02-05
Пользователь №: 2 429

|
Цитата(Сергей Борщ @ Mar 28 2007, 15:40)  Вставить после инициализации контроллера прерываний Код AT91C_BASE_AIC->AIC_EOICR = 0; // Reset AIC logic Эта строчка присутствует - не помогает  Может с инициализацией контроллера прерываний что-то не то? У меня нет выделенной отдельным модулем инициализации контроллера прерываний. При инициализации периферии, требующей работы мс прерываниями, настраиваю контроллер прерываний. Например, при инициализации 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 надо как-то конфигурировать?
|
|
|
|
|
Mar 29 2007, 13:38
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Mar 30 2007, 17:35
|
Знающий
   
Группа: Свой
Сообщений: 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;
|
|
|
|
|
Apr 2 2007, 13:56
|
Знающий
   
Группа: Свой
Сообщений: 716
Регистрация: 27-05-05
Из: Kyiv
Пользователь №: 5 454

|
Код AT91C_BASE_AIC->AIC_EOICR = 0; Это уведомление контроллера прерывания о том, что прерывание отработано, можно разрешать/вызывать следующий обработчик прерывания.
|
|
|
|
|
Apr 3 2007, 09:04
|

Дух погибшего транзистора
   
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Apr 4 2007, 07:32
|
Частый гость
 
Группа: Свой
Сообщений: 179
Регистрация: 4-02-05
Пользователь №: 2 429

|
Цитата(Сергей Борщ @ Mar 30 2007, 16:23)  Пожалуйста. Надеюсь, у вас ИАР  Спасибо за помощь! Все заработало  Нашелся еще и мой косяк при инициализации таймера реального времени: я не читал регистр статуса RTTC_RTSR (При чтении регистра RTT_SR сбрасываются флаги RTTINC и ALMS). Из - за этого после включения питания все на 100% работало, а после аппаратного сброса на 100% не работало.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|