祖文祥,丁勁濤
(四川長(zhǎng)虹電源有限責(zé)任公司,四川 綿陽(yáng) 621000)
數(shù)字信號(hào)處理器(DSP)擁有強(qiáng)大的運(yùn)算能力和豐富的外設(shè),使其成為控制領(lǐng)域的首選控制芯片。當(dāng)系統(tǒng)需要進(jìn)行軟件升級(jí)時(shí),需要將程序代碼重新下載到DSP的FLASH中。傳統(tǒng)的升級(jí)方式是將產(chǎn)品從系統(tǒng)上拆卸下來(lái),打開(kāi)產(chǎn)品蓋板,連上JTAG下載器進(jìn)行軟件燒寫(xiě)升級(jí)。使用JTAG下載器進(jìn)行軟件升級(jí)雖然實(shí)現(xiàn)簡(jiǎn)單,但存在以下局限性[1]:
(1)由于安裝位置的限制,有時(shí)裝在系統(tǒng)上的產(chǎn)品較難拆卸;
(2)取下產(chǎn)品后,還需要打開(kāi)產(chǎn)品殼蓋才能實(shí)施下載,操作非常不便。
為了減少產(chǎn)品的維護(hù)成本和提高效率,DSP芯片在線加載功能的實(shí)現(xiàn)顯得尤為重要。DSP在線加載是指完全脫離下載器,通過(guò)通信總線實(shí)現(xiàn)對(duì)DSP片內(nèi)FLASH的擦、寫(xiě),完成軟件升級(jí)。在線加載利用產(chǎn)品原有的通信接口,無(wú)需添加額外的接口設(shè)備,具有方便靈活等特點(diǎn),改善了傳統(tǒng)DSP程序下載的局限性。
TMS320F2812存儲(chǔ)器空間定義如下[1]。
(1)片內(nèi)RAM(18K×16)。5個(gè)存儲(chǔ)塊組成,H0(8K×16,0x3F8000~ 0x3F9FFF)、L0和 L1(2×4K×16,0x008000~0x009FFF,受保護(hù),不可用)、M0和 M1(2×1K×16,0x000040 ~ 0x0003FF)。
(2)片內(nèi)OTP(1K×16 ROM)。0x3D7800~0x 3D7BFF,TI保留空間(1K×16)。
(3)Boot ROM(4K×16 ROM)。0x3FF000~0x3FFFFF,TI限制,不可用。其中,0x3FFC00~0x3FFFBF存放TI公司的引導(dǎo)裝載程序,0x3FFFC0~0x3FFFFF存放復(fù)位向量。
(4)片內(nèi)Flash(128K×16 Flash)。①J~B區(qū):0x3D8000~0x3F5FFF,120K×16,用戶使用空間;②A區(qū):0x3F6000~0x3F7FF5,16K×16,0x3F7FF6~0x3F7FF7入口地址;③密碼區(qū):0x3F7FF8~0x3F7FFF,8×16,CSM安全模塊,保密需要時(shí)使用。
系統(tǒng)上電復(fù)位后,復(fù)位向量指向0x3FFFC0,其中是一條跳轉(zhuǎn)指令。如果MP/MC=0,地址跳轉(zhuǎn)至0x3FFC00運(yùn)行TI固化的引導(dǎo)裝載程序(簡(jiǎn)稱一級(jí)Boot)。引導(dǎo)裝載程序是根據(jù)GPIO引腳狀態(tài)決定啟動(dòng)類型,見(jiàn)表1[2]。
表1 DSP上電啟動(dòng)類型
本系統(tǒng)選擇的是Flash引導(dǎo)模式,所以一級(jí)Boot引導(dǎo)至地址0x3F7FF6,從中取出一條跳轉(zhuǎn)指令,跳轉(zhuǎn)到至程序初始化入口地址(DSP281x_CodeStartBranch.asm中的_c_int00指定該入口地址,在編譯時(shí)編譯器會(huì)自動(dòng)生成入口地址,具體可通過(guò)map文件中的ENTRY POINT SYMBOL:"_c_int00"address:XXXXXXXX查詢),然后從主函數(shù)開(kāi)始執(zhí)行。
為了實(shí)現(xiàn)在線加載功能,必須有一段引導(dǎo)程序能夠根據(jù)需要引導(dǎo)至加載程序或者APP程序,該引導(dǎo)程序簡(jiǎn)稱二級(jí)Boot。這里不對(duì)上位機(jī)的開(kāi)發(fā)進(jìn)行說(shuō)明,二級(jí)Boot的具體設(shè)計(jì)見(jiàn)第4章。
分為3個(gè)程序模塊,分別是二級(jí)Boot、加載程序和APP程序[2]。經(jīng)過(guò)一級(jí)Boot后,進(jìn)入二級(jí)Boot。在二級(jí)Boot中運(yùn)行程序,根據(jù)設(shè)定的條件跳轉(zhuǎn)至加載程序或者APP程序。加載程序通過(guò)通信總線獲取APP目標(biāo)代碼,將其寫(xiě)入到FLASH區(qū)段,等待產(chǎn)品下電。APP目標(biāo)代碼是采用TI公司的Code Composer Studio(5.0及以上版本)開(kāi)發(fā)環(huán)境直接編譯生成.bin文件(對(duì)于5.0以下版本則只能生成.out文件,但可通過(guò)轉(zhuǎn)換工具如HEX2000.exe轉(zhuǎn)換為.bin文件)。
二級(jí)Boot可根據(jù)不同的在線加載方法設(shè)計(jì)程序[3]。運(yùn)行一級(jí)Boot后,地址跳至二級(jí)Boot程序的入口地址,通過(guò)該入口地址進(jìn)入運(yùn)行二級(jí)Boot程序。該入口地址的獲取與二級(jí)Boot程序存放的Flash的位置有關(guān),通過(guò)在CMD文件中配置.text確定存放的Flash區(qū)段(需手動(dòng)配置),編譯時(shí)自動(dòng)生成進(jìn)入該區(qū)段的入口地址,并自動(dòng)填寫(xiě)至0x3F7FF6地址中。
二級(jí)Boot跳轉(zhuǎn)指令分別如下。
(1)跳至加載程序
(2)跳至APP程序
在加載程序的CMD文件中手動(dòng)配置.text(SECTIONS段內(nèi)的所有Flash空間定義都改為所占用的Flash區(qū)段),編譯時(shí)自動(dòng)生成進(jìn)入該區(qū)段的入口地址0x3f6d2d(該地址不固定,每次編譯可能會(huì)變化),將該地址手動(dòng)填寫(xiě)至二級(jí)Boot程序中的跳轉(zhuǎn)指令中,作為跳轉(zhuǎn)至加載程序的入口地址。
加載程序接收到APP目標(biāo)碼后,寫(xiě)入到指定Flash的空間[4]。寫(xiě)入的起始地址從0x3E4000開(kāi)始(該地址在CMD文件中配置,例如APP只占用F~C區(qū)段,起始地址就為0x3E4000)。執(zhí)行過(guò)程為:擦除該區(qū)段→接收一幀目標(biāo)碼→判斷是否超過(guò)該區(qū)段,超過(guò)就擦除下一區(qū)段,直到能夠容納該目標(biāo)碼長(zhǎng)度為止→寫(xiě)入目標(biāo)碼→接收下一幀目標(biāo)碼。寫(xiě)入完成后,等待手動(dòng)下電。
對(duì)于APP程序的入口地址,在接收到第一幀目標(biāo)碼中獲取后就寫(xiě)入到指定空間[5],本案例是0x3F3FF0-0x3F3FFF。
在APP程序的CMD文件中手動(dòng)配置.text(SECTIONS段內(nèi)的所有Flash空間定義都改為所占用的Flash區(qū)段),編譯時(shí)自動(dòng)生成進(jìn)入該區(qū)段的入口地址(該地址不固定,每次編譯可能會(huì)變化)。該地址通過(guò)通信總線下發(fā)至加載程序,寫(xiě)入至0x3F3FF0地址。
在代碼編寫(xiě)時(shí)分別創(chuàng)建3個(gè)工程,分別對(duì)應(yīng)BOOT程序、加載程序和APP程序。3個(gè)工程中的CMD文件做相應(yīng)的配置修改,代碼編寫(xiě)并通過(guò)編譯后,按照以下操作灌裝至DSP中。
(1)打開(kāi)Code Composer Studio,導(dǎo)入Boot程序工程和加載程序工程;
(2)分別在兩個(gè)工程的debug屬性中選擇Flash setting,在其中選擇需要操作的Flash區(qū)段;
(3)分別灌裝兩個(gè)程序;
(4)退出CCS,利用上位機(jī)通過(guò)通信向DSP下載APP目標(biāo)碼,第一幀包含APP入口地址;通過(guò)JTAG將二級(jí)Boot和加載程序灌裝到DSP中,然后通過(guò)配套的上位機(jī)將APP程序目標(biāo)代碼通過(guò)通信總線下發(fā)至DSP。圖1為灌裝BOOT程序和加載程序界面,圖2為灌裝APP程序界面。
圖1 灌裝Boot程序和加載程序
圖2 上位機(jī)通過(guò)1394通信灌裝APP程序