Здравствуйте.
Хочу в процессе выполнения программы запустить бутлоадер и перепрошить программу.
Для этого в нужном мне месте программы вызываю команду загрузчика "Reinvoke ISP", старался делать все по юзер мануалу, но видимо, что-то недоделал.
Вот код:
Код
#define IAP_LOCATION 0x7ffffff1
unsigned long command[5]={0};
unsigned long result[3]={0};
typedef void (*IAP)(unsigned int[],unsigned int[]);
IAP iap_entry = (IAP)IAP_LOCATION;
#define ISP_OPTION_2
void PrepareProgCPU()
{
VICINTENCLEAR = 0xFFFFFFFF; // Disable all interrupts
#ifdef ISP_OPTION_2
//по документации - в этом случае надо выключать плл и выбрать внутренний IRC
MAMCR = 0; //читал, что в ранних ревизиях нужно отключать MAM, у меня ревизия B
PLLCON = 0x00;
PLLFEED = 0xAA;
PLLFEED = 0x55;
CLKSRCSEL=0;
#endif //иначе исполняем с опцией "1" - pll не выключаем
command[0] = 57;
iap_entry(command,result);
}
В результате получаем следующую картину.
Вызываем в программе указанную функцию. Открываем терминал. Настраиваем (пока пользуюсь скоростью 9600).
Шлем в терминал символ "?".
Получаем ответ "Synhronized". Получается, что боотлоадер запустился и отвечает на команды.
Закрываем терминал, открываем флешмеджик. Настраиваем на те же параметры, делаем старт.
Происходит стирание флеша (в статусной строке проскакивают сообщения "Erasing block").
Далее в статусной строке пишется "Programming..."
После чего выводится сообщение "Anable to communicate (transmit/receive)". Программирование прекращается, если запустить терминал, на команды больше не отвечаем.
Далее отключаю питание. Включаю. Процессор не исполняет рабочую программу, находится в редиме загрузчика. Проверяю - запускаю флешмеджик, делаю "старт" - программируется "на ура", причем с любой скоростью.
Компилирую программу с "#define ISP_OPTION_1". Это допустимо, как утверждается в документации, при этом должна установиться PCLK = CCLK/4.
У меня используется частота 72 мегагерца, если поделить на 4, получается 18, для скорости 9600 это допустимое значение.
Тестируем, получаем абсолютно идентичный результат.
Получается, что я перед вызовом "Reinvoke ISP" что-то не вернул в исходное состояние. Вопрос, что?
ЗЫ. Компилятор - IAR 5.4.