搜索
bottom↓
回复: 21

讨论一下51单片机从串口下载程序到外部RAM,再执行的可能性

[复制链接]

出0入0汤圆

发表于 2011-9-25 13:36:25 | 显示全部楼层 |阅读模式
欢迎各位来讨论,,,有好方案,我来执行

我觉得这样可以提高 单片机的寿命(长生不老)

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2011-9-25 13:41:54 | 显示全部楼层

(原文件名:51板.jpg)

出0入0汤圆

 楼主| 发表于 2011-9-25 13:44:16 | 显示全部楼层
这里 有一个好网站,,,好像有资料

可惜打不开 电路图

http://www.phys.uni-sofia.bg/~evladkov/mcu8051.html


(原文件名:11.jpg)

出10入10汤圆

发表于 2011-9-25 14:19:38 | 显示全部楼层
电脑通过串口和MCU通讯,MCU再将接受到的程序写入可执行的地方。

但是,并不是所有的MCU都可以实现。哈佛结构的MCU就不能实现,因为哈佛结构的数据总线和指令总线是分开的,它们即使地址相同,但空间也是不同的,主要表现在数据不能够当作代码来运行。(比如51),

当然,这不是绝对的。你只要做部分硬件和软件工作,也可以改变这一点。即往里面写程序时,硬件的结构是数据空间,完成后,把他切入程序空间,此时,写入的数据就可以当程序来运行了。这就是IAP或ISP的思想。现在很多厂商都已经实现了这些。

当然,如果是冯诺依曼结构的MCU,它的数据区和程序区的地址是不同的,此时就有了良好的IAP或ISP基础(如果厂商的设计没有禁止向程序区写数据的话),比如说我们现在用的X86的电脑,程序和数据都是放在硬盘上的,运行时把程序调入指令cache。

看看MCU指令寻址的硬件实现就会很清楚了。

出0入0汤圆

 楼主| 发表于 2011-9-25 15:06:03 | 显示全部楼层
以上 的是了解的。。。。

现在 是实现,,,看看有什么好的办法。。

看这个图,,只是不知道 有什么好办法可以迅速转换的


(原文件名:22.jpg)

出0入0汤圆

 楼主| 发表于 2011-9-25 15:07:07 | 显示全部楼层
整个的 介绍文章

点击此处下载 ourdev_679508C76G1B.pdf(文件大小:49K) (原文件名:RAM_Loader_program.pdf)

出0入0汤圆

发表于 2011-9-25 15:13:48 | 显示全部楼层
RAM 当ROM 挂到总线上去 下载的时候模拟RAM的总线 往里写数据,然后单片机去执行ROM(实为RAM)里面的程序

出0入0汤圆

发表于 2011-9-25 15:34:48 | 显示全部楼层
早先的一些以8031以基础的学习板就是这种结构.记得看过这样一种结构.有两片片外ROM,一片是驻留程序,用来实现监控及下载,占低地址空间,另一片是RAM(模拟ROM时序)或是EEPROM啥的占高地址空间,用来存用户程序.下载后监控程序跳转执行就是了.还有一种电路也是两片IC,先把存监控程序的ROM设置为片为ROM,另一片RAM设置为片外RAM.然后通过监控程序下载,把程序存在RAM里.之后能过开关切换,把ROM切掉,再把RAM切成片外ROM(模拟ROM时序).这样下载的程序就可以运行了.

不过现在IC不贵,干嘛这么弄呢?坏了扔掉换一片算了,也比用373啥的搭51总线扩展强.另外这种老方式都特别占I/O,最后一般经常因为I/O不够用8255啥的扩.8031没片内ROM这么干还可以理解,现在芯片似乎没这个必要了吧.

出0入0汤圆

发表于 2011-9-25 15:54:58 | 显示全部楼层
我就昨天实验成功了
还能内部解码hex文件

出0入0汤圆

发表于 2011-9-25 16:05:04 | 显示全部楼层
#include <at89x52.h>
#include <absacc.h>
struct{
unsigned char Size;
unsigned char Mode;
unsigned char CRC;
}Hex;
unsigned char xdata ext[32*1024-1];
                                  unsigned char *app;
union
{
        unsigned int Addr;
        unsigned char ADR[2];
}Hex80;
void (*RunAddr)();
unsigned char code tab[]={
":10203E00AD071FED600BE4FEEEC3947D50F20E80F3\
:01204E00F79A\
:01204F00226E\
:102018007C01EC600EF4F5907FFA12203EEC25E08E\
:10202800FC80EF7C80EC60E8F4F5907FFA12203EAB\
:06203800ECC313FC80EF75\
:030000000220508B\
:0C205000787FE4F6D8FD758107022018A7\
:00000001FF\
"
};
void delayms(unsigned char time)
{
        unsigned char i;
        while(time--)
        for(i=0;i<125;i++);
}
unsigned char Ascii_hex(unsigned char Ascii)
{
        if(Ascii<'A')
        return Ascii-'0';
        else
        return Ascii-0x37;
}
unsigned char AsciiByte(unsigned char Ascii1,unsigned char Ascii2)
{
        unsigned char temp;
        temp=(Ascii_hex(Ascii1)<<4)|Ascii_hex(Ascii2);
        return temp;
}
unsigned char Hex_80(unsigned char *a)
{
        unsigned char temp,i,j=0,cr,add;
        if(a[0]==':')
        {
        Hex.Size=AsciiByte(a[1],a[2]);
        add=Hex.Size;
        Hex80.ADR[0]=AsciiByte(a[3],a[4]);
        add+=Hex80.ADR[0];
        Hex80.ADR[1]=AsciiByte(a[5],a[6]);
        add+=Hex80.ADR[1];
        if(Hex80.Addr==0)
        if(AsciiByte(a[7],a[8])!=0x01)
        Hex80.Addr=0x2015;
        else
        return 255;
        if(Hex.Size==3)
        {
                switch(Hex80.Addr)
                {
                case 0x03:
                Hex80.Addr=0x2000;
                break;
                case 0x0b:
                Hex80.Addr=0x2003;
                break;
                case 0x13:
                Hex80.Addr=0x2006;
                break;
                case 0x1b:
                Hex80.Addr=0x2009;
                break;
                case 0x23:
                Hex80.Addr=0x2012;
                break;
                case 0x2b:
                Hex80.Addr=0x2015;
                break;
                }
        }
        temp=Hex.Size;
//        add=0;       
        j=9;
        for(i=0;i<temp;i++)
        {
        cr=AsciiByte(a[j++],a[j++]);
        ext[Hex80.Addr+i]=cr;
        add+=cr;
        }
        add&=0xff;
        Hex.CRC=~add+1;
        cr=AsciiByte(a[j++],a[j++]);
        if(cr==Hex.CRC)
        return Hex.Size*2+11;
        else
        return 0;
        }
        else
        return 0;
        return 0;
}
void main(void)
{
        unsigned char *b;
        unsigned char *c;
        unsigned char ls;       
        unsigned int la=0;
                b=tab;
        while(b[la]==':')
        {       
        ls=Hex_80(&b[la]);
        if(ls!=255)
        la+=ls;
        else
        la++;
        c=&b[la];
        }
        P1=0xf0;
                delayms(255);
                delayms(255);
                delayms(255);
                delayms(255);
                delayms(255);
                delayms(255);
                delayms(255);
                delayms(255);
        RunAddr=0x2015;
        RunAddr();
        while(1)
        {
                P3_7=~P3_7;
                delayms(250);
                delayms(250);
        }       
}

这是我写的一段测试代码
hex的内容就是一个简单的流水灯

zhe

出0入0汤圆

 楼主| 发表于 2011-9-25 17:45:44 | 显示全部楼层
串口的 信息,,,但是下载不成功

不知道为什么?


(原文件名:33.jpg)

出0入0汤圆

发表于 2011-9-25 17:58:10 | 显示全部楼层
回复【10楼】maxbiger  
串口的 信息,,,但是下载不成功
不知道为什么?

(原文件名:33.jpg)
-----------------------------------------------------------------------

下载后你把程序段放在哪个位置?

出0入0汤圆

发表于 2011-9-25 20:20:52 | 显示全部楼层
何立民出版的那些一共10本书,单片机应用指南1-10?里面好像有类似的介绍文章。

出0入0汤圆

 楼主| 发表于 2011-9-25 20:40:02 | 显示全部楼层
原理 基本都知道的,,,基本不用看书。。

现在有 资料了,,只是有一点问题

就在上面那个网站。。。

出0入0汤圆

 楼主| 发表于 2011-9-26 08:36:35 | 显示全部楼层
发那个 程序源代码上来,,,是汇编的,,,

看不懂,,不知道怎么串口下载的,,,

点击此处下载 ourdev_679688AKC6GL.rar(文件大小:38K) (原文件名:LDDR.rar)

出0入0汤圆

 楼主| 发表于 2011-9-26 08:47:43 | 显示全部楼层
电路 跟代码,,,但是电路打开不了

是orcad的,,不懂打开,,遗憾啊

pcb 是protel的

点击此处下载 ourdev_679689L3WHTM.ZIP(文件大小:18K) (原文件名:8051LOAD.ZIP)
点击此处下载 ourdev_679690D5E2ST.ZIP(文件大小:76K) (原文件名:LOADER.ZIP)

出0入0汤圆

 楼主| 发表于 2011-9-26 14:16:37 | 显示全部楼层
PCB 电路


(原文件名:55.jpg)

点击此处下载 ourdev_679755QSV8TW.rar(文件大小:39K) (原文件名:8051PCB.rar)

出0入0汤圆

发表于 2011-9-26 14:22:51 | 显示全部楼层
早期复旦的SICE仿真器就是这么干的,在RAM中执行。但有甚者,SICE的编译不是PC机完成的,PC机只是一个超级终端,负责显示而已,这一切的一切都是那片i8031AH完成的!我用的是SICE IV。

出0入0汤圆

 楼主| 发表于 2011-9-26 14:35:54 | 显示全部楼层
有人能 读懂那个汇编程序吗??

只要知道 怎么下载,是hex.还是bin

还有怎么执行。。。

出10入0汤圆

发表于 2011-11-27 22:43:58 | 显示全部楼层
mark!

出0入0汤圆

发表于 2012-3-2 10:34:18 | 显示全部楼层
mark

出0入0汤圆

发表于 2014-11-10 16:31:55 | 显示全部楼层
学习一下。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 22:13

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表