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