Загрузчик для Cortex M3
-
13-12-2019 - |
Вопрос
Я использую плату LPC 1768 от Mhbed, (с Cortex M3 CPU), и я пытаюсь достичь чего-то здесь, в основном обновление пользовательского приложения с SD-карты, я пишу две программы, сначала загрузчик / нано- Ядро и пользовательское приложение (HellowOrld сделает для начала):
- .
- bootloader / nano-kernel в адресе 0x00 запускается, он сделает некоторые проверки и в конечном итоге захватывают двоичный файл на SD-карте
- bootloader / nano-kernel скопирует этот двоичный файл по адресу 0x9000 (это может придеться измениться позже, но это пространство не используется загрузчиком / Nano-ядром, поэтому должно быть в порядке)
- загрузчик переходит к приложению пользователя в 0x9000 + 4
SD-карта довольно проста в режиме ожидания, у меня проблемы с выпуском. Вот код функции прыжки.
void run(void) {
void (*user_code_entry)(void);
unsigned *p;
SCB->VTOR = (USER_FLASH_START & 0x1FFFFF80);
// Load contents of second word of user flash - the reset handler address
// in the applications vector table
p = (unsigned *)(USER_FLASH_START +4); // USER_FLASH_START is 0x9000
user_code_entry = (void (*)(void))p;
// Jump to user application
user_code_entry();
.
}
Так что я скомпилировал (я использую keil uvision4) приложение пользователя, изменяющее начало адресата 0x9000. Если я программирую свою доску (используя flashmagictool), а затем вручную скажется (все еще используя flashmagictool) к 0x9004 (0x9000 + 4), приложение пользователя будет работать, поэтому я полагаю, что компиляция работала хорошо, поэтому пользовательское приложение может работать в 0x9000. < / P >.
Но если я запускаю загрузчик / нано-ядро, этот не прыгает на приложение пользователя и, к сожалению, как я не могу отлаживать, я не уверен в том, что происходит ... Я также пытался не использовать Часть Copy SD, поэтому я сначала программирую загрузчик в основном просто переходом к 0x9004. Затем я программирую пользовательское приложение, которое будет сидеть на 0x9000. Если я перезагрузим доску, загрузчик загрузчик работает, но не переходит в пользователь-приложение. Я проверил память, и кажется, что обе программы (загрузчик + пользователь-приложение) верны и в нужном месте.
Я уверен, что я что-то упускаю здесь, есть ли какой-нибудь код низкого уровня, на которого я должен смотреть? Я прочитал Tones Docs Online, а из примеров, которые я нашел, они прыгают на код пользователя так же, как я делаю ... Большое спасибо за любую помощь.
Решение
Cortex M3 может работать только в режиме большого пальца.Таким образом, вы всегда должны прыгать на address +1
, в противном случае он будет генерировать неисправность.
Просто попробуйте:
user_code_entry = (void (*)(void))(USER_FLASH_START +4 +1);
Другие советы
Просто прочитайте документ AN10866 на сайте NXP.Вы загружаете PC и указку стека, а затем перейти к прерыванию сброса:
__asm void boot_jump( uint32_t address ){
LDR SP, [R0] ;Load new stack pointer address
LDR PC, [R0, #4] ;Load new program counter address
}
void execute_user_code(void)
{
/* Change the Vector Table to the USER_FLASH_START
in case the user application uses interrupts */
SCB->VTOR = USER_FLASH_START & 0x1FFFFF80;
boot_jump(USER_FLASH_START);
}
.