李光學 李超 郭燕紅 岳宗帥 宋茜



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