7.8日BOOTLOAD总结(3)
今天突破性进展,成功实现了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工具详细配置见上一篇文章)
最后完善相关配置,如设置更新完成标志、出错标志、双方的串口通讯协议等。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现