在实际项目中,常常出现芯片的内部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会有一定的时延,所以导致执行会相对慢一些,建议大家尽量把不重要的代码放入外部。


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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FpdGlnMTk5Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">


build output框中会出现这种提示:“Insufficient RAM for Flash Algorithms !"
这是由于烧写算法也是须要空间的。可是分配的RAM太少。导致烧写算法载入失败。

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


watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FpdGlnMTk5Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">


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

    (以上仅供參考)


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



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

keil将程序装入外部FLASH具体解释的更多相关文章

  1. keil程序在外部RAM中调试的问题总结(个人的一点经验总结)

    keil程序在内部RAM调试的基本步骤网上已经有非常多了,我就不再赘述,大家能够在网上搜到非常多. 可是有些时候内部RAM并不够用,这就须要将程序装入外部RAM中调试,而在这个过程中可能会出现各种各样 ...

  2. 智能设备逆向工程之外部Flash读取与分析篇

    智能设备逆向工程之外部Flash读取与分析篇 唐朝实验室 · 2015/10/19 11:19 author: rayxcp 0x00 前言 目前智能家居设备的种类很多,本文内容以某智能豆浆机为例完成 ...

  3. STM32学习笔记(八) SPI总线(操作外部flash)

    1. SPI总线简介 SPI全称串行外设接口,是一种高速,全双工,同步的外设总线:它工作在主从方式,常规需要至少4根线才能够正常工作.SPI作为基本的外设接口,在FLASH,EPPROM和一些数字通讯 ...

  4. 基于stm32f4的ucGUI通过外部flash存储汉字库显示任意英文字符和汉字组合(控件可用)

    在做一个用到ucGUI的项目的时候要用到不定的汉字和英文字符,但是ucGUI本身又不支持读取芯片外部flash的字库来显示,于是查了下资料,如下: http://www.cnblogs.com/hik ...

  5. 程序在nor flash中真的可以运行吗?

    程序在nor flash中可以运行,但是是有限制的,它不能像RAM那样随意的写(尽管它可以随意的读).在norflash上,不能运行写存储器的指令,不过排除写的地方是RAM类.实验中的三个文件如下所示 ...

  6. ucgui汉字库存放到外部的flash(控件可用)及写外部FLASH小软件

    源:ucgui汉字库存放到外部的flash(控件可用)及写外部FLASH小软件 如何将ucgui的汉字库存放到外部的flash memory(ucgui)(汉字库)(外部flash) ucgui的字库

  7. 无法对含有多个.java(或.class)文档的程序进行编译(或解释)

    通常初学者会出现这样的问题:无法对含有多个.java(或.class)文档的程序进行编译(或解释). root@yogile-VirtualBox:/alive/string# javac work/ ...

  8. 微信小程序引用外部js,引用外部样式,引用公共页面模板

    https://blog.csdn.net/smartsmile2012/article/details/83414642 ================小程序引用外部js============= ...

  9. Keil STM32调试,使用ST-Link下载程序时提示“flash timeout.reset the target and try it again”

    参考: 很郁闷,买来没多久的 STM32F4-DISCOVERY 就挂了? STM32F103RB   Jlink调试的时候出现flash timeout.reset the target and t ...

随机推荐

  1. JMeter简单的性能测试实例

    JMeter基础之——一个简单的性能测试 我们了解了jmeter的一此主要元件,那么这些元件如何使用到性能测试中呢.这一节创建一个简单的测试计划来使用这些元件.该计划对应的测试需求. 1)测试目标网站 ...

  2. JMeter基础概念

    JMeter 介绍:一个非常优秀的开源的性能测试工具. 优点:你用着用着就会发现它的重多优点,当然不足点也会呈现出来. 从性能工具的原理划分: Jmeter工具和其他性能工具在原理上完全一致,工具包含 ...

  3. HDU 5274(树链剖分)

    树链剖分第一题QAQ,纪念下 #pragma comment(linker, "/STACK:102400000,102400000") #include <iostream ...

  4. exec与xargs区别

    区别描述: 两者都是对符合条件的文件执行所给的Linux 命令,而不询问用户是否需要执行该命令. -exec:{}表示命令的参数即为所找到的文件,以:表示comman命令的结束.\是转义符,因为分号在 ...

  5. web.config中的profile

    aspnet_regsql命令创建需要的表结构 public class UserProfile:ProfileBase { [SettingsAllowAnonymous(true)] //默认匿名 ...

  6. Jobs定时器 - Quartz

    Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运行十个,百个, ...

  7. Mysql常用命令记录

    -- 导出数据库: mysqldump -u user_name -p database_name > import_file.sql -- 执行脚本 source database.sql

  8. Cogs 12 运输问题2 (有上下界网络流)

    #include <cstdlib> #include <algorithm> #include <cstring> #include <iostream&g ...

  9. ANSI与UINCODE编码

    简要说明: ANSI是一种字符代码,为使计算机支持更多语言,通常使用 0x80~0xFF 范围的 2 个字节来表示 1 个字符. Uincode(统一码.万国码.单一码)是计算机科学领域里的一项业界标 ...

  10. Injector Job深入分析

    Injector Job的主要功能是根据crawlId在hbase中创建一个表,将将文本中的seed注入表中. (一)命令执行 1.运行命令 [jediael@master local]$ bin/n ...