新闻中心

EEPW首页>嵌入式系统>设计应用> 8051单片机在线升级软件的方法

8051单片机在线升级软件的方法

作者: 时间:2012-03-28 来源:网络 收藏

3设计

装载程序主要有两个功能,其一是要将E2PROM的内容拷贝到片外RAM中;其二是要响应上位机的更新程序命令并接收代码内容更新E2PROM。

  #define uchar unsigned char
  #define uintunsigned int
  sbit WDI=P1^7;
  sbit RESET=P1^6;/*声明外部I2C读写函数*/
  extern void I2c_wr(uchar addh,uchar addl,uchar buf[],uchar num,bit wr);
  void main(void) {
    uchar data addh,addl;
    uchar data buf[16];
    uchar j;
    uint I=0;
    XBYTE[0x1fff]=0;/*清除程序拷贝好标志*/
    WDI=~WDI; /*喂狗*/
    system_init(); /*初始化*/
    for(addh=0;addh0x10;addh++) {
      for(addl=0;addl0xf0;addl+=16) {/*读入E2PROM地址addh:addl16字节内容到buf*/
        I2c_wr(addh,addl,buf,16,1);
        for(j=0;j16;j++)/*将代码写入外部绝对地址*/
          XBYTE[I++]=buf[j];
      }
        I2c_wr(addh,0xf0,buf,16,1);
        for(j=0;j16;j++)
          XBYTE[I++]=buf[j];
        WDI=~WDI;
    }
    if(shake_hand==1) {/*shake_hand由串口中断收到握手命令后置1*/
      rcv_data(); /*该函数负责从上位机获取程序*/
    }
    XBYTE[0x1fff]=0xaa;/*置程序拷贝好标志*/
    RESET=0;/*复位并执行外部RAM内的程序*/
    while(1);
  }


为了确保程序在装载完全正确后才开始执行,装载程序使用了外部RAM 0x1fff地址内容作为装载成功的标志。那么相应的应用程序应判断此标志后再执行。

调试结束的装载程序烧结在中,而实际的系统应用程序则存储于外部E2PROM内。应用中,将直接焊装在电路板上,而编程者只需通过串口或者其他形式的通信链路甚至无线的方式来更改升级目标应用程序。

4 几点讨论 

在实际应用中,最好使用严格的校验及复查来确保程序拷贝无误。 另外, 在从上位机下载程序时应该制定一个可靠的通信协议,从而保证获取的程序完全正确。单片机在接收到上位机的代码数据时,不要急于写入外部E2PROM,而应先全部放在外部RAM区内,待代码获取完毕并且通过校验检查后再把RAM的内容一次性写入E2PROM。这样防止在获取程序的时候通信异常中断而E2PROM内将没有一个可以执行的程序。

从原理上看,如果片外RAM是非易失的,就可以不再使用E2PROM。但是这样系统成本变高且可靠性降低,因为当单片机程序跑飞时很容易产生MOVX指令而改变RAM区的内容,造成程序永久性不可恢复。而在程序跑飞的情况下,很难产生符合外部E2PROM接口的I2C写时序,同时E2PROM还有写保护功能。

虽然上述能使8051单片机系统具有远程升级代码的能力,但是程序装载过程将使系统的启动时间延长数秒,在对启动时间要求较短的场合不能应用本文中介绍的

参考文献
1 何立民.MCS51系列单片机应用系统设计.北京:北京航空航天大学出版社,1990
2 Atmel公司器件手册,2003


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭