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