一. 背 景
嵌入式設(shè)備升級(jí)過(guò)程中會(huì)由于斷電、強(qiáng)行中斷等外部因素,導(dǎo)致新固件寫(xiě)入Flash時(shí)不能完整寫(xiě)入,使系統(tǒng)啟動(dòng)時(shí)出現(xiàn)問(wèn)題。或設(shè)備運(yùn)行中,鏡像文件被意外損壞,導(dǎo)致系統(tǒng)癱瘓,設(shè)備無(wú)法運(yùn)行。面對(duì)以上問(wèn)題,可以使用雙鏡像機(jī)制(dual image),它保證至少有一個(gè)鏡像文件是可以啟動(dòng),并且在任何時(shí)候都能正常工作。如果發(fā)生意外,引導(dǎo)加載程序檢測(cè)并使用備用的鏡像文件。
二. 原 理
LPC5536 ROM支持內(nèi)部Flash的雙鏡像引導(dǎo)(也支持FlexSPI外部Flash,原理相同),即在Flash可以放置兩個(gè)引導(dǎo)鏡像,ROM根據(jù)鏡像文件版本號(hào)決定啟動(dòng)哪個(gè)鏡像,首先啟動(dòng)最新版本號(hào)的鏡像,如果失敗,則啟動(dòng)舊鏡像文件。
通電啟動(dòng)時(shí),ROM首先檢測(cè)CMPA中關(guān)于重定位鏡像文件的位置和大小,然后檢測(cè)兩個(gè)鏡像的版本號(hào),所以在使用雙鏡像機(jī)制時(shí),主要對(duì)鏡像文件重定位和版本號(hào)進(jìn)行配置。
ROM從內(nèi)部Flash啟動(dòng)雙鏡像文件流程圖如下:
2.1 鏡像文件重定位
LPC5536內(nèi)部Flash支持重映射,當(dāng)設(shè)置重映射偏移量后,F(xiàn)lash AHB 總線(xiàn)將訪(fǎng)問(wèn)偏移后的地址。例如,當(dāng)偏移量設(shè)置為128K(0x20000),對(duì)0x0的訪(fǎng)問(wèn)將被重新映射到地址0x20000。通過(guò)這個(gè)特性,ROM可以實(shí)現(xiàn)雙鏡像引導(dǎo)。下面是一個(gè)關(guān)于內(nèi)部Flash存放兩個(gè)鏡像文件的簡(jiǎn)圖。
第二個(gè)鏡像的偏移量和重映射大小由用戶(hù)在CMPA區(qū)域設(shè)置,讓ROM知道第二個(gè)鏡像的位置。
2.2 配置鏡像的版本
在頭文件偏移量為0x24處設(shè)置鏡像版本號(hào),如下表格所示,第16位-31位設(shè)置鏡像文件版本號(hào),第10位表示鏡像文件是否存在版本號(hào),使用雙鏡像機(jī)制時(shí),此位設(shè)置為1.
三. 應(yīng) 用
3.1 配置CMPA
配置CMPA中數(shù)據(jù)值
修改cmpa.bin文件,通過(guò)blhost把修改后的bin文件寫(xiě)入CMPA,以配置image1偏移量和重映射大小,流程如下:
a. 打開(kāi)一個(gè)全0的cmpa.bin,修改0x3E23C處數(shù)據(jù)為0x20000,高位在右低位在左,如下:
b. 修改重映射大小。地址0x3E238處修改為0x1d800,如下:
c. 保存并重命名為cmpa_new.bin,另存為lhost_2.6.7lhost_2.6.7inwin
3.2 燒寫(xiě)cmpa_new.bin
借助blhsot 工具燒寫(xiě),blhost 2.6.7是一個(gè)命令行調(diào)試工具,界面如下:
測(cè)試blhost與開(kāi)發(fā)板通信是否正常:
首先,從設(shè)備管理器查看開(kāi)發(fā)板與電腦連接端口號(hào)
其次,開(kāi)發(fā)板J43上使用跳線(xiàn)帽連接3和4,使能ISP啟動(dòng);
然后,按下復(fù)位鍵,輸入連接測(cè)試命令blhost -pcom12 -- get-property 1
判斷是否正常通信,如連接成功會(huì)提示信息:
寫(xiě)入修改好的bin文件數(shù)據(jù)到CMPA
通過(guò)使用blhost -pcom12 -- write-memory 0x3e200 cmpa_new.bin命令,寫(xiě)入CMPA:
為確保正確寫(xiě)入,查看設(shè)置之后CMPA數(shù)據(jù)
通過(guò)命令blhost -pcom12 -- read-memory 0x3e200 512查看設(shè)置后的CMPA數(shù)據(jù):
3.2 雙鏡像版本設(shè)置
根據(jù)實(shí)驗(yàn)效果,Image0的功能是LPC5536-evk開(kāi)發(fā)板上紅燈閃爍,Image1功能是綠燈閃爍。
Image0 設(shè)置版本號(hào)為1,Image1 設(shè)置版本號(hào)為2:
打開(kāi)紅燈閃爍的工程,修改頭文件偏移量0x24處為0x10400
打開(kāi)綠燈閃爍的工程,修改頭文件偏移量0x24處為0x20400
3.3 分配Flash
LPC5536JBD100用戶(hù)可用的內(nèi)部Flash共246K,所以Image0 分配到0x0-0x1FFFF地址范圍內(nèi),Image1分配到0x20000-0x3D7FF地址范圍內(nèi)。如果使用MCUXpresso ID,設(shè)置如下:
工程->右鍵屬性->MCU settings,設(shè)置起始地址和大小,完成后點(diǎn)擊應(yīng)用按鈕。
紅燈閃爍工程:
綠燈閃爍工程:
重現(xiàn)編譯工程。
3.4 功能測(cè)試
測(cè)試程序?yàn)閮蓚€(gè)點(diǎn)燈程序,分別為紅燈閃爍和綠燈閃爍程序,紅燈閃爍為image0,版本號(hào)1,綠燈閃爍為image0,版本號(hào)2,所以測(cè)試結(jié)果如果綠燈閃爍,則成功。
下載程序
使用IDE中GUI Flash Tool,分別下載兩個(gè)鏡像文件到開(kāi)發(fā)板中:
在“File to program”中選擇燒寫(xiě)的文件,點(diǎn)擊run按鈕后,程序會(huì)下載到Flash:
下載完成后,點(diǎn)擊確定:
同樣的方式下載另外一個(gè)程序,注意在燒寫(xiě)第二個(gè)程序時(shí),不能勾選“masserase”,如果使用其它工具燒寫(xiě),也應(yīng)關(guān)閉和”masserase”相同功能的選項(xiàng),避免擦除第一個(gè)鏡像文件。
測(cè)試結(jié)果
下載程序后,復(fù)位,綠燈閃爍。
升級(jí)測(cè)試:將紅燈閃爍工程版本號(hào)修改為3,即修改0x10400為0x30400,重新燒寫(xiě)鏡像文件,應(yīng)該會(huì)看到紅燈閃爍。
四. 總結(jié)
雙鏡像機(jī)制為嵌入式設(shè)備的升級(jí)和啟動(dòng)增加保險(xiǎn),應(yīng)用過(guò)程中需要注意在CMPA區(qū)域設(shè)置鏡像偏移量、重映射大小和配置鏡像版本的方式,同時(shí)也需要注意兩個(gè)工程中Flash配置。
-
mcu
+關(guān)注
關(guān)注
146文章
17123瀏覽量
350991 -
嵌入式
+關(guān)注
關(guān)注
5082文章
19104瀏覽量
304811 -
FlaSh
+關(guān)注
關(guān)注
10文章
1633瀏覽量
147940 -
ROM
+關(guān)注
關(guān)注
4文章
563瀏覽量
85732 -
嵌入式設(shè)備
+關(guān)注
關(guān)注
0文章
110瀏覽量
16955
原文標(biāo)題:MCU雙鏡像機(jī)制如何使能?
文章出處:【微信號(hào):pzh_mcu,微信公眾號(hào):痞子衡嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論