應用于DM648的FLASH自動加載實現方法
摘要:為實現DSP嵌入式系統的應用程序自動加載功能,提出了基于TI公司的TMS320DM648的NOR Flash自動加載實現方法。首先對啟動過程進行了分析,給出了用戶加載程序的編寫方法。在此基礎上,根據公共目標文件格式和應用鏡像腳本兩種文件格式的說明,設計出公共目標文件格式到應用鏡像腳本轉換程序,生成可用于FLASH燒寫的文件。最后在TMS320DM648核心板上實現了在CCS環境下對Flah編程和程序自動加載,證明該方法有效可行。
本文引用地址:http://www.j9360.com/article/201609/305059.htmTMS320DM648(以下簡稱DM648)屬于TI公司的DaVinci系列DSP芯片,主要應用于智能視頻監控、網絡視頻服務器、機器視覺等領域。DM648采用C64x+內核,主頻最高可達1.1GHz,并且代碼與C64x完全兼容。DM648從FLASH中加載引導程序的方法和之前C6x和C5000系列DSP芯片有很大的不同。第一,之前C6x和C5000系列DSP都是在上電后直接將FLASH的前1K空間的用戶引導程序復制到片內內存運行,程序代碼量不能超過1KB,程序功能有限,并且只能用匯編語言實現,編寫難度大且可讀性較差,而針對DM648,用戶引導程序可以直接使用C語言實現,代碼量不受1KB限制。第二,C6x和C5000系列DSP的應用程序使用CCS環境編譯,生成的.out格式可執行文件需要使用TI提供的轉換程序將格式轉換成后綴為.hex的二進制文件才可以實現燒寫。而DM648需要將.out格式可執行文件轉換為.ais格式后才可以燒寫到FLASH中,使用者編寫程序實現文件格式的轉換。
1 FLASH啟動流程分析
DM648有多種啟動方式,本次設計采用從外部存儲器接門(EMIF)上的NOR FLASH啟動。硬件電路需要在芯片復位前將DM648引腳BOOTMODE[0:3]的電平狀態配置為0100,FASTBOOT引腳配置為高電平,由引腳外接1K電阻上拉到3.3 V來實現。DM648的其他啟動方式及配置方法,可以參考文獻。
復位之后,DM648從內部的ROM空間開始運行程序,地址為0x00800000。這部分程序稱為ROM Boot Loader(簡稱RBL),是TI公司直接燒寫到內部ROM的,用戶無法更改。RBL首先修改DSP內部鎖相環電路倍頻系數為20,即CPU的工作時鐘為外部輸入時鐘頻率的20倍。這樣可以縮短程序運行的時間;RBL讀取EMIFA接口中地址為0xA0000000的代碼和數據,該地址為NOR FLASH的第一扇區起始地址,存放在這個地址空間的代碼稱為用戶復制程序UBL,并且UBL程序必須以AIS格式來存放。RBL會執行AIS命令字,將UBL程序各個數據段都復制到RAM中的運行空間,并將控制權轉到UBL。UBL首先完成DM648的初始化工作,配置EMIF接口、DDR2控制器和UART接口,并搜索應用程序的AIS鏡像文件,UBL解析AIS鏡像文件,按照鏡像文件的地址將程序復制到運行地址空間中。之后,UBL完成硬件環境的初步配置,跳轉到應用程序開始運行。使用UBL進行二次引導可以將引導程序與應用程序功能相脫離,應用程序可以專注于功能的實現,并且同一個UBL程序可以適用于不同的應用程序。實現DM648芯片自啟動的操作步驟如圖1所示,以下將分別介紹用戶程序和格式轉換程序的編寫方法,最后介紹一個完整的自動加載實現過程。

2 用戶引導程序設計
用戶引導程序UBL完成的主要工作是解析應用程序AIS鏡像,并將各段數據復制到RAM中對應的運行地址。使用C語言在CCS環境下編寫。內存分配方面本次設計的UBL程序運行空間在16K字節之內,因此可以獨立定義其運行空間為片內的RAM空間的最初16K字節,即在UBL工程的CMD文件中增加如下代碼,程序分配到RAMUBL空間中運行。
MEMORY
{
RAMUBL org=0x00A00000 len=0x00004000
}
需要注意的是應用程序中需要進行初始化的段不可以分配到上述空間運行,否則UBL在復制應用程序的過程中就會覆蓋UBL運行中的程序或者數據,從而造成UBL運行崩潰。
UBL程序的工作流程為:
1)DEVICE_UARTOInit()初始化串行接口,配置串口通訊的速率、數據位、校驗位等內容,在執行下述每個步驟中通過串行接口將調試信息發送給PC機,便于觀察啟動過程和確定故障原因。
2)DEVICE_EMIFInit()配置EMIF寄存器,使DSP可以訪問EMIF接口外接的FLASH芯片。本次設計采用16bit異步模式來訪問外部NOR FLASH芯片。
3)DEVICE_DDR2Init()配置DDR2控制器寄存器,使得DSP可以訪問DDR2寄存器,實際工程中數據需要復制到DDR2 RAM存儲器中。此時需要配置DDR2的總線寬度和讀寫時間參數等寄存器。
4)從FLASH芯片中保存的UBL鏡像文件結束的下一個扇區開始查找應用程序的AIS鏡像文件魔幻數。當一個有效的魔幻數被找到后,UBL會順序讀取之后的32位AIS命令并執行,將所有數據段復制到目的地址中。之后,UBL程序將Jump_Close指令的數據部分,即應用程序入口地址保存到變量gEntryPoint中。
5)UBL程序會完成硬件環境的初步配置,包括配置鎖相環電路的倍頻系數從而修改DM648的工作頻率,配置DM648的PSC寄存器關閉不使用的片上外設降低芯片功率,配置引腳復用功能滿足應用程序要求等。之后跳轉到應用程序的入門地址gEntryPoint運行程序。
3 燒寫文件格式轉換程序設計
本次設計采用FLASH快速啟動方式時,RBL只能解析AIS格式的鏡像文件,而UBL和應用程序都在CCS環境中使用C語言實現,二者獨立編譯鏈接后會生成格式為COFF(公共目標文件格式)的.out文件。因此需要編寫程序實現COFF文件到AIS文件的轉換,本次設計中整個轉換過程使用C語言在VC6.0環境實現。
3.1 COFF文件格式分析
COFF文件以段的形式將程序中的代碼和數據進行組織,默認情況下COFF文件包含3個段:.text為可執行代碼段;.data為初始化數據段;.bss為未初始化數據段。一個完整的COFF文件如圖2所示,包括以下幾部分,依次為文件頭、可選文件頭、段信息表、段數據、重定位信息、行號入口表、符號表和字符串表。

評論