基于 DSP的嵌入式系統(tǒng)通過(guò)地址映射方式實(shí)現(xiàn)片外FLASH擦寫(xiě)
1 引言
在DSP系統(tǒng)的設(shè)計(jì)中,經(jīng)常要使用片外存儲(chǔ)器擴(kuò)充系統(tǒng)存儲(chǔ)空間。特別是當(dāng)DSP的片內(nèi)數(shù)據(jù)存儲(chǔ)器和程序存儲(chǔ)器容量比較小時(shí), 必須把一部分?jǐn)?shù)據(jù),如常量、原始數(shù)據(jù)庫(kù)等存儲(chǔ)到片外的存儲(chǔ)器中,從而節(jié)省DSP芯片內(nèi)部的存儲(chǔ)器資源。在實(shí)際應(yīng)用中,片外存儲(chǔ)器通常選擇RAM或FLASH MEMORY。RAM數(shù)據(jù)掉電即丟失,不適合長(zhǎng)期保存數(shù)據(jù)。對(duì)于一些無(wú)需頻繁讀寫(xiě)但需要長(zhǎng)期保存的數(shù)據(jù),如字模數(shù)據(jù)、端口地址等時(shí),通常選擇片外FLASH作偽擴(kuò)展的數(shù)據(jù)存儲(chǔ)器。使用片外 FLASH必須要解決對(duì)其擦寫(xiě)的問(wèn)題。
在實(shí)際應(yīng)用中,對(duì)片外FLASH的擦寫(xiě)有兩種方式:一是使用通用編程器對(duì)FLASH芯片進(jìn)行擦寫(xiě);二是直接由DSP對(duì)FLASH進(jìn)行擦寫(xiě)。對(duì)于需要修改或已安裝在電路板上的FLASH芯片無(wú)法使用第一種方式,只能采用第二種方式,且便于調(diào)試。本文介紹一種利用存儲(chǔ)器映射技術(shù)實(shí)現(xiàn)對(duì)DSP片外FLASH擦寫(xiě)的方法。
DSP56F805芯片是Motorola公司在DSP56800 的基礎(chǔ)上開(kāi)發(fā)的系列DSP芯片之一。該芯片采用先進(jìn)的修正哈佛結(jié)構(gòu),三個(gè)內(nèi)部地址總線和四個(gè)內(nèi)部數(shù)據(jù)總線支持?jǐn)?shù)據(jù)傳輸;采用MCU形式的指令集,尋址方式靈活;具有較強(qiáng)的片外存儲(chǔ)空間擴(kuò)展能力;功耗小,高度并行。但是該芯片的片內(nèi)數(shù)據(jù)存儲(chǔ)器空間最大為64k,程序存儲(chǔ)空間尋址范圍是64k,內(nèi)部模式(Mode0A和Mode0B)下只有31.5k。對(duì)于一些需要復(fù)雜中文圖形用戶界面的 DSP系統(tǒng)來(lái)說(shuō)芯片存儲(chǔ)資源顯得不夠,必須對(duì)芯片存儲(chǔ)空間進(jìn)行擴(kuò)展。考慮到具體要求,本文使用片外FLASH來(lái)擴(kuò)展系統(tǒng)數(shù)據(jù)存儲(chǔ)空間,將DSP系統(tǒng)的中文圖形用戶界面中用到的所有字模數(shù)據(jù)和頁(yè)面內(nèi)容數(shù)據(jù)存放到片外FLASH中,大大節(jié)省了片內(nèi)的數(shù)據(jù)存儲(chǔ)器空間。
CodeWarrior IDE是由Metrowerks公司專為Motorola的DSP56800系列設(shè)計(jì)的開(kāi)發(fā)平臺(tái)。該平臺(tái)具有簡(jiǎn)單明了的圖形用戶界面和豐富的軟件開(kāi)發(fā)工具,適合于開(kāi)發(fā)基于DSP56800系列的應(yīng)用程序、插件程序等各種程序代碼。在CodeWarrior環(huán)境中,用戶可以通過(guò)修改.cmd文件來(lái)配置存儲(chǔ)器分配方式,還可以通過(guò)修改startup文件夾中的初始化程序來(lái)控制系統(tǒng)的初始化操作。用戶編譯并鏈接后,將生成.elf文件,在文件中可以看到存儲(chǔ)器的詳細(xì)分配情況。當(dāng)用戶將程序下載到DSP芯片后,可以使用CodeWarrior的調(diào)試器對(duì)程序進(jìn)行全面的調(diào)試,如設(shè)置斷點(diǎn)、單步執(zhí)行等;也可以使用 Watch Memory指令來(lái)檢查存儲(chǔ)器中的各地址段的值,還可以使用Save/Load Memory指令來(lái)保存或是載入某段存儲(chǔ)器的值。
2 方法介紹
首先利用GPIOD0口生成合適的片外FLASH和片內(nèi)XRAM片選信號(hào),實(shí)現(xiàn)片內(nèi)XRAM和片外FLASH的訪問(wèn)切換。例如當(dāng)GPIOD0 =0時(shí),0x8000~0xFFFF映射到片內(nèi)XRAM,此時(shí)對(duì)于整個(gè)0x0000~0xFFFF地址范圍的讀寫(xiě)操作就是對(duì)于片內(nèi) XRAM的操作;當(dāng)GPIOD0=1時(shí),0x8000~0xFFFF地址范圍映射到數(shù)據(jù)FLASH,則對(duì)0x8000~0xFFFF 地址范圍的讀寫(xiě)操作就是對(duì)于片外FLASH的操作;對(duì)0x0000~0x7FFF地址范圍的讀寫(xiě)仍是針對(duì)片內(nèi) XRAM的操作,從而將數(shù)據(jù)存儲(chǔ)空間擴(kuò)展了32k。
再將映射方式設(shè)置為片內(nèi),將需要寫(xiě)到FLASH中的數(shù)據(jù)文件載入片內(nèi)XRAM。最后根據(jù)需要設(shè)置GPIO端口值,切換地址映射的存儲(chǔ)器。這樣通過(guò)地址映射的方法,便可實(shí)現(xiàn)將XRAM中數(shù)據(jù)寫(xiě)入片外FLASH的操作,而對(duì)于DSP芯片來(lái)說(shuō)只是進(jìn)行了其XRAM尋址空間內(nèi)部的數(shù)據(jù)搬移操作。
假設(shè)要將一組二維數(shù)組character[180][32]形式的字模數(shù)據(jù)保存入片外數(shù)據(jù)FLASH的0x8000~0xA000地址段中,先做以下準(zhǔn)備工作:
①用一個(gè)GPIO端口,擴(kuò)展系統(tǒng)的可尋址數(shù)據(jù)存儲(chǔ)器空間;②編寫(xiě)FLASH擦寫(xiě)程序,程序流程如圖1所示。
#define N 100 /* 由于FLASH與RAM的讀寫(xiě)速度不同,所以需要在每項(xiàng)操作后加入若干個(gè)延遲以保證正確性,延遲的具體長(zhǎng)短可以根據(jù)具體情況作調(diào)整 */
本文引用地址:http://butianyuan.cn/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ù)無(wú)需保留,則全部擦除,如部分據(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的存儲(chǔ)起始地址和數(shù)據(jù)FLASH擦寫(xiě)起始地址*/
/*循環(huán)擦寫(xiě)*/
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(); /* 寫(xiě)FLASH前的預(yù)處理,向FLASH內(nèi)寫(xiě)入相應(yīng)命令字,根據(jù)所選用 FLASH的不同預(yù)處理操作也有所不同*/
delay(N);
*(flash_addr++)=code; /*寫(xiě)數(shù)據(jù)到FLASH中*/
delay(N);
}
}
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評(píng)論