李光學(xué) 李超 郭燕紅 岳宗帥 宋茜
摘要 本文在基于C6000系列DSP片外Flash的基礎(chǔ)上,針對(duì)嵌入式設(shè)備程序燒寫(xiě)升級(jí)困難的問(wèn)題, 闡述了In-ApplicationProgramming (lAP)的設(shè)計(jì)方案,詳細(xì)介紹了二次引導(dǎo)啟動(dòng)及首次燒寫(xiě)方法,給出關(guān)鍵技術(shù)的代碼實(shí)現(xiàn)。采用IAP很好的實(shí)現(xiàn)了C6000系列DSP的程序燒寫(xiě)及升級(jí),其不用借助外部工具,可靠便捷,通用性好,具有良好的推廣價(jià)值。
【關(guān)鍵詞】C6000 DSP 片外 Flash IAP
1 概述
C6000系列DSP在產(chǎn)品的開(kāi)發(fā)的過(guò)程中,固件程序的升級(jí)更新非常頻繁,若繼續(xù)采用傳統(tǒng)的JTAG或者ICP等燒寫(xiě)方法,過(guò)程繁瑣復(fù)雜,極大地降低了工作效率,所以開(kāi)發(fā)一種便捷,可靠,通用性好的在應(yīng)用燒寫(xiě)In-Application Programming (IAP)方法就顯得格外重要。06000系列DSP不帶片上ROM,脫機(jī)運(yùn)行需要配置外部Flash,不能直接通過(guò)JTAG仿真器來(lái)燒寫(xiě)程序,與一般自帶片上ROM的單片機(jī)系統(tǒng)的IAP開(kāi)發(fā)方法不同,本文針對(duì)上述問(wèn)題,詳細(xì)闡述了C6000系列DSP的IAP實(shí)現(xiàn)原理及整個(gè)引導(dǎo)啟動(dòng)流程。
2 DSP配置分析
DSP系統(tǒng)上電后,在復(fù)位信號(hào)的上升沿處,會(huì)鎖存BOOTMODE引腳信號(hào),借以決定DSP的存儲(chǔ)器映射方式,地址為0處的存儲(chǔ)器類(lèi)型及復(fù)位后芯片的自舉方式。BOOTMODE信號(hào)決定了DSP在復(fù)位期間所做的工作。C6000系列DSP主要有以下3種自舉模式:
(1)不加載(NO BOOT)。DSP直接從地址O處開(kāi)始執(zhí)行程序,地址O處的存儲(chǔ)器可以是DSP內(nèi)部存儲(chǔ)器或者外部RAM,這種方式適用于仿真器系統(tǒng)下的DSP自舉模式。
(2) ROM加載。此種方式適合8位、16位和32位的ROM( -般為Flash)。對(duì)于不同型號(hào)的C6000系列DSP,需注意Flash的大小端模式存儲(chǔ)。
(3)主機(jī)引導(dǎo)(HPI Boot)。CPU在復(fù)位期間,其硬件保持正常工作狀態(tài),外部主機(jī)通過(guò)HPI接口初始化CPU的存儲(chǔ)空間。
復(fù)位結(jié)束后,無(wú)論采用哪種引導(dǎo)方式,DSP芯片都將從地址O處開(kāi)始執(zhí)行程序。因該系列DSP不自帶Flash,本系統(tǒng)以C6701為例,設(shè)計(jì)一個(gè)脫機(jī)運(yùn)行系統(tǒng),外部配置16位Flash,加載方式為16bit ROM加載,即自舉模式2,存儲(chǔ)器映射為MAP1,地址O處為內(nèi)部存儲(chǔ)器,BOOTMODE引腳需配置為Oll01。
3 首次燒寫(xiě)設(shè)計(jì)
06000系列DSP沒(méi)有片上ROM,只有片上RAM,脫機(jī)運(yùn)行需配置外部Flash,第一次代碼燒寫(xiě)需編寫(xiě)專門(mén)的燒寫(xiě)程序來(lái)下載應(yīng)用程序到外部Flash中。這是一種需要加載兩次程序的方法,如圖1所示,首先用CCS編譯軟件打開(kāi)用戶應(yīng)用程序,生成可執(zhí)行文件(0UT),然后用CCS的file/load program加載應(yīng)用程序的OUT文件到DSP片上內(nèi)存空間。再通過(guò)map文件,確定應(yīng)用程序各段數(shù)據(jù)所對(duì)應(yīng)的空間,將程序段和數(shù)據(jù)段這兩段數(shù)據(jù)采用file/data/load命令分別導(dǎo)出成dat格式的文件。然后加載Flash燒寫(xiě)程序,利用file/data/load命令,將生成的dat文件加加載到DSP片上RAM的一段未使用的空間中,然后使用專用燒寫(xiě)程序?qū)?shù)據(jù)燒寫(xiě)到對(duì)應(yīng)的Flash空間中。
其燒寫(xiě)函數(shù)實(shí)現(xiàn)如下所示:
ProgramFlash (PRAM, PFlash,Length);//將程序段燒入FLSAH中
ProgramFlash (DRAM, DFlash, Length);//將數(shù)據(jù)段燒入Flash中
其中函數(shù)的定義是:
void ProgramFlash (int *sourcepoint, Uint32Flashpoint;Uint32 int j)第一個(gè)參數(shù)sourcepoint是待燒寫(xiě)數(shù)據(jù)在片上RAM首地址;第二個(gè)參數(shù)Flashpoint是將被燒寫(xiě)Flash的首地址;最后一個(gè)參數(shù)j是待燒寫(xiě)的32位數(shù)據(jù)的總長(zhǎng)度。
圖2所示為首次燒寫(xiě)過(guò)程中,代碼在片上RAM和片外ROM(Flash)中的變化,首先專用燒寫(xiě)程序通過(guò)自舉模式1啟動(dòng),然后手動(dòng)載入待燒寫(xiě)的用戶應(yīng)用程序,接著運(yùn)行專用燒寫(xiě)程序?qū)⒂脩魬?yīng)用程序燒入片外ROM中,斷電后片上RAM數(shù)據(jù)消失,只有片外ROM的用戶應(yīng)用程序。
4 應(yīng)用程序設(shè)計(jì)
上面介紹了首次如何使用專用燒寫(xiě)程序,借助CCS開(kāi)發(fā)環(huán)境將用戶應(yīng)用程序燒寫(xiě)到片外ROM(Flash)中。為了能讓DSP脫機(jī)運(yùn)行,一個(gè)完整的用戶應(yīng)用程序需包含實(shí)際的應(yīng)用程序數(shù)據(jù)和二次引導(dǎo)代碼數(shù)據(jù)。DSP芯片在復(fù)位時(shí),DMA控制器自動(dòng)將片外ROM(Flash)自起始地址一定大小的程序(二次引導(dǎo)代碼)搬移到片上RAM地址O處,即自引導(dǎo)過(guò)程,如圖中過(guò)程l所示;完成復(fù)位后,CPU從地址O處開(kāi)始執(zhí)行程序,把應(yīng)用程序數(shù)據(jù)從片外ROM搬運(yùn)到片上RAM的某地址處,即二次引導(dǎo)過(guò)程,然后跳轉(zhuǎn)到c int00(mam函數(shù))處運(yùn)行,如圖中過(guò)程3所示,最終完成應(yīng)用程序的啟動(dòng)。
當(dāng)用戶應(yīng)用程序需要更新的時(shí)候,可以采用首次燒寫(xiě)方法進(jìn)行,但比較繁瑣,特別對(duì)于一些正式產(chǎn)品來(lái)說(shuō),那只能返廠更新,本文設(shè)計(jì)的應(yīng)用程序包含在線燒寫(xiě)功能,可以通過(guò)總線接收數(shù)據(jù),燒寫(xiě)進(jìn)入外部Flash中,如圖3 最后一個(gè)步驟所示。
下面將分別從CMD連接命令文件配置,二次引導(dǎo)程序設(shè)計(jì),向量表設(shè)計(jì),在線燒寫(xiě)設(shè)計(jì)詳細(xì)介紹IAP的實(shí)現(xiàn)。因C6000系列DSP的原理都一致,實(shí)例代碼是以C6701硬件平臺(tái)給出。
4.1 CMD連接命令文件配置
CMD文件的作用是實(shí)現(xiàn)程序代碼和數(shù)據(jù)在DSP存儲(chǔ)空間的定位,在編譯連接時(shí)由CCS開(kāi)發(fā)環(huán)境調(diào)用。脫機(jī)啟動(dòng)時(shí),自引導(dǎo)就是將片外ROM的向量表和二次引導(dǎo)程序搬到地址0處執(zhí)行,所以需在CMD文件中明確這兩個(gè)段的運(yùn)行空間,CMD文件如下
-heap Ox400
-stack Ox400
MEMORY
{
vecs:
o=OOOOOOOOh l=00000200h//向量表空間
boot_ load:
0 = 00000200h 1=00000200h//二次引導(dǎo)程序空間
IPRAM:
o=00000400h 1=OOOOeOOOh∥程序段空間
IDRAM:
o=80000000h 1=OOOlOOOOh,/數(shù)據(jù)段空間
)
SEC,TIONS
{
”vectors” >
vecs
//將”vectors”段存儲(chǔ)到vecs空間
”.boot_ load”>
boot_ load//將”boot load”段存儲(chǔ)到boot load空間
cinit
>
IDRAM
.text
>
IPRAM
.stack > IDRAM
.bss
> IDRAM
const >
IDRAM
data > IDRAM
.far
>IDRAM
.switch > IDRAM
.sysmem >
IDRAM
tables >IDRAM
Cl0 > IDRAM
)
其中vectors和boot load段存儲(chǔ)的為向量表和二次引導(dǎo)程序,地址范圍為O-Ox3ff,啟動(dòng)時(shí)被自動(dòng)加載到地址0處并執(zhí)行。
4.2 二次引導(dǎo)程序設(shè)計(jì)
二次引導(dǎo)程序的作用是將應(yīng)用程序數(shù)據(jù)從片外ROM(Flash)搬移到片上RAM存儲(chǔ)器中執(zhí)行。本實(shí)例中將二次引導(dǎo)程序保存在DSP內(nèi)部RAM的Ox200地址開(kāi)始的Ox200字節(jié)空間,由于復(fù)位中斷向量設(shè)置為二次引導(dǎo)程序的入口地址,所以當(dāng)系統(tǒng)上電復(fù)位后,系統(tǒng)轉(zhuǎn)去執(zhí)行二次引導(dǎo)程序,將應(yīng)用程序數(shù)據(jù)段搬移到指定的存儲(chǔ)空間,再跳轉(zhuǎn)到DSP主程序的程序入口處(c int00)執(zhí)行DSP應(yīng)用程序。主要代碼如下:
EMIF GCR
e quOx01800000 11定義EMIF全局控制器GBLCTL
EMIF GCR DATA
equ Ox3779//設(shè)置GBLCTL參數(shù)
EMIF CEl
e quOx01800004∥定義EMIF CEl控制器CEICTL
EMIF_CEl_DATA .equ Oxffffff03 11設(shè)置CEICTL
BOOT SLZE
.equ Ox600 //設(shè)置搬運(yùn)長(zhǎng)度,單位為字節(jié)
sect”boot load”
∥定義”boot load”段
ref_cint00
//引用全局符號(hào)c int00
.global _boot
//定義一個(gè)全局符號(hào)boot,供外部調(diào)用
boot:
mvkl EMIF_GCR,A4
||mvkl EMIF_GCR_DATA, B4
mvkh EMIF_GCR,A4
||mvkh EMIF_GCR_DATA, B4
stw B4, *A4
//設(shè)置GBLCTL參數(shù)
mvkl EMIF CE1.A4
ll mvkl EMIF_CEl_DATA,B4
mvkh EMIF CE1.A4
|| mvkh EMIF_CEl_DATA,B4
stw B4, *A4
+設(shè)置CEICTL參數(shù)
mvkl Ox80000000,A4
|| mvkl Ox01410000,B4
mvkh Ox80000000,A4
ll mvkh Ox01410000,B4
//A4為數(shù)據(jù)段地址指針,B4為Flash地址指針
zero Al
//Al作為計(jì)數(shù)器,清零Al
_boot_loop:
//循環(huán)搬運(yùn)
ldb*B4++,B5
//DSP讀取Flash中的數(shù)據(jù)到寄存器B5
mvkl BOOT_SIZE,B6
//B6為需要拷貝的字節(jié)數(shù)
add l,A1,A1
//Al=Al++
|| mvkh BOOT_SIZE,B6
cmplt Al,B6,BO
∥若AI
NOP
stb B5,*A4++
∥將從Flash讀出數(shù)據(jù)搬運(yùn)到數(shù)據(jù)空間中
[BO]B _boot_loop
//判斷BO值,為1跳轉(zhuǎn)到boot_loop處執(zhí)行
NOP 5
mvkl .s2_c_int00,BO //循環(huán)結(jié)束后,跳轉(zhuǎn)到主函數(shù)開(kāi)始執(zhí)行
mvkh .s2 _c int00, BO //把cint00裝載到BO寄存器
B
.s2 BO
∥跳轉(zhuǎn)到主函數(shù)
NOP 5
4.3 向量表設(shè)計(jì)
中斷向量表vectors保存在DSP內(nèi)部RAM的O地址開(kāi)始的Ox200字節(jié)空間,上電或復(fù)位后,DSP自動(dòng)運(yùn)行復(fù)位中斷。因此,復(fù)位中斷響應(yīng)設(shè)置為二次引導(dǎo)程序的入口地址(boot)。中斷向量表的復(fù)位程序如下:
ref_ boot //調(diào)用boot引導(dǎo)程序
sect”vectors”//定義一個(gè)段
RESET RST://復(fù)位中斷向量
mvkl.S2__ boot,BO
mvkh.S2_ boot,BO//裝載引導(dǎo)程序地址
B.S2 BO∥跳轉(zhuǎn)到引導(dǎo)程序執(zhí)行
4.4 在線燒寫(xiě)程序設(shè)計(jì)
考慮到后續(xù)程序升級(jí)的需求,利用IAP實(shí)現(xiàn)在線升級(jí)功能。在應(yīng)用程序中,有一部分代碼專門(mén)用來(lái)判斷是否需要進(jìn)行軟件更新,若需要更新則進(jìn)入程序燒寫(xiě)流程,若不需要?jiǎng)t繼續(xù)執(zhí)行程序。燒寫(xiě)函數(shù)同首次燒寫(xiě)程序類(lèi)似,燒寫(xiě)時(shí)需要將OUT文件轉(zhuǎn)化為HEX十六進(jìn)制文件,有專門(mén)的工具,這里不再敖述。
5 結(jié)論
本文利用IAP在應(yīng)用編程設(shè)計(jì),解決了C6000系列DSP的首次程序燒寫(xiě)與后續(xù)程序更新升級(jí)的問(wèn)題,其不用借助外部工具,方案可靠便捷,通用性好,本系統(tǒng)通過(guò)多次測(cè)試,性能穩(wěn)定,具有良好的推廣價(jià)值。本文詳細(xì)介紹了首次燒寫(xiě)方法及二次引導(dǎo)設(shè)計(jì),給出關(guān)鍵技術(shù)的代碼實(shí)現(xiàn),脫機(jī)運(yùn)行系統(tǒng)都可以參考。
參考文獻(xiàn)
[1]崔旭濤,楊日杰,何又.TMS320C6701 DSP的程序引導(dǎo)方法及編程實(shí)現(xiàn)[J].電子工程師,2006,32 (09):36-39.
[2]鄭歡歡,穆占杰.基于C6000系列DSP片外Flash自啟動(dòng)方法[J].信息化研究,2011,37 (05): 34-37.
[3]李方慧,王飛,何佩琨等.TMS320C6000系列DSP原理與應(yīng)用[M].北京:電子工業(yè)出版社,2003.
[4]劉偉,魏芹芹,王偉.TMS320C672x系列DSP原理與應(yīng)用[M],北京:北京航空航天大學(xué)出版社,2008.