keil將程序裝入外部FLASH具體解釋



在實際項目中,常常出現芯片的內部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

順便給自己的個人博客 做個廣告:等英博客


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM