<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應用 > 基于 DSP的嵌入式系統(tǒng)通過地址映射方式實現(xiàn)片外FLASH擦寫

          基于 DSP的嵌入式系統(tǒng)通過地址映射方式實現(xiàn)片外FLASH擦寫

          作者: 時間:2010-12-12 來源:網(wǎng)絡 收藏

          1 引言

          的設(shè)計中,經(jīng)常要使用片外存儲器擴充存儲空間。特別是當的片內(nèi)數(shù)據(jù)存儲器和程序存儲器容量比較小時, 必須把一部分數(shù)據(jù),如常量、原始數(shù)據(jù)庫等存儲到片外的存儲器中,從而節(jié)省芯片內(nèi)部的存儲器資源。在實際應用中,片外存儲器通常選擇RAM或 MEMORY。RAM數(shù)據(jù)掉電即丟失,不適合長期保存數(shù)據(jù)。對于一些無需頻繁讀寫但需要長期保存的數(shù)據(jù),如字模數(shù)據(jù)、端口等時,通常選擇片外作偽擴展的數(shù)據(jù)存儲器。使用片外 必須要解決對其的問題。

          在實際應用中,對片外FLASH的有兩種:一是使用通用編程器對FLASH芯片進行;二是直接由DSP對FLASH進行擦寫。對于需要修改或已安裝在電路板上的FLASH芯片無法使用第一種,只能采用第二種,且便于調(diào)試。本文介紹一種利用存儲器技術(shù)對DSP片外FLASH擦寫的方法。

          DSP56F805芯片是Motorola公司在DSP56800 的基礎(chǔ)上開發(fā)的系列DSP芯片之一。該芯片采用先進的修正哈佛結(jié)構(gòu),三個內(nèi)部總線和四個內(nèi)部數(shù)據(jù)總線支持數(shù)據(jù)傳輸;采用MCU形式的指令集,尋址方式靈活;具有較強的片外存儲空間擴展能力;功耗小,高度并行。但是該芯片的片內(nèi)數(shù)據(jù)存儲器空間最大為64k,程序存儲空間尋址范圍是64k,內(nèi)部模式(Mode0A和Mode0B)下只有31.5k。對于一些需要復雜中文圖形用戶界面的 DSP來說芯片存儲資源顯得不夠,必須對芯片存儲空間進行擴展??紤]到具體要求,本文使用片外FLASH來擴展系統(tǒng)數(shù)據(jù)存儲空間,將DSP系統(tǒng)的中文圖形用戶界面中用到的所有字模數(shù)據(jù)和頁面內(nèi)容數(shù)據(jù)存放到片外FLASH中,大大節(jié)省了片內(nèi)的數(shù)據(jù)存儲器空間。

          CodeWarrior IDE是由Metrowerks公司專為Motorola的DSP56800系列設(shè)計的開發(fā)平臺。該平臺具有簡單明了的圖形用戶界面和豐富的軟件開發(fā)工具,適合于開發(fā)基于DSP56800系列的應用程序、插件程序等各種程序代碼。在CodeWarrior環(huán)境中,用戶可以修改.cmd文件來配置存儲器分配方式,還可以修改startup文件夾中的初始化程序來控制系統(tǒng)的初始化操作。用戶編譯并鏈接后,將生成.elf文件,在文件中可以看到存儲器的詳細分配情況。當用戶將程序下載到DSP芯片后,可以使用CodeWarrior的調(diào)試器對程序進行全面的調(diào)試,如設(shè)置斷點、單步執(zhí)行等;也可以使用 Watch Memory指令來檢查存儲器中的各段的值,還可以使用Save/Load Memory指令來保存或是載入某段存儲器的值。

          2 方法介紹

          首先利用GPIOD0口生成合適的片外FLASH和片內(nèi)XRAM片選信號,片內(nèi)XRAM和片外FLASH的訪問切換。例如當GPIOD0 =0時,0x8000~0xFFFF到片內(nèi)XRAM,此時對于整個0x0000~0xFFFF地址范圍的讀寫操作就是對于片內(nèi) XRAM的操作;當GPIOD0=1時,0x8000~0xFFFF地址范圍到數(shù)據(jù)FLASH,則對0x8000~0xFFFF 地址范圍的讀寫操作就是對于片外FLASH的操作;對0x0000~0x7FFF地址范圍的讀寫仍是針對片內(nèi) XRAM的操作,從而將數(shù)據(jù)存儲空間擴展了32k。

          再將映射方式設(shè)置為片內(nèi),將需要寫到FLASH中的數(shù)據(jù)文件載入片內(nèi)XRAM。最后根據(jù)需要設(shè)置GPIO端口值,切換地址映射的存儲器。這樣地址映射的方法,便可將XRAM中數(shù)據(jù)寫入片外FLASH的操作,而對于DSP芯片來說只是進行了其XRAM尋址空間內(nèi)部的數(shù)據(jù)搬移操作。

          假設(shè)要將一組二維數(shù)組character[180][32]形式的字模數(shù)據(jù)保存入片外數(shù)據(jù)FLASH的0x8000~0xA000地址段中,先做以下準備工作:

          ①用一個GPIO端口,擴展系統(tǒng)的可尋址數(shù)據(jù)存儲器空間;②編寫FLASH擦寫程序,程序流程如圖1所示。

          #define N 100 /* 由于FLASH與RAM的讀寫速度不同,所以需要在每項操作后加入若干個延遲以保證正確性,延遲的具體長短可以根據(jù)具體情況作調(diào)整 */

          本文引用地址:http://www.ex-cimer.com/article/151235.htm

          void main()
          {
          unsigned int i,code;
          unsigned int *code_addr;
          unsigned int *flash_addr;
          *GPIO_D_DR=0x0002; /*映射方式設(shè)置為映射到片外數(shù)據(jù)FLASH*/
          delay(N);
          GPIOD_setup(); /*GPIOD設(shè)置*/
          delay(N);
          erase_flash(); /*如FLASH上原有數(shù)據(jù)無需保留,則全部擦除,如部分據(jù)需保留,也可部分擦除*/

          *GPIO_D_DR=0x0000; /*映射方式設(shè)置為映射到片內(nèi)XRAM*/ delay(N);
          flash_addr=(unsigned int *) FLASH_ADDR;
          code_addr=(unsigned int *)CODE_ADDR; /*設(shè)置XRAM的存儲起始地址和數(shù)據(jù)FLASH擦寫起始地址*/

          /*循環(huán)擦寫*/
          for(i=0;i{
          *GPIO_D_DR=0x0000;
          delay(N);
          code=*(code_addr++); /*保存XRAM中數(shù)據(jù)到變量code*/
          delay(N);
          *GPIO_D_DR=0x0002;
          delay(N);
          pre_write_flash(); /* 寫FLASH前的預處理,向FLASH內(nèi)寫入相應命令字,根據(jù)所選用 FLASH的不同預處理操作也有所不同*/
          delay(N);
          *(flash_addr++)=code; /*寫數(shù)據(jù)到FLASH中*/
          delay(N);
          }
          }
          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

          上一頁 1 2 下一頁

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();