【轉載】keil將程序裝入外部FLASH詳解

轉載自:  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);
}



 


這是用到的函數,配置文件如下:

 


 
  1. INCLUDE SST39VF1601.ini

  2.  
  3. InitNORFlash(); // Initialize memory


在下圖所示的選項卡中的init File 選項中選中配置文件,就可將配置文件添加進去;

 

 

  • 配置分散加載文件

一般經過以上的步驟以後,外部FLASH就可以像內部FLASH一樣工作了。

修改下分散加載文件,將代碼分一部分給外部FLASH就可以了。

 

注意不要把初始化外部FLASH的代碼放到外部FLASH裏面,那樣會導致讀取錯誤,而且要把外部FLASH的初始化代碼放到存入外部FLASH的代碼的前邊。(有點拗口,沒辦法,語文學得不好。。。)

 

不過芯片讀取外部FLASH會有一定的時延,所以導致運行會相對慢一些,建議大家儘量把不重要的代碼放入外部。

 

  • 可能遇到的問題及解決

這樣配置完成後,有些朋友可能會遇到下面的問題:

 

 

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

這是因爲燒寫算法也是需要空間的,但是分配的RAM太少,導致燒寫算法加載失敗。

解決方法:將下圖所示的RAM空間改大些即可。

 

  • 經過以上的步驟,基本上就可以成功了。如果其中有錯誤的地方,希望大家可以幫忙指正,提前表示感謝!如果還有其他問題,可以一起討論,共同進步!(以上僅供參考)

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章