历史上的今天

今天是:2024年11月19日(星期二)

2018年11月19日 | 51单片机内存扩展:从片内ROM跳转到片外ROM

发布者:EtherealGaze 来源: eefocus关键字:51单片机  内存扩展  片内ROM  片外ROM 手机看文章 扫描二维码
随时随地手机看文章

源于一年前想自己动手给51写个OS,编译选Large模式,调试时整个流程都跑的好好的,可是烧写到片上后得不到预期的效果,后来查书才知道51单片机片上只有4KRom,如果没有扩展片外Rom,当访问4K以外的程序空间,程序指针又会回到最开始执行。参考手册扩展片外Rom后,能访问达64K的程序空间。网上能搜索到的扩展方式都是将EA引脚接地,让MCU上电后从外部ROM开始执行。但查看芯片手册,明明说EA为高时,程序从片内ROM执行,当执行到0x1000以上地址时(标准51单片机),会跳转到片外ROM执行。按网上的做法,为了扩展个片外ROM,片内的基本ROM都不用了,有点浪费了,于是开始找资料如何从片内跳转到片外执行。


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


2.png


此处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执行程序。


3.png


[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_ARTICLE_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的内容是:

4.png


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


再查看0x1000H的内容:

5.png


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校验码不对,仿真失败。无奈,只能想其他办法了。加载地址一般是由连接器在连接阶段确定的(


1.png


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


:08100C007590337590CC80F85B


:03000000021000EB


:0C100000787FE4F6D8FD75810702100C23


:00000001FF


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


6.png


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

 

至此,从片内ROM跳转到片外ROM结束。另外估计ISP烧写器可能也是类似的工作原理


关键字:51单片机  内存扩展  片内ROM  片外ROM 引用地址:51单片机内存扩展:从片内ROM跳转到片外ROM

上一篇:教你给51单片机扩展片外RAM
下一篇:51单片机stack堆栈

推荐阅读

德国高科技设备制造商 Manz 集团宣布成为法国工业集团 Compagnie de Saint-Gobain 的技术合作伙伴,开发了用于隔热玻璃表面处理的全新激光制程;此外激光专业大厂 TRUMPF GmbH + Co. KG 也参与了这项为期多年的项目。Manz 薄膜太阳能事业部长年以来累积的专业知识也将充分运用于 ACTILAZ™ 的实施。 ACTILAZ™ 使用“激光退火”,有效提高...
特斯拉正在考虑德国建厂,近日,有德国媒体透露了更多有关特斯拉德国工厂的细节。 据德国媒体周日最新报道,特斯拉公司计划投资 40 亿欧元(44 亿美元)在柏林建设这座工厂,该工厂每年将生产多达 15 万辆汽车。 据报道,在马斯克宣布消息之后,德国政府许多官员就表示将会给特斯拉柏林工厂提供帮助。德国媒体报道称,如果在获得欧盟批准的条件下,德国...
爱立信旗下研究部门ConsumerLab最新发布的《5G消费潜力报告》显示,到2030年,全球5G消费市场价值将达到31万亿美元。该报告估计,通信服务提供商(CSP)可以赚到其中的3.7万亿美元,随着新的近场数字服务机会的出现,这一数字可望进一步增加。该报告指出,通过积极捆绑和营销5G使用案例,到2030年,仅数字服务收入就可为CSP带来高达1310亿美元的收入。其中...
英伟达收购ARM正遭遇重重阻碍。几日前,出于反垄断和国家安全的考虑,英国政府预计将下令对英伟达以300亿英镑收购英国芯片设计公司ARM的计划进行深入调查。而据金融时报最新报道,美国监管机构对这项交易也提出了潜在的反对意见。虽然越来越多的迹象表明全球监管机构可能试图阻止英伟达的这笔交易,但英伟达表示,它仍然相信此次收购对ARM、其被许可方和整...

史海拾趣

问答坊 | AI 解惑

UHF FM/FSK无线接收芯片CMX018的原理及应用

cmx018是cml公司推出的新型fm/fsk无线接收芯片,它内含双增益模式的低噪声放大器、2级阵频变换器(混频器)、集成振荡器、限幅放大器、温度被偿接收信号强度指示器、fm/fsk解调器和零功率模式控制等电路,能与cmx017配套使用以实现uhf的无线连接。 ...…

查看全部问答∨

工程师必看:做完项目之后的九问!

及时的自我总结,从技术上讲,每作完一个项目/电路设计,或者项目时间比较长,就在一段工作时间之后,好好小结一下最近的工作成绩,我觉得这是很有必要的。根据我个人的体会,可以参照下面的几点去总结。 另外我还想说,项目的完成,是公司的获得, ...…

查看全部问答∨

mass storage 设备异常,(错误代码10,设备无法启动),请问这个可能是什么原因?

mass storage 设备异常,(错误代码10,设备无法启动),请问这个可能是什么原因? 急在线等~~…

查看全部问答∨

push方法返回一个或多个错误行

我在做RDA时,Pull一张表到本地是没有问题的,而且在本地修改数据也使没 有问题的(我在模拟器的查询分析器里面可以看到)。但是当我把修改后的表Push 回PC机上的数据库的时候,出现错误。     Push方法返回一个或多个错误行。 ...…

查看全部问答∨

CE 调试问题

各位大侠好:     小弟又有事情求教了。     无论是在PB中还是在eVC ++中,都有远程调试的功能。问:怎么样才可以建立远程连接呢?         我尝试过 用 ActiveSync,我想应该是用同步方式连接吧,但 ...…

查看全部问答∨

播放音乐时,随机出现持续噼啪声

播放音乐时,随机出现持续噼啪声 加大DMA Buffer后,此问题得到解决,但是引入了另外一个问题: 播放视频文件时很卡,出现很明显的停顿 大家遇到过类似的问题么?…

查看全部问答∨

中断向量的问题

我使用EWARMv4 编译环境, 如何实现代码在内部Flash内, 中断向量在内部RAM中?…

查看全部问答∨

TAIHU PPC405EP VXWORKS 开发请教

我新接触POWERPC,找我朋友借了一块PPC405EP TAIHU的开发板,他给我的资料都是UBOOT和LINUX的,我现在想用VXWORKS,可是在Tornado 2.2下没找到支持PPC405EP的BSP,请问谁有相关资料或者SDK发给我一份,我学习下,再次感谢!…

查看全部问答∨

BeagleBone外围电路PCB制版归来,有图有真相,预订从速!

板子已经制版回来了,废话少说,有图有真相! 正面: 反面: 局部特写:…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved