NXP

LPC1752实现IAP(一):要求、方案确定及准备

2019-07-12 12:41发布

前不久接到项目要求:某无人值守设备需要进行在线升级,而ARM与外部通信只有串口,无其他外部触发设备。
经过一早上的文档查阅基本方案确定如下:
将FLASH分为两部分,一部分存放原代码,一部分用于接收串口升级包。升级包写入成功后,切换状态量,执行新代码区域。二次更新时,将串口接收数据置于源代码区域,接收完成切换状态量,执行原代码区。
此方案中,写入FLASH需要特权模式,且因无任何外部相应外部中断,故采用软中断方式实现。
当程序主功能代码完成后发现,主代码产生Bin文件大小50K,经过代码删减和优化等级调整也多达40K(1752FLASH只有64K),完全不能满足之前的方案要求。(此过程中出现了由于优化等级过高而死机的情况。)
和硬件进行商议能否使用PINtoPIN芯片替换原芯片,由于成本原因被否决。
方案一否决。
经过和大牛沟通,提过方案二:
依旧将FLASH分为两部分,第一部分烧写BOOTLOADER用于初始化串口,烧写主要功能代码,烧写完成后跳转至主要功能区运行,当串口出现升级请求时,进入串口中断(BOOTLOADER和主要功能区同一映射地址)进行烧录,完成后跳回。
此方案中,当设备开机时需要判断是否要进行升级,然后跳转,这就需要有一个标志变量,而BOOTLOADER和主要功能代码中都需要初始化栈,就导致两段代码中变量不能共用。于是MDK中修改RAM1的SIZE为15K,剩余1K专门用于存放标志变量,此变量需要用地址直接访问。 方案确定后获取资料,在CSDN内直接搜索CORTEX M3 IAP或者LPC IAP都可以获得相关资料,最后是相关用户手册。直接在站内或者百度搜索即可,此处就不妨链接了。
在BOOTLOADER中,不调用IAP库函数也可以使用进行烧录因为IAP函数的实质是调用出厂时固化在芯片内的内置函数。
详见用户手册32.8节IAP命令。
IAP命令
IAP状态代码如下。
这里写图片描述