Все вопросы свелись к одному единственному вопросу.
ПОСЛЕ УСПЕШНОЙ ЗАПИСИ В БАНК_0, НЕ ХОЧЕТ СТАРТОВАТЬ ОСНОВНАЯ ПРОГРАММА!!!
Вот функция старта приложения (Александр, ваша функция!)
Код
typedef void(*pFunction)(void);
void Start_application(void)
{
pFunction Jump_To_Application;
/* -------------------------------------------------------------------------- */
/* Configure bank 0 as 512KB and bank 1 as 32KB */
/* Remap bank 0 at address 0x0 and bank 1 at address 0x80000 */
/* -------------------------------------------------------------------------- */
__disable_irq();
__disable_fiq();
// FMI->BBSR = 0x1;
// FMI->NBBSR = 0x6;
// FMI->CR = 0;
FMI->BBADR = 0x80000 >> 2;
FMI->NBBADR = 0x0;
// FMI->CR = BIT(4) + BIT(3);
/* Jump to the user application and execute it */
Jump_To_Application = (pFunction) 0x00;
Jump_To_Application();
}
Я и до этого делал точно также. Не понимаю, в чем тут тонкость? Банки ремапятся, идем по нулевому адресу банка0, где и находится мое приложение. Оно там точно находится. Я с помощью SEGGERовской утилиты менял бит из конфигурационного регистра (тот, который заведует, с какого банка грузиться) на 0. Все в порядке - приложение работает как часы. А вот из бутлоадера (после его отработки) - хрен! Бутлоадер конечно грузится из банка 1. Здесь все чисто.
Александр, тут еще вопросик наверное к вам. Функция, приведенная выше, должна выполняться из RAM. Я это делаю просто. В кейле, в опциях файла, где лежит эта функция, выбираю IRAM1 [0x4000000-0x4017FFF]. Вот тут у меня сомнения. Правильно ли я делаю? В вашем пректе я такого не нашел. Где вы указываете, что функция должна выполняться из RAM?
Сообщение отредактировал rezident - Aug 14 2010, 17:25
Причина редактирования: Оформление цитаты исходника.