在實際項目中,常常出現芯片的內部FLASH空間不夠的情況,這就須要將程序分一部分裝到外部FLASH中。
為了讓大家能少走些彎路,在這里把我在這當中遇到的一些問題和經驗教訓給大家分享一下。
僅供參考,假設有錯誤的地方歡迎指正,提前表示感謝!
轉載請注明出處:blog.csdn.net/waitig1992
- 硬件環境介紹
芯片是LPC1788,外部FLASH是SST39VF1601(NORFLASH)。
這個norflash在我的版本號的keil(v4.0)中沒有燒寫算法,須要自己手動編寫燒寫算法。詳細步驟我會在以后寫出來。
- 加入燒寫算法
打開project的Options菜單,在里面選擇Utilities選項卡,configure里選擇第一項。這一項的意思是“為FLASH項目使用目標驅動”,以下一項的意思是“為FLASH項目使用外部工具”,普通情況下我們是用jlink調試,keil里有內置的驅動。所以選這一項。
然后點擊settings。例如以下圖:

然后就會出現關於燒寫算法的菜單:

在這個菜單下點擊add。可加入FLASH的燒寫算法。
- 選擇燒寫算法
能夠在例如以下圖所看到的窗體中選擇須要的燒寫算法:
假設當中有你想要的算法。直接選擇,然后點擊add,就可以算法加入進去;假設沒有。則必須自己手動編寫燒寫算法。
編寫算法的步驟我會在以后介紹,在此不做過多說明。你的算法編寫成功后,也會在這個菜單里顯示出來,直接選擇就可以。
- 改動起始地址和大小
加入成功后,在下圖所看到的的頁面改動其起始地址和大小。

起始地址依據硬件連線情況和芯片的配置確定,大小依據外部FLASH的實際大小確定。
配置完畢后,點擊確定就可以。
- 編寫jlink配置文件
將燒寫算法配置完畢后,須要編寫jlink的配置文件。這是為了在下載程序時給jlink使用的。主要是初始化引腳和配置讀取時延的操作。
我項目的配置文件例如以下,給大家提供下參考:
FUNC void PinSel(int p1, int n1, int f1) { _WDWORD(0x4002C000 + (p1 * 32 + n1) * 4, 0x8 | f1); } FUNC void InitNORFlash(void) { int i; PinSel(2,16,1); PinSel(2,17,1); PinSel(2,18,1); PinSel(2,20,1); PinSel(2,24,1); PinSel(2,28,1); PinSel(2,29,1); PinSel(2,30,1); PinSel(2,31,1); for(i = 0; i < 32; i++) PinSel(3,i,1); for(i = 0; i < 21; i++) PinSel(4,i,1); PinSel(4,24,1); PinSel(4,25,1); PinSel(4,30,1); PinSel(4,31,1); /* PCONP |= 1 << 11 */ _WDWORD(0x400FC0C4, 0x04288FDE); // Power On EMC /* EMCCONTROL |= 1 */ _WDWORD(0x2009C000, 0x00000001); // Enable EMC /* EMCDLYCTL */ _WDWORD(0x400FC1DC, 0x00081818); // Config data read delay /* EMCCONFIG */ _WDWORD(0x2009C008, 0x00000000); // Little endian mode /* STATICCONFIG1 */ _WDWORD(0x2009C220, 0x00000081); // 16bit data width // Disable asynchronous page mode // Read when active bits are low // No extend wait /* STATICWAITWEN1 */ _WDWORD(0x2009C224, 0x00000002); // WaitWEn /* STATICWAITOEN1 */ _WDWORD(0x2009C228, 0x00000002); // WaitOEn /* STATICWAITRD1 */ _WDWORD(0x2009C22C, 0x0000001F); // WaitRd /* STATICWAITPAGE1 */ _WDWORD(0x2009C230, 0x0000001F); // WaitPage /* STATICWAITWR1 */ _WDWORD(0x2009C234, 0x0000001F); // WaitWr /* STATICWAITTURN1 */ _WDWORD(0x2009C238, 0x0000000F); // WaitTurn _sleep_(100); }
這是用到的函數,配置文件例如以下:
INCLUDE SST39VF1601.ini InitNORFlash(); // Initialize memory
在下圖所看到的的選項卡中的init File 選項中選中配置文件,就可將配置文件加入進去;

- 配置分散載入文件
一般經過以上的步驟以后。外部FLASH就能夠像內部FLASH一樣工作了。
改動下分散載入文件,將代碼分一部分給外部FLASH就能夠了。
注意不要把初始化外部FLASH的代碼放到外部FLASH里面,那樣會導致讀取錯誤。並且要把外部FLASH的初始化代碼放到存入外部FLASH的代碼的前邊。(有點拗口,沒辦法,語文學得不好。。。)
只是芯片讀取外部FLASH會有一定的時延,所以導致執行會相對慢一些,建議大家盡量把不重要的代碼放入外部。
- 可能遇到的問題及解決
這樣配置完畢后。有些朋友可能會遇到以下的問題:

build output框中會出現這種提示:“
Insufficient RAM for Flash Algorithms !"

這是由於燒寫算法也是須要空間的。可是分配的RAM太少。導致燒寫算法載入失敗。
解決方法:將下圖所看到的的RAM空間改大些就可以。


- 經過以上的步驟,基本上就能夠成功了。假設當中有錯誤的地方,希望大家能夠幫忙指正,提前表示感謝!假設還有其它問題,能夠一起討論。共同進步!
(以上僅供參考)
轉載請注明出處:blog.csdn.net/waitig1992
順便給自己的個人博客 做個廣告:等英博客
順便給自己的個人博客 做個廣告:等英博客