C8051F410单片机实现BootLoader方法详解

时间:2014-07-08来源:网络

  :03000000021ECC11

  :0C1ECC00787FE4F6D8FD7581700216A046

  第1行内的内容表示在地址0x0000及向后的两个字节内的内容为0x02ECCC,即为要跳转到Flash地址0x1ECC处去执行“用户程序”的第1条指令,这里我们就要把这个地址保存起来,以便让BootLoader程序在执行完后跳转到这里来运行“用户程序”,即把“用户程序”文件内原来指向地址0x0000~0x0002的3个字节保存到BootLoader指定的一个页单独保存,本应用中是保存到了0x7A00页的前3个字节,实现代码如下:

  #define APP_ADDR_PAGE 0x7C00L∥用户程序的入口地址……

  startAddr=RecData[2]*256+RecData[3];

  if((startAddr+i==0)‖(startAddr+i==1)‖(startAddr+i==2))

  FLASH_ByteWrite(APP_ADDR_PAGE+i,RecData[5+i]);

  startAddr为上位机传来的数据帧内指明的数据应保存的地址

  BootLoader程序区的保护:在更新“用户程序”过程中要防止上位机传来的数据包含与BootLoader程序保存区地址重复的地址段,如果将BootLoader区覆盖将导致下次复位后不能正确执行引导程序。通过以下程序段实现引导区的保护:

  if(startAddr>=0x6000)//与BootLoader冲突

  SendString(“Code overflow!rn”);

  绝对地址的跳转:当升级完成或在复位后上位机未响应升级握手时,程序即跳往“用户程序”的入口地址,此地址保存于Flash的0x7C00处。

  4 上位机软件开发

  为了配合单片机内BootLoader的功能实现,需要在计算机端编写对应的下载程序来共同完成固件升级,按照BootLoader的通讯协议,上位机服务程序使用Delphi开发,程序主要针对串口操作,完成握手协议、用户程序文件读取并按照固定格式打包、下载及进度监测等功能,程序的运行界面如图4所示。

  

 

  5 结束语

  BootLoader是一个完善产品应该具备的基本功能,其为基于单片机的产品程序升级提供了很好的解决途径。

  通过C8051F410单片机内核的实际产品使用,很好的验证了本文所述方法的实用性、可靠性,同时这种方法也同样适用于其他相似结构的单片机。

  当程序具有重要保密需求时,可考虑将原Hex文件进行加密,在下载过程中按照加密规则进行解密,以使程序升级更加安全、通用。

  为了使程序功能更加完善,在更新程序前应将单片机内原有旧版本的“用户程序”下载并保存,然后再进行更新,当新升级的程序不能使用时还可恢复为旧版本。

1 2

关键词: BootLoader C8051F410 引导程序 固件更新

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版