C8051F410单片机BootLoader的实现
实现代码如下:
BootAddr[0]=FlASH_ByteRead(0x0001);
BootAddr[1]=FLASH_ByteRead(0x0002);
FLASH_PageErase(0X0000);//擦除0页
FLASH_ByteWrite(0x0000,0x02);//跳转指令0x02
FLASH_ByteWfite (0x0001,BootAddr [0]);//写入bootloader的开始地址
FLASH_ByteWrite(0x0002,BootAddr[1]);
“用户程序”入口地址的保存:“用户程序”入口地址在程序文件内标示保存在程序的前3个地址字节内,在生成的程序的Hex文件内显示为:
: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!\r\n”);
绝对地址的跳转:当升级完成或在复位后上位机未响应升级握手时,程序即跳往“用户程序”的入口地址,此地址保存于Flash的0x7C00处。
4 上位机软件开发
为了配合单片机内BootLoader的功能实现,需要在计算机端编写对应的下载程序来共同完成固件升级,按照BootLoader的通讯协议,上位机服务程序使用Delphi开发,程序主要针对串口操作,完成握手协议、用户程序文件读取并按照固定格式打包、下载及进度监测等功能,程序的运行界面如图4所示。
5 结束语
BootLoader是一个完善产品应该具备的基本功能,其为基于单片机的产品程序升级提供了很好的解决途径。
通过C8051F410单片机内核的实际产品使用,很好的验证了本文所述方法的实用性、可靠性,同时这种方法也同样适用于其他相似结构的单片机。
当程序具有重要保密需求时,可考虑将原Hex文件进行加密,在下载过程中按照加密规则进行解密,以使程序升级更加安全、通用。
为了使程序功能更加完善,在更新程序前应将单片机内原有旧版本的“用户程序”下载并保存,然后再进行更新,当新升级的程序不能使用时还可恢复为旧版本。
BootLoader C8051F410 引导程序 固件更新 相关文章:
- WinCE系统下BootLoader的开发(04-10)
- 嵌入式linux启动信息完全注释(04-24)
- PIC18单片机的一种新颖的Bootloader设计(03-28)
- 基于WinCE的嵌入式图像采集系统设计(04-20)
- BLOB启动流程分析及引导程序可移植性研究(07-25)
- ARM处理器的位置无关程序设计(09-19)