maxbiger 发表于 2011-9-25 13:36:25

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

欢迎各位来讨论,,,有好方案,我来执行

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

maxbiger 发表于 2011-9-25 13:41:54

http://cache.amobbs.com/bbs_upload782111/files_46/ourdev_679488BAJ7LV.jpg
(原文件名:51板.jpg)

maxbiger 发表于 2011-9-25 13:44:16

这里 有一个好网站,,,好像有资料

可惜打不开 电路图

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

http://cache.amobbs.com/bbs_upload782111/files_46/ourdev_679493LL8EGY.jpg
(原文件名:11.jpg)

yangyi 发表于 2011-9-25 14:19:38

电脑通过串口和MCU通讯,MCU再将接受到的程序写入可执行的地方。

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

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

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

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

maxbiger 发表于 2011-9-25 15:06:03

以上 的是了解的。。。。

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

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

http://cache.amobbs.com/bbs_upload782111/files_46/ourdev_679506AKYC5Z.jpg
(原文件名:22.jpg)

maxbiger 发表于 2011-9-25 15:07:07

整个的 介绍文章

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

sddp001 发表于 2011-9-25 15:13:48

RAM 当ROM 挂到总线上去 下载的时候模拟RAM的总线 往里写数据,然后单片机去执行ROM(实为RAM)里面的程序

armrat 发表于 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这么干还可以理解,现在芯片似乎没这个必要了吧.

q451993547 发表于 2011-9-25 15:54:58

我就昨天实验成功了
还能内部解码hex文件

q451993547 发表于 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;
                                  unsigned char *app;
union
{
        unsigned int Addr;
        unsigned char ADR;
}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==':')
        {
        Hex.Size=AsciiByte(a,a);
        add=Hex.Size;
        Hex80.ADR=AsciiByte(a,a);
        add+=Hex80.ADR;
        Hex80.ADR=AsciiByte(a,a);
        add+=Hex80.ADR;
        if(Hex80.Addr==0)
        if(AsciiByte(a,a)!=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,a);
        ext=cr;
        add+=cr;
        }
        add&=0xff;
        Hex.CRC=~add+1;
        cr=AsciiByte(a,a);
        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==':')
        {       
        ls=Hex_80(&b);
        if(ls!=255)
        la+=ls;
        else
        la++;
        c=&b;
        }
        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

maxbiger 发表于 2011-9-25 17:45:44

串口的 信息,,,但是下载不成功

不知道为什么?

http://cache.amobbs.com/bbs_upload782111/files_46/ourdev_679586DBSSF6.jpg
(原文件名:33.jpg)

q451993547 发表于 2011-9-25 17:58:10

回复【10楼】maxbiger
串口的 信息,,,但是下载不成功
不知道为什么?

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

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

yuanbangyin 发表于 2011-9-25 20:20:52

何立民出版的那些一共10本书,单片机应用指南1-10?里面好像有类似的介绍文章。

maxbiger 发表于 2011-9-25 20:40:02

原理 基本都知道的,,,基本不用看书。。

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

就在上面那个网站。。。

maxbiger 发表于 2011-9-26 08:36:35

发那个 程序源代码上来,,,是汇编的,,,

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

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

maxbiger 发表于 2011-9-26 08:47:43

电路 跟代码,,,但是电路打开不了

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

pcb 是protel的

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

maxbiger 发表于 2011-9-26 14:16:37

PCB 电路

http://cache.amobbs.com/bbs_upload782111/files_46/ourdev_679754FOD0IU.jpg
(原文件名:55.jpg)

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

weichy 发表于 2011-9-26 14:22:51

早期复旦的SICE仿真器就是这么干的,在RAM中执行。但有甚者,SICE的编译不是PC机完成的,PC机只是一个超级终端,负责显示而已,这一切的一切都是那片i8031AH完成的!我用的是SICE IV。

maxbiger 发表于 2011-9-26 14:35:54

有人能 读懂那个汇编程序吗??

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

还有怎么执行。。。

dgtg 发表于 2011-11-27 22:43:58

mark!

ni_fogota 发表于 2012-3-2 10:34:18

mark

what007 发表于 2014-11-10 16:31:55

学习一下。
页: [1]
查看完整版本: 讨论一下51单片机从串口下载程序到外部RAM,再执行的可能性