keil将程序装入外部FLASH具体解释[通俗易懂]

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。例如以下图:

keil将程序装入外部FLASH具体解释[通俗易懂]



然后就会出现关于烧写算法的菜单:

keil将程序装入外部FLASH具体解释[通俗易懂]

在这个菜单下点击add。可加入FLASH的烧写算法。

  • 选择烧写算法

能够在例如以下图所看到的窗体中选择须要的烧写算法:

keil将程序装入外部FLASH具体解释[通俗易懂]

假设当中有你想要的算法。直接选择,然后点击add,就可以算法加入进去;假设没有。则必须自己手动编写烧写算法。

编写算法的步骤我会在以后介绍,在此不做过多说明。你的算法编写成功后,也会在这个菜单里显示出来,直接选择就可以。


  • 改动起始地址和大小
加入成功后,在下图所看到的的页面改动其起始地址和大小。


keil将程序装入外部FLASH具体解释[通俗易懂]

起始地址依据硬件连线情况和芯片的配置确定,大小依据外部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 选项中选中配置文件,就可将配置文件加入进去;


keil将程序装入外部FLASH具体解释[通俗易懂]

  • 配置分散载入文件
一般经过以上的步骤以后。外部FLASH就能够像内部FLASH一样工作了。

改动下分散载入文件,将代码分一部分给外部FLASH就能够了。


注意不要把初始化外部FLASH的代码放到外部FLASH里面,那样会导致读取错误。并且要把外部FLASH的初始化代码放到存入外部FLASH的代码的前边。(有点拗口,没办法,语文学得不好。。。)

只是芯片读取外部FLASH会有一定的时延,所以导致执行会相对慢一些,建议大家尽量把不重要的代码放入外部。


  • 可能遇到的问题及解决
这样配置完毕后。有些朋友可能会遇到以下的问题:


keil将程序装入外部FLASH具体解释[通俗易懂]

build output框中会出现这种提示:“keil将程序装入外部FLASH具体解释[通俗易懂]Insufficient RAM for Flash Algorithms !”
这是由于烧写算法也是须要空间的。可是分配的RAM太少。导致烧写算法载入失败。

解决方法:将下图所看到的的RAM空间改大些就可以。

keil将程序装入外部FLASH具体解释[通俗易懂]
keil将程序装入外部FLASH具体解释[通俗易懂]

  • 经过以上的步骤,基本上就能够成功了。假设当中有错误的地方,希望大家能够帮忙指正,提前表示感谢!假设还有其它问题,能够一起讨论。共同进步!

    (以上仅供參考)


转载请注明出处:blog.csdn.net/waitig1992

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


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115786.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 微信小程序bindtap的作用_小程序分享带参数

    微信小程序bindtap的作用_小程序分享带参数之前一直以为微信小程序按钮点击事件传参是和web端相同,即在事件中写明所传递的参数即可,但是这样尝试过以后发现小程序的控制台报错,报所写的bindtap中参数错误,之后百度发现,小程序按钮点击这类事件时一般的处理方法是指明元素所在的id,bindtap只是写明函数名,例如,bindtap=’setNumber’,而不是bindtap=’setNumber(1)’,在js中只要写function(e

    2022年4月19日
    99
  • scp命令拷贝文件

    scp命令拷贝文件简介scp(securecopy)是一个基于SSH协议在网络之间进行安全传输的命令。如果是从本地拷贝到远程,格式为:scp文件用户名@IP地址:目标目录如果是从远程拷贝到本地,格式为:scp用户名@ip地址:带路径文件名本地目录参数-v显示详细的连接进度-P指定远程主机的sshd端口号-r用于传送文件夹-6使用IPv6协议例子从本地拷贝到远程[root@localhost~]#scpmyhistory.txtroot@192.168.31.

    2022年8月22日
    12
  • 数仓搭建——ODS层

    数仓搭建——ODS层数仓搭建 ODS 层用户行为数据和业务数据

    2025年7月7日
    3
  • 魔兽争霸微操教学(精华篇)「建议收藏」

    魔兽争霸微操教学(精华篇)「建议收藏」基础操作:用键盘制造单位,释放魔法,使用物品。魔兽中的一切东西都可以用快捷键来完成,而鼠标只是起到一个定位的作用。比如,暗夜做小精灵,你可以用鼠标点击基地里精灵的头像,也可以直接按w;或者暗夜做月亮

    2022年7月1日
    32
  • JAVABEAN是什么和总结JAVABEAN的两种使用方式

    JAVABEAN是什么和总结JAVABEAN的两种使用方式原文:http://www.blogjava.net/flysky19/articles/88180.html一、 javabean 是什么?Javabean 就是一个类,这个类就定义一系列 get 和 set 方法。 Sosimple !Javabean 就是为了和 jsp 页面传数据化简交互过程而产生的。自己的理解:使用 javabean 和不用 javabean 的

    2022年7月17日
    15
  • 逻辑漏洞思维导图

    逻辑漏洞思维导图逻辑漏洞思维导图逻辑漏洞,是因为代码之后是人的逻辑,人更容易犯错,是编写完程序后随着人的思维逻辑产生的不足。sql注入、xss等漏洞可以通过安全框架等避免,这种攻击流量非法,对原始程序进行了破坏,防火墙可以检测,而逻辑漏洞是通过合法合理的方式达到破坏,比如密码找回由于程序设计不足,会产生很多问题,破坏方式并非向程预防思路。…

    2022年5月30日
    38

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号