讨论一下51单片机从串口下载程序到外部RAM,再执行的可能性
欢迎各位来讨论,,,有好方案,我来执行我觉得这样可以提高 单片机的寿命(长生不老) http://cache.amobbs.com/bbs_upload782111/files_46/ourdev_679488BAJ7LV.jpg
(原文件名:51板.jpg) 这里 有一个好网站,,,好像有资料
可惜打不开 电路图
http://www.phys.uni-sofia.bg/~evladkov/mcu8051.html
http://cache.amobbs.com/bbs_upload782111/files_46/ourdev_679493LL8EGY.jpg
(原文件名:11.jpg) 电脑通过串口和MCU通讯,MCU再将接受到的程序写入可执行的地方。
但是,并不是所有的MCU都可以实现。哈佛结构的MCU就不能实现,因为哈佛结构的数据总线和指令总线是分开的,它们即使地址相同,但空间也是不同的,主要表现在数据不能够当作代码来运行。(比如51),
当然,这不是绝对的。你只要做部分硬件和软件工作,也可以改变这一点。即往里面写程序时,硬件的结构是数据空间,完成后,把他切入程序空间,此时,写入的数据就可以当程序来运行了。这就是IAP或ISP的思想。现在很多厂商都已经实现了这些。
当然,如果是冯诺依曼结构的MCU,它的数据区和程序区的地址是不同的,此时就有了良好的IAP或ISP基础(如果厂商的设计没有禁止向程序区写数据的话),比如说我们现在用的X86的电脑,程序和数据都是放在硬盘上的,运行时把程序调入指令cache。
看看MCU指令寻址的硬件实现就会很清楚了。 以上 的是了解的。。。。
现在 是实现,,,看看有什么好的办法。。
看这个图,,只是不知道 有什么好办法可以迅速转换的
http://cache.amobbs.com/bbs_upload782111/files_46/ourdev_679506AKYC5Z.jpg
(原文件名:22.jpg) 整个的 介绍文章
点击此处下载 ourdev_679508C76G1B.pdf(文件大小:49K) (原文件名:RAM_Loader_program.pdf) RAM 当ROM 挂到总线上去 下载的时候模拟RAM的总线 往里写数据,然后单片机去执行ROM(实为RAM)里面的程序 早先的一些以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这么干还可以理解,现在芯片似乎没这个必要了吧. 我就昨天实验成功了
还能内部解码hex文件 #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 串口的 信息,,,但是下载不成功
不知道为什么?
http://cache.amobbs.com/bbs_upload782111/files_46/ourdev_679586DBSSF6.jpg
(原文件名:33.jpg) 回复【10楼】maxbiger
串口的 信息,,,但是下载不成功
不知道为什么?
(原文件名:33.jpg)
-----------------------------------------------------------------------
下载后你把程序段放在哪个位置? 何立民出版的那些一共10本书,单片机应用指南1-10?里面好像有类似的介绍文章。 原理 基本都知道的,,,基本不用看书。。
现在有 资料了,,只是有一点问题
就在上面那个网站。。。 发那个 程序源代码上来,,,是汇编的,,,
看不懂,,不知道怎么串口下载的,,,
点击此处下载 ourdev_679688AKC6GL.rar(文件大小:38K) (原文件名:LDDR.rar) 电路 跟代码,,,但是电路打开不了
是orcad的,,不懂打开,,遗憾啊
pcb 是protel的
点击此处下载 ourdev_679689L3WHTM.ZIP(文件大小:18K) (原文件名:8051LOAD.ZIP)
点击此处下载 ourdev_679690D5E2ST.ZIP(文件大小:76K) (原文件名:LOADER.ZIP) PCB 电路
http://cache.amobbs.com/bbs_upload782111/files_46/ourdev_679754FOD0IU.jpg
(原文件名:55.jpg)
点击此处下载 ourdev_679755QSV8TW.rar(文件大小:39K) (原文件名:8051PCB.rar) 早期复旦的SICE仿真器就是这么干的,在RAM中执行。但有甚者,SICE的编译不是PC机完成的,PC机只是一个超级终端,负责显示而已,这一切的一切都是那片i8031AH完成的!我用的是SICE IV。 有人能 读懂那个汇编程序吗??
只要知道 怎么下载,是hex.还是bin
还有怎么执行。。。 mark! mark 学习一下。
页:
[1]