Был у меня загрузчик для LPC2378 и прочих.
Теперь стала задача переписать его под LPC1766.
Все переписалось без особых проблем, однако камнем предкновения оказалось сделать вызов прикладной программы.
Прикладная программа заливается вместе с векторами начиная с адреса 0x1 0000 (16-я страница). Т.е. в ней находятся сначала вектора, а потом все остальное.
Код вызова программы:
Код
#define FIRST_PAGE_ADDR 0x10000
#define NVIC_VectTab_FLASH (0x00000000)
// код вызова приложения
volatile unsigned long *p = (volatile unsigned long*)NVIC_VECT_TABLE;
*p = NVIC_VectTab_FLASH | (USER_FLASH_START & 0x1FFFFF80);
void (*App)() = (void(*)())(FIRST_PAGE_ADDR + 1);
App(); // уходим в прикладную программу
Код вызова брал по аналогии из LPC1700 USB Bootloader.
Сделал прикладную программу, которая настраивает порт светодиода на плате и зажигает его.
Прикладная программа вызывается неправильно. В ассемблерном коде используется BLX на адрес, 10001, хотя должен был быть 10002. И яр отображает код совсем подругому.
В приложенных файлах 001 и 002 показаны скриншоты яра при работе загрузчика и уходе в прикладную программу. На 003 - прикладная программа в отладочном режиме без загрузчика.
Как правильно вызывать?
Эскизы прикрепленных изображений
Умные речи подобны строкам, напечатанным курсивом. К. Прутков