香港挂牌全篇怎么看
您所在的位置:香港正版挂牌图库 > 香港挂牌全篇怎么看 >

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

发布时间:2019-06-17

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

  片上只有4KRom,如果没有扩展片外Rom,当访问4K以外的程序空间,程序指针又会回到最开始执行。参考手册扩展片外Rom后,能访问达64K的程序空间。网上能搜索到的扩展方式都是将EA引脚接地,让MCU上电后从外部ROM开始执行。但查看芯片手册,明明说EA为高时,程序从

  执行。按网上的做法,为了扩展个片外ROM,片内的基本ROM都不用了,有点浪费了,于是开始找资料如何从片内跳转到片外执行。

  此处EA脚没有接地。如果想简单粗暴的加电时从片外ROM执行,EA引脚接地,双击U2(27C64)Image File选Hex然后就可以了,这不是本文的重点,略过,后面可能会写到。

  跳转,最简单的方式用LJMP,当然也可以用把跳转地址压入栈,然后ret过去,不过这种方式我没尝试成功。

  考虑到汇编写代码太苦逼,写规模大一点的代码还得靠C,因此程序的效果是:main函数在片内执行,流水灯代码存放在片外Rom,main函数跳转到流水灯中执行。

  因为是一种尝试,所以从写汇编代码开始(加载地址容易控制:ORG指定即可)

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

  这个连接中有相关的设置 如果不做设置,连接时会有警告找不到C_STARTUP,也不会运行到代码中。

  调试运行,由于KEIL C加了启动代码,在protues仿真时有一长段麻烦的初始化堆栈的过程,因为没有源码,连设置断点都不行,只能按着F11傻等着。最终当然也是能跳转到片外ROM执行的。

  首先,由于KEIL C创建的新工程会添加启动代码(startup.a51),这个前面说过用来初始化C语言运行的堆栈。因为我的程序是从片内ROM跳转过来运行的,至少已经被初始化了一次,再初始化一次,原本保留的变量全没了,因此在创建工程的时候,跳过添加startup.a51这个文件。带来的不便是:程序没有C环境,想要在调试是不可能了。

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

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

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

  080000F007 08是这行的长度8字节,后面的0000是这行加载位置,从0x0000开始。shit,手机报码。难怪加载补上。先手动修改地址,修改玩以后,protues提示HEX校验码不对,仿真失败。无奈,只能想其他办法了。加载地址一般是由连接器在连接阶段确定的(一书中有提到),既然这样,看看keilc在链接时有没有什么参数可以设置:

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

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

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



香港挂牌彩图| 香港现场开奖记录结果| 香港马会开奖资料| 六合彩开奖网| 四季肖| 168开奖现场管家婆| 小鱼儿| www.336116.com| 211345.com| 报码室| 新天福集团| www.kk99999.com|