已擦除的ADuCM355 閃存由于沒有內核引導加載程序,必須首先由用戶應用程序通過串行線進行編程。
用戶應用程序可以實現自己的引導加載程序,提供一個用于現場自我更新的機制。實現自己的用戶引導加載程序要求以適當的方式構建用戶應用程序,使其適合用戶引導加載程序。
本應用筆記介紹了一種實現用引導加載程序的方法(以下稱為"用戶引導加載程序"):將用戶閃存劃分為兩個單獨的區域,并在一個區域中實現與CrossCore ^?^ 串行閃存編程器兼容的引導加載程序。
ADUCM355背景
用戶引導加載程序的實現利用了ADuCM355的以下特性。
ADuCM355具有128 kB的用戶閃存,為了擦除和寫保護目的,用戶閃存被分為多個單獨的8 kB塊。
復位后,片上內核立即執行以下操作:
- 利用制造商數據引導器件。
- 評估用戶閃存元數據,以確定是切換到運行用戶應用程序還是留在片上內核中。
- 評估用戶閃存元數據,以確定是否對用戶閃存空間內的閃存塊進行寫保護。如果用戶應用程序有效,它將應用塊寫保護并退出用戶應用程序。如果用戶應用程序無效或BM/P1.1引腳被置為有效,則它不會應用塊寫保護,而是留在片上內核中(內核執行圖參見圖7)。
留在片上內核中具有以下優點:
- 恢復。禁止用戶代碼運行和執行可能阻止對器件進行所需訪問的操作。
- 避免寫保護。無法擦除寫保護塊,即使批量擦除也不行。這樣就避免了通過用戶閃存元數據間接應用于用戶閃存或通過用戶應用程序執行直接應用于用戶閃存的寫保護。由于代碼執行仍在內核中,因此可以進行用戶閃存批量擦除。
用戶引導加載程序的實現
用戶引導加載程序放置在用戶閃存的前8 kB中。剩余的120 kB可用于用戶應用程序開發(見圖1)。
圖1.內存布局
用戶引導加載程序是一個獨立的應用程序,位于用戶閃存的前8 kB中。用戶應用程序必須從0x2000(即8 kB)開始執行,這需要對標準應用程序進行一些細微修改。
為了進行修改,需要使用自定義鏈接器配置文件,以將用戶應用程序放置在用戶閃存的適當區域。
自定義鏈接器文件的加載可以在IAR Embedded Workbench ^?^ 環境中通過訪問鏈接器 > 配置選項卡來實現,如圖5所示。完整過程參見"轉換步驟"部分。
將.icf鏈接器腳本文件與GitHub上提供的ADuCM355標準文件進行比較,圖2突出顯示了一些不同之處。
圖2.鏈接器配置文件修改
引導加載程序的放置
用戶引導加載程序駐留在用戶閃存的前8 kB中。用戶引導加載程序的構建與任何其他ADuCM355應用程序一樣,帶有異常向量表、校驗和放置以及用戶閃存元數據。
用戶應用程序的放置
用戶應用程序從0x2000開始放置,應用程序可用空間減少0x2000。Cortex ^?^ -M3中斷向量表位于0x2000。用戶引導加載程序會更新Cortex-M3向量表偏移寄存器(VTOR)以匹配該位置。
用戶閃存元數據偏移0x2000。
用戶引導加載程序元數據
用戶引導加載程序元數據由片上內核檢查并執行相應操作。片上內核首先確保用戶引導加載程序區域的有效性,然后轉移控制權并將用戶閃存寫保護應用于用戶閃存的用戶引導加載程序區域。
用戶應用程序元數據
用戶應用程序元數據由用戶引導加載程序檢查并執行相應操作。用戶引導加載程序首先確保用戶應用程序區域的有效性,然后轉移控制權并將用戶閃存寫保護應用于用戶閃存的用戶應用程序區域。
用戶引導加載程序對用戶應用程序元數據執行的檢查和操作,與片上內核對用戶引導加載程序元數據(或標準應用程序元數據)執行的檢查和操作類型相同,僅更改所使用的地址和范圍。這樣,標準應用程序只需偏移0x2000便可輕松轉換為由用戶引導加載程序進行操作。
桌面應用程序
該協議與ADI公司的CrossCore串行閃存編程器工具兼容,后者可從www.analog.com/crosscore-utilities下載。
CrossCore串行閃存編程器工具支持幾種不同的協議變體。用戶引導加載程序的這種實現支持 ADuCM3027 和 ADuCM3029所實現的版本。選擇Target下的ADuCM302x選項,如圖3所示。
操作(Action) 支持的選項有 編程(Program) 和 擦除(Erase) 。
點擊 瀏覽(Browse) 按鈕,從 要下載的文件(File to download) 中加載用戶應用程序Intel十六進制文件,然后點擊 開始(Start) 按鈕。
圖3.CrossCore串行閃存編程器窗口
轉換步驟
轉換現有應用程序以與用戶引導加載程序或用戶應用程序模型一起使用時,需要執行如下步驟。
- 從GitHub下載或克隆ADuCM355軟件開發套件(SDK)文件。在GitHub上搜索ADuCM355,找到aducm355-examples SDK文件。
- 在SDK中,導航至examples > DigitalDie > M355_Bootloader 。將 BootloaderConstantArray .c文件以及iar文件夾中的 user-bootloader-sample-application.icf文件復制并粘貼到要實現引導加載程序的活動項目目錄中。
- 在IAR Embedded Workbench中打開所需的項目,然后在項目瀏覽器中右鍵點擊應用程序文件夾,將BootloaderConstantArray.c文件添加到項目中。然后轉到添加(Add) > 添加文件(Add Files) ,選擇BootloaderConstantArray.c文件。用戶引導加載程序以C文件提供,該C文件包含一個用來實現用戶引導加載程序的C指令代碼數組。還有一個自定義鏈接器配置文件,用以確保將此數組正確放置在0x0000 0000處。!
圖4.添加引導加載程序
4. 在IAR Embedded Workbench中訪問鏈接器 (Linker) 配置(Config) 選項卡,選擇自定義鏈接器配置文件,如圖5所示。選擇覆蓋 默認值(Override default) 框,然后瀏覽查找user-bootloader-sample-application.icf文件。
此更改的鏈接器配置文件確保用戶引導加載程序和用戶應用程序根據用戶引導加載程序或用戶應用程序模型正確放置。
圖5.指定自定義鏈接器配置文件
5. 用戶應用程序校驗和的計算范圍必須根據更改的內存布局加以調整。要在IAR Embedded Workbench中調整校驗和計算,請轉到鏈接器(Linker) > 校驗和(Checksum) 選項卡,如圖6所示。在 起始地址(Start address) 框中輸入 0x2000 ,在 結束地址(End address) 框中輸入 0x27FB 。
在標準應用程序中,片上內核使用此計算來檢查用戶閃存中應用程序的完整性。
在用戶引導加載程序或用戶應用程序模型中,片上內核在切換到用戶引導加載程序之前先檢查其完整性,用戶引導加載程序在切換到用戶應用程序之前先檢查其完整性。
圖6.校驗和計算
6. 修改startup_ADuCM355.c文件。
-
添加以下代碼行:
/* Linker provided symbols */
extern uint32_t FINAL_CRC_PAGE;
-
搜索NumOfCRCPages并將以下行:
__root const uint32_t NumOfCRCPages=0;
替換為以下行:
__root const uint32_t NumOfCRCPages=(uint32_t)&FINAL_CRC_PAGE;
-
最后一步是向主程序添加一個函數。
void __iar_init_core (void)
{
SCB->VTOR = (uint32_t)
&__vector_table;
}
此函數的作用是將VTOR指向用戶固件異常表。引導加載程序已經執行此步驟,但在調試模式下,IAR Embedded Workbench會繞過運行引導加載程序的步驟。IAR Embedded Workbench調試器執行Type 0復位(硬件復位),然后將PC設置到它認為的復位向量。因此,為使中斷在調試模式下工作,此函數是必需的。
現在可以正常下載和調試此應用程序。
引導模式引腳
片上內核和用戶引導加載程序具有不同的引導模式引腳,這些引腳會改變各自的執行流程。
片上內核引導模式引腳的優先級高于用戶引導加載程序引導模式引腳的優先級。
片上內核BM/P1.1引腳
BM/P1.1繞過用戶閃存中所有軟件的執行。
BM/P1.1引腳連接到EVAL-ADucM355QSPZ評估板上的開關S3。按住開關S3,隨后執行復位操作(按下再釋放開關S1),就會將片上內核置于引導模式。
用戶引導加載程序引導模式P1.0/SYS_WAKE引腳
P1.0/SYS_WAKE引腳繞過用戶閃存中可能存在的用戶應用程序的執行。如果置為有效,則用戶引導加載程序不檢查是否存在有效的用戶應用程序,而立即進入下載模式。
P1.0/SYS_WAKE引腳連接到EVAL-ADucM355QSPZ評估板上的開關S2。按住開關S2,隨后執行復位操作(按下再釋放開關S1),就會將用戶引導加載程序置于引導模式。
圖7.引導加載程序流程圖
審核編輯:郭婷
-
編程器
+關注
關注
9文章
398瀏覽量
42421 -
應用程序
+關注
關注
38文章
3292瀏覽量
57911
發布評論請先 登錄
相關推薦
評論