簡體   English   中英

Cortex M3的Bootloader

[英]Bootloader for Cortex M3

我正在使用mbed的LPC 1768板(帶有cortex M3 cpu),我正在嘗試在這里實現一些功能,主要是從SD卡升級用戶應用程序,我正在編寫兩個程序,首先是一個bootloader / nano-kernel,以及一個用戶應用程序(helloworld將開始):

  • 在0x00地址運行的Bootloader / nano-kernel,它會進行一些檢查並最終獲取SD卡上的二進制文件
  • Bootloader / nano-kernel會將這個二進制文件復制到地址0x9000(以后可能需要更改,但bootloader / nano-kernel不會使用此空間,所以應該沒問題)
  • Bootloader跳轉到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運行。

但是,如果我運行bootloader / nano-kernel,這個沒有跳轉到用戶應用程序,不幸的是因為我無法調試,我不知道發生了什么...我也試過不使用SD副本部分,所以我首先編程引導加載程序,基本上只是跳轉到0x9004。 然后我編寫將位於0x9000的用戶應用程序。 如果我重啟電路板,bootloader會運行,但不會跳轉到用戶應用程序。 我檢查了內存,似乎兩個程序(bootloader + user-app)都是正確的並且位於正確的位置。

我相信我在這里遺漏了一些東西,有沒有我應該看的低級代碼? 我已經在網上閱讀了文檔的音調,從我發現的例子中,他們以與我相同的方式跳轉到用戶代碼...非常感謝任何幫助。

Cortex M3只能在Thumb模式下運行。 因此,您始終必須跳轉到address +1 ,否則會產生故障。

試一試:

user_code_entry = (void (*)(void))(USER_FLASH_START +4 +1);

請閱讀恩智浦網站上的AN10866文檔。 您已加載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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM