簡體   English   中英

開始在 IAR 中為 stm32l0 編寫引導加載程序

[英]Start to writing a bootloader for stm32l0 in IAR

在 IAR 中為 stm32l0 添加自定義引導加載程序的適當步驟是什么? 以下問題不清楚:

  • 我要創建一個新的 IAR 項目嗎?
    • 如果是,我是否像普通項目一樣編寫引導加載程序,只是更改我的原始 .icf 文件,以便引導加載程序有一個小 ROM 和一個小 RAM 區域?
    • 如果不是,除了 icf 文件和代碼之外,我還需要在 IAR proejct 中配置哪些內容?
  • 我還需要考慮哪些其他事情?

我很難開始這個。

所以icf將用於主要項目:

__region_ROM_start__ = 0x08000000;
__region_ROM_end__ = 0x08008FFF;

所以 icf 將用於引導加載程序項目:

__region_Bootloader_ROM_start__ = 0x08009000;
__region_Bootloader_ROM_end__ = 0x08009FFF;

和大約0xFF的 RAM 相同?

您不需要限制 RAM - 您可以使用所有 RAM,因為當您切換到應用程序時,將建立一個新的運行時環境並且將重復使用 RAM。

您為引導加載程序保留的閃存必須是從復位地址開始的整數閃存頁面 STM32L0 具有非常小的閃存頁面,因此應該盡量減少浪費,但是如果引導加載程序增長,您不想更改它,因為那樣你將不得不為新的起始地址重建你的應用程序代碼,並且舊的應用程序圖像將不再可加載。 所以考慮給自己一點空間。

引導加載程序可以像任何其他 STM32L0xx 項目一樣構建; 應用程序代碼 ROM 配置必須從引導加載程序上方的地址開始。 例如,假設您有一個 1Kbyte 的引導加載程序:

Boot ROM Start:    0x0800 0000
Boot ROM End:      0x0800 03FF
Application Start: 0x0800 0400
Application End:   Part size dependent.

引導加載器本身必須有確定的更新是可用的,如果可用的更新,那么它必須讀取應用數據並將其寫入到應用程序閃存,它必須然后禁用可能已被啟用的任何中斷的手段,它可以還需要取消初始化任何使用的外圍設備(如果它們在切換到應用程序時保持活動狀態,則可能會導致問題),然后切換到應用程序代碼。

如果引導加載程序和應用程序都從相同的時鍾配置運行,則可以最大限度地減少應用程序中的配置並依賴引導加載程序。 這是一個很小的空間節省,但不太靈活。 例如,如果您使用內部 RC 振盪器使引導加載程序運行,它將可移植到多個硬件設計中,這些硬件設計可能具有不同的應用程序速度和時鍾要求以及不同的外部振盪器頻率

在 Cortex-M 上切換到應用程序非常簡單,它只需要將向量表切換到應用程序的向量表,然后加載程序計數器 - 后者需要一些匯編代碼。 以下是針對 Cortex-M3 的,它可能需要對 M0+ 進行一些調整,但可能不需要:

給定以下內聯匯編函數:

__asm void boot_jump( uint32_t address )
{
   LDR SP, [R0]       ;Load new stack pointer address
   LDR PC, [R0, #4]   ;Load new program counter address
}

引導加載程序因此切換到應用程序映像:

// Switch off core clock before switching vector table
SysTick->CTRL = 0 ;

// Switch off any other enabled interrupts too
...

// Switch vector table
SCB->VTOR = APPLICATION_START_ADDR ;

//Jump to start address
boot_jump( APPLICATION_START_ADDR ) ;

其中APPLICATION_START_ADDR是應用區的基地址; 這個地址是應用程序向量表的開始,它以初始堆棧指針和復位向量開始, boot_jump()函數將這些加載到 SP 和 PC 寄存器中以啟動應用程序,就像它在復位時啟動一樣。 應用程序的復位向量包含應用程序的執行起始地址。

您的需求可能會有所不同,但根據我的經驗,使用 XMODEM 並解碼 Intel Hex 格式圖像的串行引導加載程序(使用 UART)需要大約 4Kb 的閃存。 在 STM32L0 上,您可能想要使用更簡單的東西 - 如果您只是將原始二進制數據流式傳輸並使用硬件流控制(您需要控制數據流,因為擦除和編程閃存需要時間並且還會停止 CPU 運行),那么 1Kb 可能是可行的因為您不能在 STM32 上寫入閃存,同時從中獲取指令)。

另請參閱: 如何在 Stellaris 中的程序之間跳轉

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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