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