新聞中心

DSP入門(mén)導(dǎo)讀(5)

——
作者: 時(shí)間:2007-10-29 來(lái)源:嵌入式技術(shù)網(wǎng) 收藏
并行FLASH引導(dǎo)的一點(diǎn)經(jīng)驗(yàn)-阿哲

最近BBS上關(guān)于FLASH和BOOT的討論很活躍,我也多次來(lái)此請(qǐng)教。前幾天自制的板引導(dǎo)成功,早就打算寫(xiě)寫(xiě)這方面的東西。我用的 是5416,以其為核心,做了一個(gè)相對(duì)獨(dú)立的子系統(tǒng)(硬件、軟件、算法),目前都已基本做好。下面把在FLASH引導(dǎo)方面做的工作向大家匯報(bào)一下,希望能對(duì)大家有所幫助。本人經(jīng)驗(yàn)和文筆都有限,寫(xiě)的不好請(qǐng)大家諒解。 硬件環(huán)境: 
:TMS320VC5416PGE160 
FLASH:SST39VF400A-70-4C-EK 都是貼片的,F(xiàn)LASH映射在DSP數(shù)據(jù)空間的0x8000-0xFFFF 
軟件環(huán)境: CCS v2.12.01 
主程序(要燒入FLASH的程序): DEBUG版,程序占用空間0x28000-0x2FFFF(片內(nèi)SARAM),中斷向量表在0x0080-0x00FF(片內(nèi)DARAM),數(shù)據(jù)空間使用0x0100-0x7FFF(片內(nèi)DARAM)。因?yàn)镕LASH是貼片的,所以需要自己編一個(gè)數(shù)據(jù)搬移程序,把要主程序搬移到FLASH中。在寫(xiě)入FLASH數(shù)據(jù)時(shí),還應(yīng)寫(xiě)入引導(dǎo)表的格式數(shù)據(jù)。最后在數(shù)據(jù)空間的0xFFFF處寫(xiě)入引導(dǎo)表的起始地址(這里為0x8000)。 
搬移程序: DEBUG版,程序空間0x38000-0x3FFFF(片內(nèi)SARAM),中斷向量表在0x7800-0x78FF(片內(nèi)DARAM),數(shù)據(jù)空間使用 0x5000-0x77FF(片內(nèi)DARAM)。 搬移程序不能使用與主程序的程序空間和中斷向量表重合的物理空間,以免覆蓋。燒寫(xiě)時(shí),同時(shí)打開(kāi)主程序和搬移程序的PROJECT,先LOAD主程序,再LOAD搬移程序,然后執(zhí)行搬移程序,燒寫(xiě)OK! 附:搬移程序(僅供參考) 
volatile unsigned int *pTemp=(unsigned int *)0x7e00; unsigned int iFlashAddr; 
int iLoop; /* 在引導(dǎo)表頭存放并行引導(dǎo)關(guān)鍵字 */ 
iFlashAddr=0x8000; 
WriteFlash(iFlashAddr,0x10aa); 
iFlashAddr++; /* 初始化SWWSR值 */ 
WriteFlash(iFlashAddr,0x7e00); 
iFlashAddr++; /* 初始化BSCR值 */ 
WriteFlash(iFlashAddr,0x8006); 
iFlashAddr++; /* 程序執(zhí)行的入口地址 */ 
WriteFlash(iFlashAddr,0x0002); 
iFlashAddr++; 
WriteFlash(iFlashAddr,0x8085); 
iFlashAddr++; /* 程序長(zhǎng)度 */ 
WriteFlash(iFlashAddr,0x7f00); 
iFlashAddr++; /* 程序要裝載到的地址 */ 
WriteFlash(iFlashAddr,0x0002); 
iFlashAddr++; 
WriteFlash(iFlashAddr,0x8000); 
iFlashAddr++; 
for (iLoop=0;iLoop<0x7f00;iLoop++) 
{ /* 從程序空間讀數(shù)據(jù),放到暫存單元 */ 
asm(" pshm al"); 
asm(" pshm ah"); 
asm(" rsbx cpl"); 
asm(" ld #00fch,dp"); 
asm(" stm #0000h, ah"); 
asm(" MVDM _iLoop, al"); 
asm(" add #2800h,4,a"); 
asm(" reada 0h"); 
asm(" popm ah"); 
asm(" popm al"); 
asm(" ssbx cpl"); /* 把暫存單元內(nèi)容寫(xiě)入FLASH */ 
WriteFlash(iFlashAddr,*pTemp); 
iFlashAddr++; } /* 中斷向量表長(zhǎng)度 */ 
WriteFlash(iFlashAddr,0x0080); 
iFlashAddr++; /* 中斷向量表裝載地址 */ 
WriteFlash(iFlashAddr,0x0000); 
iFlashAddr++; 
WriteFlash(iFlashAddr,0x0080); 
iFlashAddr++; 
for (iLoop=0;iLoop<0x0080;iLoop++) { /* 從程序空間讀數(shù)據(jù),放到暫存單元 */ 
asm(" pshm al"); 
asm(" pshm ah"); 
asm(" rsbx cpl"); 
asm(" ld #00fch,dp"); 
asm(" stm #0000h, ah"); 
asm(" MVDM _iLoop, al"); 
asm(" add #0080h,0,a"); 
asm(" reada 0h"); 
asm(" popm ah"); 
asm(" popm al"); 
asm(" ssbx cpl"); /* 把暫存單元內(nèi)容寫(xiě)入FLASH */ 
WriteFlash(iFlashAddr,*pTemp); 
iFlashAddr++; 
} /* 寫(xiě)入引導(dǎo)表結(jié)束標(biāo)志 */ 
WriteFlash(iFlashAddr,0x0000); 
iFlashAddr++; 
WriteFlash(iFlashAddr,0x0000); /* 在數(shù)據(jù)空間的0xFFFF寫(xiě)入引導(dǎo)表起始地址 */ 
iFlashAddr=0xffff; 
WriteFlash(iFlashAddr,0x8000);   




關(guān)于LF2407A的FLASH燒寫(xiě)問(wèn)題的幾點(diǎn)說(shuō)明:


TI現(xiàn)在關(guān)于LF24x寫(xiě)入FLASH的工具最新為c2000flashprogsw_v112??梢灾С諰F2407、LF2407a、 LF2401及相關(guān)的LF240x系列。建議使用此版本。在http: //focus.ti.com/docs/tool/toolfolder.jhtml?PartNumber=C24XSOFTWARE上可以下載到這個(gè)工具。我們仿真器自帶的光盤(pán)中也有此燒寫(xiě)程序。 在使用這個(gè)工具時(shí)注意: 
一,先解壓,再執(zhí)行setup.exe。 
二、進(jìn)入cc中,在tools圖標(biāo)下有燒寫(xiě)工具; 
1、關(guān)于FLASH時(shí)鐘的選擇,此燒寫(xiě)工具默認(rèn)最高頻率進(jìn)行FLASH的操作。根據(jù)目標(biāo)系統(tǒng)的工作主頻重新要進(jìn)行PLL設(shè)置。方法:先在advance options下面的View Config file中修改倍頻。存盤(pán)后,在相應(yīng)的目錄下(tic2xxalgos相應(yīng)目錄)運(yùn)行buildall.bat就可以完成修改了。再進(jìn)行相應(yīng)的操作即可。 
2、若是你所選的頻率不是最高頻率,還需要設(shè)定你自已的timings.xx來(lái)代替系統(tǒng)默認(rèn)的最高頻率的timings.xx。例如 LF2407a的默認(rèn)文件是timings.40。Timings.xx可以利用includetimings.xls的excel工作表來(lái)生成。然后在advance options下面的View Config file中修改相應(yīng)的位置。存盤(pán)后,在相應(yīng)的目錄下運(yùn)行buildall.bat就可以完成修改了。 
3、對(duì)于TMS320LF240XA系列,還要注意:由于這些DSP的FLASH具有加密功能,加密地址為程序空間的0x40-0X43H,程序禁止寫(xiě)入此空間,如果寫(xiě)了,此空間的數(shù)據(jù)被認(rèn)為是加密位,斷電后進(jìn)入保護(hù)FLASH狀態(tài),使FLASH不可重新操作,從而使DSP報(bào)廢,燒寫(xiě)完畢后一定要進(jìn)行Program passwords的操作,如果不做加密操作就默認(rèn)最后一次寫(xiě)入加密位的數(shù)據(jù)作為密碼。 
4、2407A不能用DOS下的燒寫(xiě)軟件燒寫(xiě),必須用c2000flashprogsw_v112軟件燒寫(xiě); 
5、建議如下: 
   1)、一般調(diào)試時(shí),在RAM中進(jìn)行; 
   2)、程序燒寫(xiě)時(shí),避開(kāi)程序空間0x40-0x43H加密區(qū),程序最好小于32k; 
   3)、每次程序燒寫(xiě)完后,將word0,word1,word2,word3分別輸入自己的密碼,再點(diǎn)擊 Program password,如果加密成功,提示Program is arrayed,如果0x40-0x43h中寫(xiě)入的是ffff,認(rèn)為處于調(diào)試狀態(tài),flash不會(huì)加密; 
   4)、斷電后,下次重新燒寫(xiě)時(shí)需要往word0~word3輸入已設(shè)的密碼,再u(mài)nlock,成功后可以重新燒寫(xiě)了; 
6、VCPP管腳接在+5V上,是應(yīng)直接接的,中間不要加電阻。 
7、具體事宜請(qǐng)閱讀相應(yīng)目錄下的readme1,readme2幫助文件。 
8.注意*.cmd文件的編寫(xiě)時(shí)應(yīng)該避開(kāi)40-43H單元,好多客戶由于沒(méi)有注意到這里而把FALSH加密。   



如何設(shè)置硬件斷點(diǎn)? 

在profiler ->profile point -> break point   c54x的外部中斷是電平響應(yīng)還是沿響應(yīng)? 是沿響應(yīng),準(zhǔn)確的說(shuō),它要檢測(cè)到100(一個(gè)clk的高和兩個(gè)clk的低)的變化才可以。  



參考程序,里面好象都要 disable wachdog,不知道為什么? 

watchdog是一個(gè)計(jì)數(shù)器,溢出時(shí)會(huì)復(fù)位你的DSP,不disable的話,你的系統(tǒng)會(huì)動(dòng)不動(dòng)就reset。   



時(shí)鐘電路選擇原則?
1,系統(tǒng)中要求多個(gè)不同頻率的時(shí)鐘信號(hào)時(shí),首選可編程時(shí)鐘芯片; 
2,單一時(shí)鐘信號(hào)時(shí),選擇晶體時(shí)鐘電路; 
3,多個(gè)同頻時(shí)鐘信號(hào)時(shí),選擇晶振; 
4,盡量使用DSP片內(nèi)的PLL,降低片外時(shí)鐘頻率,提高系統(tǒng)的穩(wěn)定性; 
5,C6000、C5510、C5409A、C5416、C5420、C5421和C5441等DSP片內(nèi)無(wú)振蕩電路,不能用晶體時(shí)鐘電路; 
6,VC5401、VC5402、VC5409和F281x等DSP時(shí)鐘信號(hào)的電平為1.8V,建議采用晶體時(shí)鐘電路   


C程序的代碼和數(shù)據(jù)如何定位 

1,系統(tǒng)定義: 
.cinit  存放C程序中的變量初值和常量; 
.const 存放C程序中的字符常量、浮點(diǎn)常量和用const聲明的常量; 
.switch 存放C程序中switch語(yǔ)句的跳針表; 
.text  存放C程序的代碼; 
.bss  為C程序中的全局和靜態(tài)變量保留存儲(chǔ)空間; 
.far  為C程序中用far聲明的全局和靜態(tài)變量保留空間; 
.stack 為C程序系統(tǒng)堆棧保留存儲(chǔ)空間,用于保存返回地址、函數(shù)間的參數(shù)傳遞、存儲(chǔ)局部變量和保存中間結(jié)果; 
.sysmem 用于C程序中malloc、calloc和realloc函數(shù)動(dòng)態(tài)分配存儲(chǔ)空間 
2,用戶定義: 
#pragma CODE_SECTION (symbol, "section name"); 
#pragma DATA_SECTION (symbol, "section name")   




cmd文件?

由3部分組成: 
1)輸入/輸出定義:.obj文件:鏈接器要鏈接的目標(biāo)文件;.lib文件:鏈接器要鏈接的庫(kù)文件;.map文件:鏈接器生成的交叉索引文件;.out文件:鏈接器生成的可執(zhí)行代碼;鏈接器選項(xiàng) 
2)MEMORY命令:描述系統(tǒng)實(shí)際的硬件資源 
3)SECTIONS命令:描述“段”如何定位   


為什么要設(shè)計(jì)CSL? 

1,DSP片上外設(shè)種類(lèi)及其應(yīng)用日趨復(fù)雜 
2,提供一組標(biāo)準(zhǔn)的方法用于訪問(wèn)和控制片上外設(shè) 
3,免除用戶編寫(xiě)配置和控制片上外設(shè)所必需的定義和代碼   



什么是CSL? 
1,用于配置、控制和管理DSP片上外設(shè) 
2,已為C6000和C5000系列DSP設(shè)計(jì)了各自的CSL庫(kù) 
3,CSL庫(kù)函數(shù)大多數(shù)是用C語(yǔ)言編寫(xiě)的,并已對(duì)代碼的大小和速度進(jìn)行了優(yōu)化 
4,CSL庫(kù)是可裁剪的:即只有被使用的CSL模塊才會(huì)包含進(jìn)應(yīng)用程序中 
5,CSL庫(kù)是可擴(kuò)展的:每個(gè)片上外設(shè)的API相互獨(dú)立,增加新的API,對(duì)其他片上外設(shè)沒(méi)有影響   



CSL的特點(diǎn) 

1,片上外設(shè)編程的標(biāo)準(zhǔn)協(xié)議:定義一組標(biāo)準(zhǔn)的APIs:函數(shù)、數(shù)據(jù)類(lèi)型、宏; 
2,對(duì)硬件進(jìn)行抽象,提取符號(hào)化的片上外設(shè)描述:定義一組宏,用于訪問(wèn)和建立寄存器及其域值 
3,基本的資源管理:對(duì)多資源的片上外設(shè)進(jìn)行管理; 
4,已集成到DSP/BIOS中:通過(guò)圖形用戶接口GUI對(duì)CSL進(jìn)行配置; 
5,使片上外設(shè)容易使用:縮短開(kāi)發(fā)時(shí)間,增加可移植.   



為什么需要電平變換? 

1)DSP系統(tǒng)中難免存在5V/3.3V混合供電現(xiàn)象; 
2)I/O為3.3V供電的DSP,其輸入信號(hào)電平不允許超過(guò)電源電壓3.3V; 
3)5V器件輸出信號(hào)高電平可達(dá)4.4V; 
4)長(zhǎng)時(shí)間超常工作會(huì)損壞DSP器件; 
5)輸出信號(hào)電平一般無(wú)需變換   




電平變換的方法?

1,總線收發(fā)器(Bus Transceiver): 
常用器件: SN74LVTH245A(8位)、SN74LVTH16245A(16位) 
特點(diǎn):3.3V供電,需進(jìn)行方向控制, 
延遲:3.5ns,驅(qū)動(dòng):-32/64mA, 
輸入容限:5V 
應(yīng)用:數(shù)據(jù)、地址和控制總線的驅(qū)動(dòng) 
2,總線開(kāi)關(guān)(Bus Switch) 
常用器件:SN74CBTD3384(10位)、SN74CBTD16210(20位) 
特點(diǎn):5V供電,無(wú)需方向控制 
延遲:0.25ns,驅(qū)動(dòng)能力不增加 
應(yīng)用:適用于信號(hào)方向靈活、且負(fù)載單一的應(yīng)用,如McBSP等外設(shè)信號(hào)的電平變換 
3,2選1切換器(1 of 2 Multiplexer) 
常用器件:SN74CBT3257(4位)、SN74CBT16292(12位) 
特點(diǎn):實(shí)現(xiàn)2選1,5V供電,無(wú)需方向控制 
延遲:0.25ns,驅(qū)動(dòng)能力不增加 
應(yīng)用:適用于多路切換信號(hào)、且要進(jìn)行電平變換的應(yīng)用,如雙路復(fù)用的McBSP 
4,CPLD 
3.3V供電,但輸入容限為5V,并且延遲較大:>7ns,適用于少量的對(duì)延遲要求不高的輸入信號(hào) 
5,電阻分壓 
10KΩ和20KΩ串聯(lián)分壓,5V


關(guān)鍵詞: DSP

評(píng)論


相關(guān)推薦

技術(shù)專(zhuān)區(qū)

關(guān)閉