keil将程序装入外部FLASH详解

在实际项目中,经常出现芯片的内部FLASH空间不够的情况,这就需要将程序分一部分装到外部FLASH中。

为了让大家能少走些弯路,在这里把我在这其中遇到的一些问题和经验教训给大家分享一下。

仅供参考,如果有错误的地方欢迎指正,提前表示感谢!

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

  • 硬件环境介绍

芯片是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会有一定的时延,所以导致运行会相对慢一些,建议大家尽量把不重要的代码放入外部。

  • 可能遇到的问题及解决

这样配置完成后,有些朋友可能会遇到下面的问题:

然后会出现这样的提示:“

因为烧写算法也是需要空间的,但是分配的RAM太少,导致烧写算法加载失败。

解决方法:将下图所示的RAM空间改大些即可。

  • 经过以上的步骤,基本上就可以成功了。如果其中有错误的地方,希望大家可以帮忙指正,提前表示感谢!如果还有其他问题,可以一起讨论,共同进步!(以上仅供参考)

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

keil将程序装入外部FLASH详解

时间: 2024-10-10 08:35:48

keil将程序装入外部FLASH详解的相关文章

CentOS程序包管理器rpm、yum以及程序包编译安装详解

一.程序包管理器RPM和Yum简介 程序包管理器:将编译好的应用程序的各组成文件打包成一个或几个程序包文件,可以更方便地实现程序包的安装.升级.卸载和查询等管理操作. rpm软件包管理器(RPM Package Manager):rpm包存在依赖关系,依赖关系复杂,安装时间很长,虽然可以忽略依赖关系,但是可能会导致程序包安装后无法正常使用. yum程序包管理器( Yellow dog Updater, Modified):yum是基于RPM包管理,自动解决程序包间的依赖关系.根据配置文件的资源地

Oracle外部表详解(转载)

(外部表创建主要注意创建目录访问权限问题.目录路径格式无空格等不相关字符,即必须是当前表访问用户可以访问:关于表中行数的限制问题,如果不加限制注意添加reject limit unlimited:表中数据格式与创建表时access parameters中的定义需保持同步,适当用skip=1) 外部表概述 外部表只能在Oracle 9i之后来使用.简单地说,外部表,是指不存在于数据库中的表.通过向Oracle提供描述外部表的元数据,我们可以把一个操作系统文件当成一个只读的数据库表,就像这些数据存储

FineBI学习系列之FineBI官网提供的程序数据集(图文详解)

不多说,直接上干货! 这是来自FineBI官网提供的帮助文档 http://help.finebi.com/http://help.finebi.com/doc-view-31.html 目录: 1.描述 2.实现原理 3.案例 1.描述 由上一节BI可能通过设计器远程服务器的方式,以服务器数据集的形式来连接数据. 这样其数据来源可以是数据库数据,还可以是其它任何类型的数据,因为BI是通过AbstractTableData抽象类来读取数据源的,而上述所有的数据来源都继承实现其抽象方法,因此BI可

Android应用程序相关的文件目录详解

一.方法介绍:         每个Android应用程序都可以通过Context来获取与应用程序相关的目录,这些目录的功能各异,每一个目录都有自己的特点,有时候可能会搞混淆,本文结合android源码注释和实际操作,详细介绍一下每个方法: 方法:getFilesDir 释义:返回通过Context.openFileOutput()创建和存储的文件系统的绝对路径,应用程序文件,这些文件会在程序被卸载的时候全部删掉. 方法:getCacheDir 释义:返回应用程序指定的缓存目录,这些文件在设备内

rpm程序包管理器详解

1. 程序包管理器的功能 我们知道,由程序员编写并提供的程序源代码要转换成目标二进制格式才能在计算机上运行起来,但用户要在平台上使用时需要手动编译安装后才能使用,对于普通用户来说有一定难度.因此为了降低普通用户对应用程序的使用难度,程序员可在提供源代码的同时提供已在特定环境下编译好的程序文件,只要用户的平台环境和程序员的平台环境相同,就可以通过解压程序员提供的二进制格式文件即可使用,而无需自己手动编译安装. 一个已编译好的程序由二进制程序.库文件.配置文件和帮助手册等组成,而程序包管理器的功能就

Java程序操作数据库SQLserver详解

数据库基本操作:增删改查(CRUD) crud介绍(增.删.改.查操作) CRUD是指在做计算处理时的增加(Create).查询(Retrieve)(重新得到数据).更新(Update)和删除(Delete)几个单记事的首字母简写.主要被用在描述软件系统中数据库或者持久层的基本操作功能. Create new records Rctricvc cxisting rccords Update existing records Delete existing records. 要对数据表进行增.删.

小程序脚本语言WXS详解

WXS脚本语言是 Weixin Script脚本的简称,是JS.JSON.WXML.WXSS之后又一大小程序内部文件类型.截至到目前小程序已经提供了5种文件类型. 解构小程序的几种方式,其中一种方式就是通过文件类型:JS.JSON.WXML.WXSS.WXS.前面四种之前已经介绍过,今天主要是介绍WXS这种文件类型.如果你是PHP.JAVA.C#程序员的话写过服务端代码的话,就很好理解WXS这种脚本语言了.能够更加方便的动态实现页面上的一些基本逻辑判断,而不用全部的依赖后台实现,再通过接口返回.

Opencv研读笔记:haartraining程序之cvCreateCARTClassifier函数详解(CART树状弱分类器创建)~

cvCreateCARTClassifier函数在haartraining程序中用于创建CART树状弱分类器,但一般只采用单一节点的CART分类器,即桩分类器,一个多节点的CART分类器训练耗时很多.根据自己的测试,要等差不多10分钟(2000正样本.2000负样本)才能训练完一个3节点的弱分类器,当然,总体的树状弱分类器的数目可能也会减少1/2.之所以将此函数拿出来说说,主要是因为在网上找不到针对这个函数的详细说明,同时,CART的应用十分广泛,自己也趁这个机会好好学学,把自己的一点理解分享给

Opencv研读笔记:haartraining程序之icvCreateCARTStageClassifier函数详解~

之前介绍了haartraining程序中的cvCreateMTStumpClassifier函数,这个函数的功能是计算最优弱分类器,这篇文章介绍一下自己对haartraining中关于强分类器计算的一些理解,也就是程序中的icvCreateCARTStageClassifier函数. 由于haartraining是基于HAAR特征进行adaboost训练,对于HAAR特征的处理比较繁琐,采用了奇数弱分类器补充针对翻转特征最优弱分类器计算的代码,所以代码看起来较为冗长.此外,其采用了较多的中间结构