您的位置 首页 电子

51单片机资源扩展:从片内ROM跳转到片外ROM

源于一年前想自己动手给51写个OS,编译选Large模式,调试时整个流程都跑的好好的,可是烧写到片上后得不到预期的效果,后来查书才知道5…

源于一年前想自己着手给51写个OS,编译选Large形式,调试时整个流程都跑的好好的,可是烧写到片上后得不到预期的作用,后来查书才知道51单片机片上只要4KRom,假如没有扩展片外Rom,当拜访4K以外的程序空间,程序指针又会回到最开端碑文。参考手册扩展片外Rom后,能拜访达64K的程序空间。网上能查找到的扩展方法都是将EA引脚接地,让MCU上电后从外部ROM开端碑文。但检查芯片手册,明明说EA为高时,程序从片内ROM碑文,当碑文到0x1000以上地址时(规范51单片机),会跳转到片外ROM碑文。按网上的做法,为了扩展个片外ROM,片内的根本ROM都不用了,有点浪费了,所以开端找材料怎么从片内跳转到片外碑文。

射人先射马,发帖先上图,仿真图如下:

此处EA脚没有接地。假如想简略粗犷的加电时从片外ROM碑文,EA引脚接地,双击U2(27C64)Image File选Hex然后就能够了,这不是本文的要点,略过,后边或许会写到。

跳转,最简略的方法用LJMP,当然也能够用把跳转地址压入栈,然后ret曩昔,不过这种方法我没测验成功。

考虑到汇编写代码太苦逼,写规划大一点的代码还得靠C,因而程序的作用是:main函数在片内碑文,流水灯代码寄存在片外Rom,main函数跳转到流水灯中碑文。

我们是一种测验,所以从写汇编代码开端(加载地址简单操控:ORG指定即可)

1)用汇编代码跳转:

AT89C51中的代码:

ORG 0000H
LJMP 1000H
END

#####################

27C64中代码:

ORG 1000H
STAR:
MOV A,#0AAH
MOV P1,A
MOV A,#55H
MOV P1,A
SJMP STAR
END

程序运转起来后,PC寄存器指向0x0000处的LJMP 0x1000,然后跳到27C64处碑文。起先,在27C64 0x0000处查找编码,没找到,查阅手册后知,当PC超越0FFFH时,会转向片外程序存储空间1000H-FFFFH碑文程序。

[27C64处的内容]

2)用C代码跳转:
#include
int main()
{
int i=0;
i++;

/*

碑文一些初始化逻辑,或许承受交互内容,按不同的输入,跳转到片外ROM

*/

#pragma asm
LJMP 0x1000
#pragma endasm
while(1);
}

C代码中嵌入汇编,做跳转。

这个衔接中有相关的设置 http://bbs.ednchina.com/BLOG_ART%&&&&&%LE_1721.HTM 假如不做设置,衔接时会有正告找不到C_STARTUP,也不会运转到代码中。

调试运转,我们KEIL C加了发动代码,在protues仿真时有一长段费事的初始化仓库的进程,我们没有源码,连设置断点都不可,只能按着F11傻等着。终究当然也是能跳转到片外ROM碑文的。

3)片外ROM寄存由KEIL C编写的HEX文件

这个探索了好久才探索出来!代码如下:

#include

int main()
{
while(1)
{
P1 = 0x33;
P1 = 0xcc;
}
}

首要,我们KEIL C创立的新工程会增加发动代码(startup.a51),这个前面说过用来初始化C言语运转的仓库。我们我的程序是从片内ROM跳转过来运转的,至少现已被初始化了一次,再初始化一次,本来保存的变量全没了,因而在创立工程的时分,越过增加startup.a51这个文件。带来的不便是:程序没有C环境,想要在调试是不或许了。

hex文件是生成了,加载,可是从片内ROM跳转过来后,P1口的内容不是0x33/0xCC而是上一次运转时的0x55/0xAA,why?代码写错了?

检查27C64的内存选用:

0x0000H的内容是:

75 90 33和75 90 CC是往P1端口写入0x33/0xCC—便是现在的代码

再检查0x1000H的内容:

74 AA对应MOV A,#0AAH,F5 90 对应MOV 90,A,显着是前次仿真时的成果!

好吧,现在得想方法把代码加载到0x1000的方位,ORG是用不上了,得用其他方法。

在我的另一篇文章 中说到,INTEL HEX文件格局中每个规矩开端处都有地址,那好先看看这段代码的地址:

:08000F007590337590CC80F868
:03000000020003F8
:0C000300787FE4F6D8FD75810702000F3D
:00000001FF

080000F007 08是这行的长度8字节,后边的0000是这行加载方位,从0x0000开端。shit,难怪加载补上。先手动修正地址,修正玩今后,protues提示HEX校验码不对,仿真失利。无法,只能想其他方法了。加载地址一般是由衔接器在衔接阶段确认的(<程序员的自我涵养>一书中有说到),已然这样,看看keil c在链接时有没有什么参数能够设置:

BL51是KEIL C的衔接器,Code这个方位好像是,那就试试填入0x1000,然后再编译衔接:

:08100C007590337590CC80F85B
:03000000021000EB
:0C100000787FE4F6D8FD75810702100C23
:00000001FF

这次生成的HEX文件,链接地址部分现已被改为0x100C。再仿真一次,不过这次仿真前要把片内ROM的跳转地址改为LJMP 0x1003,要不然指禁绝碑文了不合法指令。

27C64 0x100C处的内容75 90 33对应汇编查办 MOV 90,#33H 75 90 CC对应汇编查办MOV 90,#0CCH这正是c代码的内容,并且P1口的内容也是CC。

至此,从片内ROM跳转到片外ROM完毕。别的估量ISP烧写器或许也是相似的作业原理

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/dianzi/265657.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部