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