Вопрос

Я использую плату 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);
}
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top