# 固件升级功能 ```C IAP全局状态: #define B_IAP_STA_NULL (0) //空闲状态 #define B_IAP_STA_START (1) //开始获取新固件 #define B_IAP_STA_READY (2) //新固件已准备好 #define B_IAP_STA_FINISHED (3) //新固件已更新完成 ``` ## 应用程序接收新固件 ### 升级过程图 ![输入图片说明](../_static/IAP.png) ### 状态切换图 ![](../_static/IAP_APP.png) 粗黑线是应用程序中的状态切换,点线是启动程序中的状态切换。 ### 异常情况 ③ :传入的固件名与已有固件名不同,或者文件长度超过了代码空间尺寸,则忽略此次升级。 ⑥ :CRC32校验失败,终止升级,状态复位。 ⑨ :启动程序,检测到状态连续三次为FINISHED,表示新固件没有运行起来,则启用备份固件,再次更新固件。 ⑩ :搬运代码完成后,校验错误。重新校验收到的新固件。校验有问题则使用备份程序。 ### 风险 如果没有备份程序,涉及到启用备份程序的地方就会让设备变砖。 ​ ## 启动程序接收新固件 ### 升级过程图 ![输入图片说明](../_static/upgrade.png) ### 状态切换图 ![](../_static/IAP_BOOT.png) 粗黑线是应用程序中的状态切换,点线是启动程序中的状态切换。 ### 异常情况 ③ :传入的固件名与已有固件名不同,或者文件长度超过了代码空间尺寸,则忽略此次升级。 ⑦ :CRC32校验失败,有暂存区时切换为NULL状态,然后跳转到应用程序,反之继续停留在START状态重新请求固件 ⑪ :搬运代码完成后,校验错误后再重新搬运一次。校验依然有问题则切换到START状态重新请求固件。 ⑫ :再次进入启动程序时检测到为FINISHED状态,且连续三次,表示新固件没有运行起来,切换到START状态重新请求固件。