?
介紹
這篇應(yīng)用筆記描述了一個(gè)加載flash并執(zhí)行(LFAE)次級(jí)bootloader的示例。這個(gè)應(yīng)用是開發(fā)來增強(qiáng)AN2546中給出的加載RAM并執(zhí)行主bootloader的,其中加入了允許隨意寫flash存儲(chǔ)器的代碼。
這篇文檔的目的是向讀者示范怎么實(shí)現(xiàn)一個(gè)次級(jí)bootloader。次級(jí)bootloader可以用來 在系統(tǒng) 或在個(gè)巨大的生產(chǎn)線中通過CAN或SCI接口將應(yīng)用程序代碼編程進(jìn)設(shè)備,這樣就不需要在生產(chǎn)中使用BDM接口來編程應(yīng)用程序了。它假設(shè)主bootloader已經(jīng)通過BDM或者第三方程序商編程進(jìn)設(shè)備了。
一個(gè)運(yùn)行在32位Windows操作系統(tǒng)PC上的接口小工具會(huì)傳輸所有的數(shù)據(jù)到MCU上。通信使用的是CAN或SCI。這個(gè)接口簡(jiǎn)單示例了怎么設(shè)置和監(jiān)控傳輸。
下面是要進(jìn)行的幾個(gè)步驟。前提是LRAM主bootloader已經(jīng)被加載進(jìn)MCU的flash存儲(chǔ)器中了。
接口和主bootloader決定了通信的方法和速度。
接口把LFAM次級(jí)bootloader傳輸給MCU并存儲(chǔ)它到RAM中,然后執(zhí)行它。
LFAM次級(jí)bootloader獲得控制權(quán)并與接口重建鏈接。
接口傳輸應(yīng)用程序代碼到MCU,這樣就把代碼存儲(chǔ)到了flash中。
在完成傳輸后,兩個(gè)bootloader都會(huì)被移除,然后就會(huì)執(zhí)行代碼。
這篇文檔中描述的bootloader和接口軟件只用于示例,由此產(chǎn)生的任何后果概不負(fù)責(zé)。
概述
這篇應(yīng)用筆記的目的是使用(AN2546給出的)LRAM bootloader的改進(jìn)版本來下載一個(gè)更大的次級(jí)bootloader,這個(gè)bootloader可以把應(yīng)用程序代碼寫入flash中。
對(duì)應(yīng)的軟件是AN3391SW。
縮略詞
CAN — 控制器區(qū)域網(wǎng)絡(luò),Controller area network
LFAE — 加載flash并執(zhí)行,Load flash and execute
LRAE — 加載RAM并執(zhí)行,Load RAM and execute
LSB — 最低有效字節(jié),Least significant byte
MCU — 微控制器單元,Microcontroller unit
MSB — 最高有效字節(jié),Most significant byte
RAM — 隨機(jī)訪問存儲(chǔ)器,Random access memory
SCI — 串行通信接口,Serial communication interface
BDM — 背景調(diào)試模塊,Background Debug Module
S-Record(SREC)
bootloader能接受應(yīng)用程序以S-resord(SREC)文件形式表示的二進(jìn)制鏡像。SREC文件給出用可印刷ASCII格式表示的二進(jìn)制對(duì)象代碼,使它們能很簡(jiǎn)單地在不同的系統(tǒng)間傳輸。SREC中的每一行都有一個(gè)前綴,如S1(頭)或S9(尾)。與bootloader有關(guān)的前綴是S1和S2。
S1記錄描述的是存儲(chǔ)在邏輯地址中的數(shù)據(jù),而S2記錄描述的是放在全局地址中的數(shù)據(jù)。S1和S2行有同樣的結(jié)構(gòu),如下:
?
?
Type字段包含前述的前綴。Record Length是一個(gè)1字節(jié)長(zhǎng)(兩個(gè)ASCII字符)的值,它說明了后面字段的字節(jié)數(shù)。Address字段給出了數(shù)據(jù)應(yīng)該被寫入的地址。在一個(gè)S1記錄中,Address有兩字節(jié)長(zhǎng)(邏輯地址使用16位地址)。在S2記錄中,Address有三字節(jié)長(zhǎng)(標(biāo)準(zhǔn)的16位地址加上一個(gè)7bit PPAGE值)。Data字段包含要加載進(jìn)存儲(chǔ)器的數(shù)據(jù)。最后,通過加和Record Length、Address和Data字段對(duì)應(yīng)的字節(jié)值然后取反來計(jì)算校驗(yàn)和。
需求
這個(gè)部分給出了通過主和次bootloader加載應(yīng)用程序到MCU中所需的軟硬件。
硬件
這篇應(yīng)用筆記中描述的方法需要一個(gè)S12XE MCU,其flash中要預(yù)裝好主bootloader。為了測(cè)試,使用了EVB9S12XEP100 Kit開發(fā)套件。
還需要一個(gè)裝著兼容32位Windows的操作系統(tǒng)的PC來運(yùn)行接口。PC必須有一個(gè)SCI端口或者如果使用CAN通信的話要有PC-CAN卡。為了測(cè)試,使用了Vector CANalyzer卡。
軟件
所有為MCU準(zhǔn)備的代碼都在CodeWarrior V5.70中測(cè)試。
為了保證主次bootloader間快速平滑的轉(zhuǎn)換,LRAE需要一些小改動(dòng)。
CANFlag結(jié)構(gòu)中需要另外加一個(gè)flag來說明bootloader正在使用的是SCI還是CAN接口。
在把控制權(quán)交給次級(jí)bootloader前,需要清零CAN幀接收標(biāo)志位(canrflg.rxf)。
功能描述
? ? ? ?
這個(gè)部分詳述了次級(jí)bootloader是怎么加載進(jìn)RAM中的,還詳述了其運(yùn)行的基礎(chǔ)以說明它是怎么與接口小工具協(xié)作以實(shí)現(xiàn)下載并運(yùn)行一個(gè)應(yīng)用程序的。
下載次級(jí)BootLoader
為了確保與主BootLoader兼容,次級(jí)bootloader被放置在內(nèi)存中,于是SREC中的地址是嚴(yán)格順序排放的(就是說,它包含一個(gè),在記錄的作用域內(nèi),用于所有內(nèi)存地址的值)。圖1 是接口小工具傳輸次級(jí)bootloader的SREC的基本流程圖。
?
圖 1.接口小工具傳輸bootloader的流程
?
SCI接口
如果選擇SCI端口來傳輸數(shù)據(jù),波特率必須為可用波特率之一。聲明要使用PC的哪一個(gè)COM端口來建立串行通信。接口小工具然后就會(huì)傳輸 同步字節(jié)(0x55)然后等待 確認(rèn)字節(jié)(0xAA)。如果等了50ms還沒有收到確認(rèn)字節(jié),接口就會(huì)重復(fù)這個(gè)過程。在完成這步之后,就可以開始處理SREC文件了。
?
圖 2.bootloader接口的主菜單
?
由于次級(jí)bootloader被放在本地RAM中,接口打開SREC文件并搜索第一個(gè)S1行。找到后,它獲取并傳輸代碼的起始地址,MSB優(yōu)先。通過加和每一行中的長(zhǎng)度字段中的值,計(jì)算出要被傳輸?shù)乃袛?shù)據(jù)的字節(jié)總數(shù)(去掉地址和校驗(yàn)和占的字節(jié))。傳輸還是按MSB優(yōu)先。然后bootloader就準(zhǔn)備好接收數(shù)據(jù)了,接口小工具開始從SREC文件的每一行提取出數(shù)據(jù)并一次傳輸一個(gè)字節(jié)。在完成這一步后,再傳輸校驗(yàn)和(通過加和所有傳輸?shù)淖止?jié)的值然后模256)。如果校驗(yàn)和與bootloader計(jì)算結(jié)果一致,次級(jí)bootloader就會(huì)運(yùn)行并獲得S12XE的控制權(quán)。
CAN接口
如果選擇使用CAN來傳輸數(shù)據(jù),先選擇使用哪個(gè)通道以及使用的比特率。然后就與使用SCI進(jìn)行傳輸?shù)牧鞒檀笾孪嗤恕5怯捎贑AN數(shù)據(jù)包可以存儲(chǔ)最多8個(gè)字節(jié),地址以及字節(jié)總和是使用特定標(biāo)識(shí)符的獨(dú)立消息來傳輸?shù)摹T龠M(jìn)一步,數(shù)據(jù)也可以一次傳輸8個(gè)字節(jié)。
?
圖 3.CAN比特率選擇菜單
?
每類消息的特定標(biāo)識(shí)符,以及對(duì)應(yīng)的數(shù)據(jù)傳輸?shù)母袷娇梢栽贏N2546中找到。
地址映射
次級(jí)bootloader位于本地RAM中,在邏輯地址0x2000 – 0x2525。為了運(yùn)行,次級(jí)bootloader還需要訪問主bootloader中的變量,這些變量位于0x3FD0 – 0x3FDA。主bootloader位于本地flash中,位于0x4000 – 0x440A。在執(zhí)行次級(jí)bootloader前,S12XE的本地地址映射如圖4。
?
圖 4.裝載次級(jí)bootloader后的地址映射
?
下載應(yīng)用程序
在次級(jí)bootloader獲得S12XE的控制權(quán)后,它開始為接收應(yīng)用程序的SREC做準(zhǔn)備。為了辨認(rèn)使用的是哪一個(gè)通信接口,次級(jí)bootloader會(huì)查看由主bootloader存儲(chǔ)的一些變量。它之所以能夠查看變量是因?yàn)樽兞吭赗AM中并且S12XE在轉(zhuǎn)換過程中并沒有經(jīng)歷重置。
首先要查看 變量 SCI_ 或 _CAN 來得知使用的是哪一個(gè)通信接口。通信中會(huì)使用指向?qū)嶋H硬件外設(shè)的指針 — SCI_Ptr 或 CAN_Ptr。所有的速度和耗時(shí)信息都由主bootloader之前設(shè)置好了。
由于flash不允許多次編程同個(gè)地址,包含重置向量和主bootloader程序的扇區(qū)會(huì)被擦除。這是一個(gè)必要操作,但是卻有個(gè)嚴(yán)重的風(fēng)險(xiǎn),如果在成功下載應(yīng)用程序之前發(fā)生了任何錯(cuò)誤或者電源故障,就無法恢復(fù)了。
不像次級(jí)bootloader,應(yīng)用程序的SREC不必包含連續(xù)的地址。這使得重置向量能被放在任何SREC中。
傳輸應(yīng)用程序
圖 5是接口小工具通過SCI或者CAN接口傳輸應(yīng)用程序的流程圖。
?
圖 5.接口小工具的傳輸流程圖
?
接口小工具會(huì)等待1000ms以保證次級(jí)bootloader有足夠的時(shí)間運(yùn)行并擦除需要的flash塊。之后的步驟則與使用的通信接口有關(guān)。
SCI
如果發(fā)現(xiàn)了S2行,接口會(huì)提取 行長(zhǎng)度 并把它傳輸給bootloader。然后,后面的3字節(jié)地址會(huì)以這個(gè)順序傳輸:PPAGE 值、MSB然后LSB。完成這步后,數(shù)據(jù)會(huì)被每次傳輸一個(gè)字節(jié)。最后,校驗(yàn)和會(huì)從SREC行中提取出來并發(fā)送給bootloader以進(jìn)行驗(yàn)證。如果校驗(yàn)和匹配,bootloader會(huì)答復(fù)0x80。否則,bootloader會(huì)重復(fù)這個(gè)SREC行的傳輸。
如果發(fā)現(xiàn)了S9行,接口必須告知bootloader下載已經(jīng)完成。這時(shí)bootloader應(yīng)該在等待的是下一個(gè)S2行的行長(zhǎng)度。通過發(fā)送0,bootloader就知道下載已經(jīng)完成了。
CAN
數(shù)據(jù)的大小是自動(dòng)嵌入到CAN幀中的;因此,不需要在數(shù)據(jù)傳輸中包含這個(gè)信息。發(fā)送給bootloader的首個(gè)數(shù)據(jù)包包含地址字段。地址、數(shù)據(jù)和校驗(yàn)和幀分別使用特定的ID以簡(jiǎn)化接收算法。表1中是每種幀類型的ID。數(shù)據(jù)與校驗(yàn)和數(shù)據(jù)包跟隨在地址幀之后。接口小工具會(huì)傳輸一個(gè)特殊的執(zhí)行幀以啟動(dòng)應(yīng)用程序。
表 1.數(shù)據(jù)包類型和它們對(duì)應(yīng)的標(biāo)識(shí)符
數(shù)據(jù)包 地址 數(shù)據(jù) 校驗(yàn)和 執(zhí)行
標(biāo)識(shí)符?0x020?0x040?0x080?0x010?
接收并存儲(chǔ)應(yīng)用程序
這個(gè)部分詳述了bootloader是怎么接收數(shù)據(jù)并將其寫入flash中的。
CAN和SCI這兩個(gè)版本的實(shí)現(xiàn)以相似的方式工作。每個(gè)SREC行都被單獨(dú)處理。由于flash只能一次寫入8個(gè)字節(jié),數(shù)據(jù)會(huì)在接收時(shí)被存儲(chǔ)在一個(gè)數(shù)組中。如果收到了校驗(yàn)和并驗(yàn)證通過,數(shù)據(jù)就被8個(gè)8個(gè)的寫入。在每8個(gè)字節(jié)被寫入后,地址指針就會(huì)自增8。
由于flash編程的特性,首個(gè)SREC的起始地址必須對(duì)齊8字節(jié)邊界。
運(yùn)行應(yīng)用程序
在接收到接口小工具的執(zhí)行指令后,bootloader會(huì)通過寫一個(gè)未實(shí)現(xiàn)的內(nèi)存地址來讓S12XE重置。在重置之后,S12XE會(huì)從重置向量開始執(zhí)行,這個(gè)時(shí)候重置向量指向了應(yīng)用程序的首個(gè)指令。
與S12XD的兼容性
搭配這篇應(yīng)用筆記的軟件是為S12XE設(shè)計(jì)的,為了在S12XD上運(yùn)行它,需要一些小的改動(dòng)。頭文件要改成S12XD對(duì)應(yīng)的頭文件。這樣就可以解決不同設(shè)備寄存器位置不同的問題。還要檢查一下代碼中用到的寄存器在S12XD和S12XE中的位極性是否一致,因?yàn)椴煌脑O(shè)備中經(jīng)常會(huì)不同。
另一個(gè)不兼容的是flash編程方法。S12XE使用了糾錯(cuò)編碼以強(qiáng)化對(duì)數(shù)據(jù)完整性的保護(hù)。而S12XD上沒有ECC。這導(dǎo)致S12XD的flash每8字節(jié)都要多寫入2字節(jié)。管理寫操作的寄存器也與S12XD十分不同。
為了簡(jiǎn)化移植,負(fù)責(zé)flash寫操作的代碼被單獨(dú)放在源文件S12XE_Flash.c中。只需要修改這個(gè)文件就可以了。
總結(jié)
LFAE bootloader和隨帶的接口小工具是AN2546中開發(fā)的LRAE bootloader的一個(gè)很棒的插件。通過使用它們兩個(gè),不需要額外的昂貴設(shè)備就能將應(yīng)用程序下載到一個(gè)新S12XE的flash中。
參考文獻(xiàn)
Martyn Gallop, HCS12 Load RAM and Execute Bootloader User Guide, Freescale Application Note
AN2546, 2004
{譯文}
S12XD and S12XE Family Compatibility, Freescale, 2006
Motorola S-Records
{譯文}
Ramon de Klein, Serial library for C++, 2001
評(píng)論
查看更多