折腾了几天IAP,遇到一些问题,把它记录下来方便后期参考。
IAP:In-Application-Programming 在程序中编程
即在MCU中先写入一段代码(BootLoader),再通过这段代码烧写另一段代码(应用程序APP),相对IAP有ISP
这个工作涉及到三个部分:
- Boot
- APP
- 升级工具(通常是PC软件)
Boot使用一段之前用过的代码,这样进度上比较有保障,在与升级工具的通讯协议上做了些修改直接就拿来用。
工作正式开展之前先明确几个东西:
Boot: 8K 地址从:0x0800 0000 - 0x0800 1fff
APP : FLASH中运行,地址从: 0x0800 2200 - 0x0801E000 (FLASH共128K,注:APP的起始地址必须是0x100的整数倍)
0x0800 2000 - 0x0800 -2200用于存放APP信息,如:字节数,校验等
升级工具:MFC开发
确定以上信息后开始动手
首先完成升级工具,能与Boot通讯,接下来遇到以下问题:
- APP无法写入到FLASH
跟踪发现数据写入到FLASH错误,往上跟踪发现原来是FLASH删除失败(FLASH在写入之前必须先删除,即FLASH中的数据必须是FF)。为什么无法删除,调试发现原来是状态参数初始化错误,修改后写入正常。
- 从IAP跳转到APP后无法运行
查看APP,向量偏低地址设置正常(这个很关键)
IROM设置也正常(这个也很关键)
以上两点正常后APP没有理由不运行,开始怀疑下载是否正常(由于当前只有个帧内校验),因此在APP写入FLASH后立即读出来查看,果真是写入时数据丢失。找原因,原来是升级工具在处理Boot返回异常出现BUG,BUG修改后APP可正常运行。
- APP虽然运行但发现串口3的数据发送异常,其他均正常
测试发现同样代码ISP模式下运行在0x08000000地址正常但IAP模式下运行在0x08002200则异常,怀疑boot有问题
因此boot启动后使其不做任何操作直接跳转到APP,测试发现一切正常,处理方式在跳转前进行软重起,并在备份缓冲中设置后标记,重启后可直接跳到APP,这样处理后系统正常
总结
采用IAP时需要关注以下几点:
- 确保数据升级的正确性
- APP向量地址
- BOOT与APP互跳时确保环境是干净的