DSP系統應用中FLASH在線編程方法
(2) 程序代碼塊的長度; (3) 裝入數據的目的起始地址; (4) 存儲器訪問的定時控制參數。 頭信息之間是用戶的程序代碼,程序代碼按低位在前、高位在后的順序排列。程序代碼之后,必須有一個全零字,即0x00000000,用以指示引導程序用戶程序代碼已結束。引導完成后,即從裝入的目的地址處開始執行用戶程序。 4 FLASH在線編程方法 TMS320VC33的調試使用CC for C3x/4X(Code COmposer)集成編程環境,通過JTAG頭仿真用戶板,用戶代碼先放在外部RAM中調試,調試成功后,就可以將用戶程序代碼寫入FLASH了。下面介紹在并行裝入BOOT2方式下的在線編程方法。 SST29LE020與TMS320VC33的連接方式比較簡單,FLASH片選CE引腳直接連接至TMS320VC33的PAGE1引腳;FLASH的輸出使能OE引腳的最簡單的處理方法是采用跳線方式(當向FLASH寫入數據時,接高電平;通常情況下,接地)。 在調試用戶程序時,需根據用戶板的存儲器空間分配制作CMD文件,假設用戶擴展的外部RAM為32bit,起始地址為0x00c00000,長度為32K;外部FLASH起始地址為0x00400000(使用BOOT2方式),長度為256K。其CMD文件如下: MEMORY { INTRAM1:origin=0x00800000,length=0x00008000 INTRAM2:origin=0x00809800,length=0x000007c1 VEC:origin=0x00809fc1,length=0x3f EXTRAM:origin=0x00c00000,length=0x00008000/*32k*/ FLASH:origin=0x00400000,length=0x00040000/*256*/ } SECTIONS {/*用戶程序代碼及初始化數據放在外部RAM*/ .vectors>VEC /*VC33規定的中斷向量地址*/ .text :LOAD=EXTRAM .cinit>EXTRAM .data:RUN=EXTRAM .bss:RUN=INTRAM2 .stack>INTRAM1 } 第一步:在CC下編譯后,裝入用戶.OUT文件,用戶程序代碼即被寫入EXRAM空間。 第二步:依據TMS320VC33的BOOT格式,并根據CC產生的用戶.MAP文件找出程序入口地址、各加載塊的入口地址以及長度,編寫FLASH燒寫文件。示例源程序清單如下: #define MEM_WIDE 0x00000008 /*Flash存儲器寬度*/ #define CG_REGISTER 0x000010c8 /*全局存儲器配置參數*/ #define ENTER_POINT 0x00c00064 /*程序代碼入口地址*/ volatile int *flash_add=(volatile int *)0x400000;/*外部Flash的映射地址*/ #define BOOTORG 0xc00064 /*.MAP文件中的程序入口地址 #define BOOTBLK 3/*.MAP 文件中的加載塊數量*/ #define BOOTSRC1_ADD 0x00809fc1 /*第1個加載塊地址*/ volatile int *bootblk1_add=(volatile int *)0x00809fc1; #define BOOTBLK1_LEN 0x3a /*第1個加載塊長度*/ #define BOOTSRC2_ADD 0x00C00000 /*第2個加載塊地址*/ volatile int *bootblk2_add=(volatile int *)0x00c00000; #define BOOTBLAK2_LEN 0xa3 /*第2個加載塊長度*/ #define BOOTSRC3_ADD 0x00C000a3 /*第3個加載塊地址*/ volatile int *bootblk3_add=(volatile int *)0x00c000a3; #define BOOTBLK3_LEN 0x17 /*第3個加載塊長度*/ //////////////////////////////////////////// unsigned int flashaddnum,bytenum; /*定義Flash地址及頁面字節數變量*/ void waite(int ms)/****軟件 1ms子程序****/ {…………;} void sdp_flash()/******軟件數據保護子程序*********/ {flash_add[0x5555]=0xaa;/*3字節芯片SDP指令*/ flash_add[0x2aaa]=0x55; flash_add[0x5555]=0xa0; } void era_flash()/******擦除芯片子程序*********/ {flash_add[0x5555]=0xaa;/*6字節芯片擦除指令*/ flash_add[0x2aaa]=0x55; flash_add[0x5555]=0x80; flash_add[0x5555]=0xaa; flash_add[0x2aaa]=0x55; flash_add[0x5555]=0x10; waite(20); /*20ms等待芯片擦除完成*/ } void write_flash(int bootdata)/***寫一個int型數據***/ {unsigned int i; for(i=0;i<3;i++) /*一個int型數分成四個字節寫入*/ {if(bytenum==0) /*如果是頁面第1個字節,先寫SDP指令*/ {sdp_flash();} flash_add[flashaddnum]=bootdata; /*向Flash地址寫一個字節*/ flashaddnum++; /*Flash地址加1*/ bytenum++; /*頁面字節加1*/ if(bytenum>127) /*一個頁面寫完,頁面字節置0,等待11ms*/ {bytenum=0;waite(11);} bootdata>>=8; /*待寫數據右移8位*/ } } void main() /***主程序***/ {unsigned int i,j,lenth; bytenum=0;flashaddnum=0; /*Flash地址及頁面字節數置*/ waite(1); /*等待1ms*/ era_flash(); /*擦除Flash芯片*/ write_flash(MEM_WIDE); /*寫外部Flash存儲器寬度*/ write_flash(CG_REGISTER); /*寫寄存器配置參數*/ write_flash(1); /*第1個boot的數據長度為1*/ write_flash()ENTER_POINT; /*寫入boot的目的地址*/ write_flash(0); /*第1個boot的數據*/ for(i=0;i











評論