单片机IAP流程
前言IAPIn-Application Programming是指微控制器MCU在程序运行过程中由应用程序自己对内部 Flash 的部分区域进行擦写从而更新固件的技术。空间划分芯片的 Flash 通常被严格划分为Bootloader 区和App 区有时还有参数存储区。启动逻辑设备上电复位后永远先执行 Bootloader。Bootloader 会检查升级标志位若有新固件则执行擦写更新后跳转至 App若无则直接跳转至现有 App 运行。通信介质IAP 的数据来源通常是本地物理接口例如通过 UART、SPI、CAN 或 USB 等总线接收新的固件数据块。提示以下是本篇文章正文内容下面案例可供参考一、单片机bin 文件头部生成版本号#define APP_ADDR_BUFF 0x8005000 #define SET_COMPILE_ADDR(addr) __attribute__((at(addr))) SET_COMPILE_ADDR(APP_ADDR_BUFF) const unsigned char App_Code_Buff[4096] {\var\:\6.3.8\,\kind\:\静音仓主控\};这段代码添加在APP区main函数上面就行 APP_ADDR_BUFF大小是app的起始地址并且这里是占用了4K的空间最终APP运行地址也要APP_ADDR_BUFF基础上再偏移4K。在升级时先看bin文件开头是否是我们想要升级的版本和格式避免放成其他芯片的固件包。二、单片机生成bin文件修改keil配置会在Listings文件夹下生成bin文件升级是以二进制bin文件进行读写的。fromelf.exe --bin --output .\Listings\L.bin !L三、BOOT区配置正常boot首先都会查看我们在芯片最后一个扇区做的标记是否升级以及版本号。不升级跳转到boot升级就接收IAP接口发来的数据并写入到APP区。一定要扇区写。不够的存一个扇区再一起写最后进行整个bin文件的校验看是否升级失败失败还停留在boot区以等待下次升级成功跳转到app区正常运行代码。BOOT区ROM的起始地址和大小这里给BOOT分配了20K的大小BOOT区跳转到APP区的偏移地址四、APP区配置APP区ROM 的起始地址和大小。APP起始地址是boot区起始地址boot区大小APP区程序运行的偏移量和BOOT区跳转到APP区保持一致正常工程没有OTA的时候这里是0x0总结这篇文章只是对BOOT和APP区的设置正常的升级流程可参考我在码云上传的升级Demo。