介紹
這篇應用筆記介紹了為 基于180nm技術的 S12和S12X微控制器家族 編寫的一個bootloader程序的運行和使用。
使用這bootloader可以很方便地實現(xiàn)生產(chǎn)中編程或者“在線系統(tǒng)(in-system)”編程,特別是應用于那些 無法使用HCS12背景調(diào)試接口(BDM)的場合。用戶必須在生產(chǎn)準備階段或在編程供應商那把bootloader預先燒寫進S12(X)。Bootloader會留存在MCU中以供未來使用。
這個bootloader實現(xiàn)支持通過SCI串口將用戶軟件下載進MCU flash內(nèi)存中。
這篇文檔中描述的bootloader只是一個示例,由其產(chǎn)生的任何后果我們概不負責,并且我們不提供技術支持。
硬件兼容性
有兩個版本的bootloader:
第一個是為S12系列(S12P、S12HY、S12HA和S12G)寫的。
第二個是為S12X系列(S12XS、S12XE和S12XF)寫的。
除非特別標注,這篇應用筆記中的內(nèi)容適用于所有兩個版本。
這個bootloader沒有為最小的設備進行優(yōu)化。因此,不支持MC9S12GN16。
當前不支持對D-Flash或說EEPROM的編程。
需求
為了成功運行這個bootloader,需要滿足一些需求。
輸入引腳
有許多種方式確定是要啟動bootloader還是用戶應用程序。比如可以選擇通過判斷輸入引腳的狀態(tài)、通過EEPROM內(nèi)存中的某個變量的狀態(tài)或者通過從通訊接口收到的命令。
這個bootloader使用第一種方式。在重置之后,bootloader會使能PP0引腳的上拉寄存器并且讀取PP0引腳的狀態(tài)以確定是否你想要運行bootloader。
可能這個引腳的外部電路是這樣的:一個開關、跳線或者一個按鈕與可選的上拉電阻器。
?
?
圖 1.引腳連接
串行接口
所有的S12(X)微控制器都有集成串行通信接口。注意,需要RS232電平轉(zhuǎn)換器以與PC通信。
默認的,串行通信會設為這個格式:
8數(shù)據(jù)位
1起始位
1停止位
0校驗位
Xon/Xoff 流控制
默認的波特率是9600。可以在bootloader的菜單中修改其為38400、57600或115200 bps。
終端模擬程序
可以使用串口調(diào)試助手來與PC通信。這個串口調(diào)試器必須支持串行COM口通信、Xon/Xoff流控制以及必須支持發(fā)送文本文件。
S12微控制器不需要外部晶振。bootloader會使用S12微控制器內(nèi)部的一個1MHz的RC震蕩電路。Bootloader設置總線頻率為25MHz以支持高速率通信。
S12X微控制器需要晶振或者外部振蕩器。在bootloader內(nèi)配置PLL以達到40MHz的總線時鐘頻率。這是為了提高通信速率以加快代碼下載速度。
功能描述
bootloader的運作方式很直白。這個部分僅描述了最重要的和最特殊的那些。
運作
bootloader會處理所有的重置向量。在重置后,會調(diào)用bootloader的startup例程。首先,bootloader會讀取PP0引腳的狀態(tài)。如果引腳值為邏輯0,bootloader就會開始工作。如果是邏輯1,就會調(diào)用用戶應用程序的startup例程。如果用戶應用的重置向量不可用(地址0xEFFE-0xEFFF上的字被擦除),那不管怎么樣bootloader都會開始運行。用戶可以重寫這個代碼以更改啟動條件。
中斷向量
在用戶應用用到了中斷的情況下,需要使用IVBR寄存器重定位中斷向量表。bootloader被放在最高的一個地址塊中,地址0xF000-0xFFFF。這個區(qū)域是受保護的,所以用戶的應用程序不能把中斷向量表放在默認的地址0xFF10-0xFFFF。這種方案的優(yōu)點是bootloader不會受到電源故障的影響,這可能會在重寫中斷和重置向量時發(fā)生。
掩碼組與part ID
每個硅掩碼組都有一個特定的part ID,位于兩個8位寄存器中,PARTIDH和PARTIDL中,地址在0x001A和0x001B。
當要把s-record編程到flash內(nèi)存中去時,bootloader會檢查是否地址位于物理flash內(nèi)存上。當?shù)刂窡o效時,會返回一個錯誤。
在bootloader工程的PartID.h文件中可以找到當前支持的掩碼組和part ID。
用戶指南
這個部分描述了使用這個bootloader的每一步。
配置S12的bootloader
在CodeWarrior for S12(X)集成開發(fā)環(huán)境中打開Bootloader_S12工程。bootloader在v5.0和v5.1中測試過了。
如圖2選擇target。
?
圖 2.S12 target選項
通過引腳PP0來決定是啟動bootloader還是用戶應用程序。如果PP0是低電平,就會啟動bootloader,如果PP0是高電平,就會啟動用戶應用程序。如果這個默認配置不好用,用戶可以在Start12.s中重寫這個代碼。
配置S12X的bootloader
在CodeWarrior for S12(X)集成開發(fā)環(huán)境中打開Bootloader_S12X工程。bootloader在v5.0和v5.1中測試過了。
打開文件Config.h并進行如下設置:
設置FLASH_PRESCALER(加載到FCLKDIV寄存器中的值)以讓flash運行頻率在800-1050kHz間,如參考手冊所述。
設置PLL以使總線頻率達到40MHz??梢岳眠@個應用筆記附帶的PLL計算器。
如圖3選擇target。
?
圖 3.S12X target選項
通過引腳PP0來決定是啟動bootloader還是用戶應用程序。如果PP0是低電平,就會啟動bootloader,如果PP0是高電平,就會啟動用戶應用程序。如果這個默認配置不好用,用戶可以在StartS12X.s中重寫這個代碼。
Bootloader指南
編譯工程并通過BDM設備下載bootloader到MCU中去。
打開串口調(diào)試助手。設置波特率為9600,1個起始位,8數(shù)據(jù)位,1數(shù)據(jù)位,流控制Xon/Xoff。
用串行連接線連接PC和開發(fā)板。
讓PP0為低電平,然后重啟MCU。
bootloader就啟動了,然后你會在串口調(diào)試助手中看到如下信息。見圖4。
?
圖 4.最初的界面
?
輸入“a”以擦除flash內(nèi)存。第一次不需要這一步,因為flash已經(jīng)被BDM設備擦除了。
輸入“b”以編程flash。
現(xiàn)在將用到的S-record作為文本文件發(fā)送—見圖5。瀏覽被下載到MCU中的S-record。
為了測試目的,使用附加到這個應用筆記上的示例S-records。S-records必須使用特定的格式。請參考章節(jié)6,“怎么寫用戶應用程序”以及章節(jié)7,“怎么轉(zhuǎn)換將被bootloader下載的S-Record”。
?
圖 5.發(fā)送文本文件
確定對話框和S-record已經(jīng)被下載到MCU中去了。一個星號(*)代表編程成功了一行。見圖6。
?
圖 6.下載用戶應用
怎么寫用戶應用程序
你必須確保用戶應用程序不會碰到bootloader的地址范圍(0xF000-0xFFFF)。
1. 在CodeWarrior for S12(X)集成開發(fā)環(huán)境中創(chuàng)建一個新工程。
2. 打開.prm文件
3. 把segment ROM_C000從原來的0xC000-0xFEFF改成0xC000-0xEFDF。這是因為地址0xF000-0xFFFF會放著bootloader,而0xEFE0-0xEFFF會用作用戶應用的重置向量。
如果使用了中斷:
4. 把segment ROM_4000從原來的0x4000-0x7FFF改成0x4000-0x7F0F。0x7F10-0x7FFF會被用于重定位中斷向量表。
5. 如附件示例應用那樣創(chuàng)建一個中斷向量表,并對應的設置IVBR寄存器。IVBR設置中斷向量表的基地址,這種情況下必須被設置為0x7F。
怎么轉(zhuǎn)換將被bootloader下載的S-Record
bootloader接受使用全局(線性)地址的s-records。所有的records必須被對齊為32字節(jié),長度也必須是32字節(jié)。
1. 打開SRecCvt工具(SRecCvt-GUI.exe)
2. 選擇使用的MC9S12設備(取決你用的是哪個),選擇Memory為Flash,選擇Operation為Convert File。
3. 選擇輸入文件格式為Banked,輸出文件格式為Linear。
4. 設置S-Record Size為32.
5. 瀏覽輸入文件(由CodeWarrior生成的S19文件)并選擇輸出文件。
6. 點擊Convert按鈕。
圖 7.SRecCvt
?
怎么合并用戶應用和bootloader
用戶應用可以被獨立地開發(fā),或說,不帶有bootloader。用戶應用可以被加載進微控制器并可以由BDM設備來直接的調(diào)試。然而,出于生產(chǎn)目的,將用戶應用與bootloader合并到一起是很有價值的,這樣就可以在單個s-record文件中把所有東西都下載進微控制器了。
這是推薦的流程:
1. 打開按照第6章“怎么寫用戶應用程序”中所述那樣創(chuàng)建的用戶應用程序。
2. 把一個用戶應用程序重置向量放到地址0xEFFE,這樣bootloader就可以使用這個向量了??截愐韵氯械絤ain.c中:
extern void near _Startup(void)
typedef void (*near tFunc)(void)
const tFunc rst_vec @0xEFFE = _Startup
3. 移除原先的用戶應用程序重置向量。
在Project.prm文件中注釋掉這行:
//VECTOR 0 _Startup
4. 復制準備好了的bootloader .s19文件到 ..\user_application_project\bin下。比如,s-record文件可以被重命名為bootloader.s19
5. 鏈接這個文件到用戶應用程序中。
在Project.prm的開頭加上這個命令:
HEXFILE bootloader.s19
6. 添加如下命令到文件..\user_application_project\cmd\P&E_Multilink_CyclonePro_Preload.cmd中:
FLASH NOUNSECURE
這個命令能確保燒寫器不會在MCU編程過程中自動地改變0xFF0F處的flash安全字節(jié)為一個不安全狀態(tài)(0xFE),這樣,這個phrase(0xFF08-0XFF0F)就可以被加載定義在bootloader中的值了。如果不使用這個命令,會導致在這個phrase發(fā)生ECC錯誤,芯片會被保護,并且flash會被完全保護。
7. 編譯項目。最終的s-record就準備好被BDM設備下載入微控制器了。 測試
這個bootloaders在這些開發(fā)板上測試成功過:
DEMO9S12PFAME
DEMO9S12HY64
TWR-S12G128
DEMO9S12XSFAME
EVB9S12XEP100
Zip文件的內(nèi)容
所有提到的工程和工具都在這篇應用筆記相關的zip文件中。
Bootloader_S12 — S12微控制器的bootloader工程。
Bootloader_S12X — S12X微控制器的bootloader工程。
Demo_applications — 示例怎么寫用戶應用程序的工程。
Coverted_srecords — 源于Demo_applications的已經(jīng)被SRecCvt工具轉(zhuǎn)換好的S-Records。這些S-Records可以由bootloader下載進MCU中。
Demo_applications_with_linked_bootloader — 包含bootloader的用戶應用程序。
SRecCvt — 用于轉(zhuǎn)換S-Record的工具。
S12XE_PLL_Calculator — 幫助設置PLL模塊的工具。
評論