轉載自: https://blog.csdn.net/huan447882949/article/details/81048352
在實際項目中,經常出現芯片的內部FLASH空間不夠的情況,這就需要將程序分一部分裝到外部FLASH中。
爲了讓大家能少走些彎路,在這裏把我在這其中遇到的一些問題和經驗教訓給大家分享一下。
僅供參考,如果有錯誤的地方歡迎指正,提前表示感謝!
- 硬件環境介紹
芯片是LPC1788,外部FLASH是SST39VF1601(NORFLASH)。
這個norflash在我的版本的keil(v4.0)中沒有燒寫算法,需要自己手動編寫燒寫算法,具體步驟我會在以後寫出來。
- 添加燒寫算法
打開工程的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空間改大些即可。
- 經過以上的步驟,基本上就可以成功了。如果其中有錯誤的地方,希望大家可以幫忙指正,提前表示感謝!如果還有其他問題,可以一起討論,共同進步!(以上僅供參考)