《電子技術應用》
您所在的位置:首頁 > 嵌入式技术 > 业界动态 > DSP系统应用中FLASH在线编程方法

DSP系统应用中FLASH在线编程方法

2008-10-15
作者:黎明也

  摘 要: 介紹了在TI公司TMS320VC33 DSP應用系統中,通過JTAG口對DSP外部FLASH存儲器實現在線編程" title="在線編程">在線編程的方法,給出了示例源程序,完成了DSP系統加電后的自動裝載運行。
  關鍵詞: DSP JTAG FLASH存儲器 在線編程 Bootload


  FLASH存儲器是一種高密度、非易失性的電可擦寫存儲器,存儲量大,使用方便,適用于低功耗、高性能的系統。在高速DSP應用系統中,為了充分發揮DSP性能,在加電后需要將用戶代碼裝載到高速RAM存儲器中運行。下面介紹SST29LE020型 FLASH存儲器的燒寫" title="燒寫">燒寫方法,以及如何實現TMS320VC33上電后用戶程序的自舉引導(Bootload)。
1 SST29LE020的特點及操作
  SST29LE020是SST公司生產的一種256K×8 FLASH, 它有10萬次以上的擦寫壽命,其內部分為2048個頁面,每個頁面128字節,頁面寫周期為5ms。如果頁面中一個數據需要改變,則這個分區的所有數據必須重新裝入。
  FLASH支持軟件數據保護功能(Software Data Protection),當執行三字節SDP寫指令時,保護功能將自動加上,任何后續的寫操作必須帶上三字節SDP寫指令。
  SST29LE020的讀操作與傳統EPROM讀操作一致;在進行數據編程操作時,它支持內部定時(Internal Timer)、數據查詢(Data#Polling)、跳變位(Toggle Bit)三種方式,以測試內部編程操作是否完成。FLASH軟件擦除指令為6字節加載" title="加載">加載指令,該指令執行后,最多等待20ms整個芯片便被擦除,即將FLASH每個數據位都恢復為1狀態的全FF狀態。
  SST29LE020軟件指令序列可在SST公司的數據手冊上查到,如表1所示。在FLASH編程之前,需對FLASH進行擦除,由表1可知,擦除操作需要六個總線周期。
  FLASH頁面寫操作在使用內部定時方式時的流程如圖1所示。


2 TMS320VC33簡介
  TMS320VC33是美國TI公司推出的TMS320C3X系列的32位浮點數字信號處理器,它是在TMS320C31浮點DSP的基礎上開發的一個價格更低的DSP,該產品具有高速、低功耗、低成本、易于開發等顯著優點。TMS320VC33采用內部1.8V,外部3.3V供電,因而它的功耗比原有型號TMS320C31的功耗降低了大約一個數量級,而且能支持高達150M/FLOPS的運行速率。其主要特性如下:
  CPU是32bit的高性能CPU:可進行16/32b整數和32/40b的浮點操作;內含8個擴展精度寄存器;有2個地址發生器、8個輔助寄存器和2個輔助寄存器算術單元(ARAU)。
  片內存儲器為32bit指令字、24bit地址線、34K×32b(1.1Mb)的雙靜態RAM。
  外圍接口具有啟動程序裝載功能;內含5倍頻的鎖相環(PLL)時鐘發生器;片內存儲器可映射外設,其中包括一個串行口、兩個32bit定時器和一個DMA;具有四個內部譯碼頁選,可大大簡化TMS320VC33與I/O及存儲器的接口。
3 TMS320VC33程序引導功能
  TMS320VC33具有兩種存儲器映射方式,即MP(Microprocessor Mode)方式和MC/BL(Microcomputer/Bootloader Mode)方式,兩種方式下中斷向量的位置不同。常用的是MC方式。在該方式下,MCBL/MP引腳接高電平,內部ROM被映射到000~FFF空間。這段ROM中含有器件生產廠家固化的引導程序" title="引導程序">引導程序(BootLoader),該引導程序可以將DSP實時運行的程序和數據從外部低速ROM或串行口裝入到高速RAM中。
  TMS320VC33復位后即運行內部固化的引導程序,引導程序通過查詢四個中斷引腳來確定裝入方式。這些引腳為低電平有效,查詢順序依次為INT3、INT0、INT1、INT2;當INT3有效時,為串行裝入方式;當INT0有效時,從外部地址0x001000處裝入(BOOT1);當INT1有效時,從外部地址0x400000處裝入(BOOT2);當INT2有效時,從外部地址0xfff000處裝入(BOOT3)。
  TMS320VC33具有四個快速頁選信號,用于對外部地址空間尋址,其映射如表2所示。


  使用外部存儲器裝入數據時,外部存儲器數據頭位置需包含以下信息:
  (1)外部存儲器寬度" title="存儲器寬度">存儲器寬度(8/16/32位);
  (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     /*256K*/
  }
  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 BOOTBLK2_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地址及頁面字節數置0*/
  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<BOOTBLK;i++)  /*分別燒寫需要boot的數據塊*/
    {if(i==0)    /*每個數據塊燒寫的起始2字節分別是長度和源地址*/
    {lenth=BOOTBLK1_LEN;
    write_flash(BOOTBLK1_LEN);
    write_flash(BOOTSRC1_ADD);}
  else if(i==1)
    {lenth=BOOTBLK2_LEN;write_flash(BOOTBLK2_LEN);
    write_flash(BOOTSRC2_ADD);}
  else if(i==2)
    {lenth=BOOTBLK3_LEN;write_flash(BOOTBLK3_LEN);
    write_flash(BOOTSRC3_ADD);}
  else{;}
  for(j=0;j<lenth;j++) /*將數據塊內容寫入Flash*/
    {if(i==0){write_flash(bootblk1_add[j]);}
    else if(i==1){write_flash(bootblk2_add[j]);}
    else if(i==2){write_flash(bootblk3_add[j]);}
    else{;}
    }
    }
  write_flash(0);    /*代碼最后位置寫全零*/
  waite(10);     /*等待10ms,保證Flash寫完成*/
  }
  第三步:修改.CMD文件SECTION段,將燒寫程序鏈接到內部RAM區。.CMD文件中SECTION段如下:
  SECTIONS
  { /*Flash燒寫代碼及初始化數據放在TMS320VC33內部RAM*/
   .text : LOAD = INTRAM1
   .bss : RUN = INTRAM1
   .cinit > INTRAM1
   .stack > INTRAM1
  }
  第四步:運行燒寫程序,用戶代碼即被寫入FLASH中,將FLASH的OE引腳跳線連通至地的位置,利用CC可以查看FLASH存儲器內容是否與要燒寫的內容一致,并脫機檢驗。
  FLASH在線編程方法已在用戶板上得到了驗證,達到了預期的目的。通過JTAG仿真器對TMS320VC33用戶系統外部FLASH的在線編程,可以省去HEX轉換工具及EPROM編程器等工具,且具有方便、易行的特點。該現場在線編程的方法可推廣至其它系列DSP用戶系統,是DSP開發中需要掌握的一項新技術。
參考文獻
1 SST29LE020 DATA SHEET.Storage Technology, 2003
2 TMS320VC33 Digital Signal Processor. Texas Instruments, 2002
3 TMS320C3x User’s Guide. Texas Instruments,1997
4 TMS320C3x/C4x Assembly Language Tools User’s Guide. Texas Instruments, 1998
5 張雄偉. 曹鐵勇.DSP芯片的原理與開發應用. 北京:電子工業出版社, 2001

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
主站蜘蛛池模板: 婷婷五月综合缴情在线视频 | 亚洲在线欧美| 成人国产精品av| 久久久久久久少妇| 久久久精品日本| 国产欧美自拍视频| 日韩免费黄色av| 国产h视频在线播放| 亚洲v日韩v欧美v综合| 国产免费亚洲高清| 日本一区二区视频| 日本不卡二区| 久久综合久中文字幕青草| 欧美精品中文字幕一区二区| 亚洲a中文字幕| 欧美中文字幕在线观看| 精品日本一区二区三区在线观看| 亚洲专区在线视频| 欧美激情精品久久久久久黑人| 久久久国产一区二区| 亚洲精品日韩激情在线电影| 久久精品国产精品亚洲精品色| 91久久精品国产| 国产欧美一区二区三区不卡高清| 青青草精品视频在线| 国产精品一区免费观看| 欧美激情国产精品| 国产高潮呻吟久久久| 日韩综合视频在线观看| 久久久久久久国产精品视频| zzjj国产精品一区二区| 中文精品视频一区二区在线观看| 亚洲一区三区在线观看| 午夜精品蜜臀一区二区三区免费| 欧美日韩福利视频| 日本一区二区三区在线视频| 国产一区二区在线免费视频v| 久久精品99无色码中文字幕| 99久久国产免费免费| 久久久亚洲福利精品午夜| 国产三级精品网站|