keil将程序装入外部FLASH详解
发布时间:2020-12-15 07:01:46 所属栏目:百科 来源:网络整理
导读:在实际项目中,经常出现芯片的内部FLASH空间不够的情况,这就需要将程序分一部分装到外部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使用的。主要是初始化引脚和配置读取时延的操作。我项目的配置文件如下,给大家提供下参考:
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,18,20,24,28,29,30,31,1); for(i = 0; i < 32; i++) PinSel(3,i,1); for(i = 0; i < 21; i++) PinSel(4,1); PinSel(4,1); PinSel(4,25,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框中会出现这样的提示:“
这是因为烧写算法也是需要空间的,但是分配的RAM太少,导致烧写算法加载失败。
解决方法:将下图所示的RAM空间改大些即可。
转载请注明出处:blog.csdn.net/waitig1992
顺便给自己的个人博客 做个广告:等英博客 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 常用的正则表达式(转)
- 使用冲突的元素名称解压缩Go中的XML
- React Native之React速学教程(下)
- c# – 如何将LINQ to SQL Distinct()运算符应用于List?
- tdd – 什么是测试驱动开发?是否需要进行初始设计?
- c# – WPF DataGrid(MultiSelector?)多次提升SelectedItem
- ruby-on-rails – 自定义rails_admin控制器操作的Rspec测试
- OGG 有for Oracle database 10g and Linux Itanium CPU 版本
- ???? ?????? sqlite?? ????
- PostgreSQL9.5和JSONB的强大功能