今天突破性进展,成功实现了SC92系列的单区远程升级功能,之前厂家给的DEMO程序存在一些问题,或者说是KEIL5软件的问题,导致FLASH分区内的程序烧写出现了问题。
问题描述:用工具将BOOT和APP程序合并后,FLASH分区的01H-600H为BOOT程序,600H以后为APP程序,等同于先烧录APP程序,再烧录BOOT程序。若先烧录APP程序,再烧录BOOT程序会出现问题,APP程序的HEX文件转为BIN文件后查看发现在00H-600H处也有数据,不过多数为空(00H),将BOOT区程序破坏掉了;合并后的程序烧录后,用IAP去烧写APP程序,出现了类似上面的问题,APP区内数据被破坏,无法正常运行,不过真正的BOOT区没有被破坏,由于IAP写是在600H开始写入的,但是会把APP的BIN文件内的00H-600H的无效数据写入到600H-C00H区域内,正常APP程序应该是从600H处开始写入APP的数据,如图所示
解决方案:KEIL5软件生成的HEX文件转成BIN文件后无法编辑(本来想把前600H的数据删除的,发现只能清零,不能删除),后考虑从BOOT程序入手,对接收到的数据进行处理,IAP收到APP数据的前600H包数据不做处理只计数,对600H以后接收到的数据进行正常写入到芯片FLASH 600H区域及以后。这样处理后IAP写入正常的APP程序便可以正常运行了。此时的BOOT区和APP区与合并后的BOOT-APP一致。
由于SC92系列芯片没有硬件支持读取FLASH内容,导致很多问题只能一点点排除,最开始猜到了APP区程序出现了问题,但是不知道问题出现在哪里,对比合并后的BOOT-APP的BIN文件、BOOT的BIN文件、APP的BIN文件后发现了该问题。具体原因不知道是不是因为KEIL5软件生成的HEX文件出现了问题,还是厂家给的DEMO程序本来就有问题,不过好在最后终于是解决了问题。下一步要研究AB双区备份的问题了。
总结一下,单区的BOOTLOAD方法:
51单片机启动流程:当51单片机上电后,CPU会从CODE区的00H地址开始取得指令,通常00H地址存放的是一条跳转指令,将程序跳转至STARTUP程序中,在STARTUP程序中完成清RAM和一些变量的初始化。完成了以上动作之后程序才会跳转到main函数执行相关程序。为了保证Bootloader功能正常运行,程序需要首先进入Bootloader工程的STARTUP程序和main以完成一些Bootloader功能相关的设置,在完成了设置之后才允许跳转至用户工程的STARTUP文件和main中运行用户的应用代码。
首先分区,分为引导程序BOOT区和用户程序APP区
其次设置中断向量重映射,重映射到用户程序APP区地址开头,接下来的地址存储用户APP区的STARTUP数据(KEIL5工具详细配置见上一篇文章)
最后完善相关配置,如设置更新完成标志、出错标志、双方的串口通讯协议等。