• 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

    顺便给自己的个人博客 做个广告:等英博客

  • 相关阅读:
    Asp.Net服务器控件开发的Grid实现(四)回发事件
    Win8的IIS中架设php
    jsonp其实很简单【ajax跨域请求】
    Asp.Net服务器控件开发的Grid实现(三)列编辑器
    Asp.Net服务器控件开发的Grid实现(二)Html标记渲染
    构建之法阅读笔记01
    四则运算2
    psp0
    随机生成30道四则运算
    学习进度条
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5245803.html
Copyright © 2020-2023  润新知