本帖最后由 Kalman 于 2021-11-16 01:00 编辑

IAP(In ApplicationProgramming)是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。通常在用户需要实现IAP功能时,即用户程序运行中作自身的更新操作,需要在设计固件程序时编写两部分代码,第一部分IAP代码不执行正常的功能操作,而只是通过某种通信方式(如USB、USART等)接收程序或数据,执行对第二部分APP代码的更新;第二部分APP代码才是真正的功能代码。这两部分代码都同时烧录在User Flash中,当芯片上电后,首先是第一部分IAP代码开始运行,操作流程如下:
1)检查是否需要对第二部分APP代码进行更新
2)如果不需要更新则转到4)
3)执行更新操作
4)跳转到第二部分APP代码执行
通常产品出厂时,将两部分代码的.hex文件合并成一个烧录,后续需要对第二部分APP代码升级更新时再通过第一部分IAP代码更新。

IAP+APP执行流程
IAP.png             
系统上电,从0x08000004处取出复位中断向量地址,执行复位中断函数后跳转到IAP的main函数(标号1所示),在IAP的main函数判断升级条件,如果升级条件满足(有按键按下时)则进行升级,否则强制跳转到0x08000004+N+M处(标号2所示),即APP用户程序中断向量表的复位中断地址处,执行复位中断,最后跳转到APP用户程序main函数中(标号3所示),运行用户应用程序。当APP程序中发生中断请求后,程序跳转到APP的中断向量表中取出APP的中断服务函数入口地址,再跳转到APP的中断服务函数中执行(标号4、5所示),执行完中断函数后再返回到main函数中来(标号6所示)。所以在执行应用程序的时候,需要先设置中断向量表的偏移。要不然APP用户程序中的中断还是会去原来(IAP程序)的中断向量表中获取中断服务函数,这可能会导致运行死机的情况出现。对于步骤4、5,在APP程序main函数的执行过程中,当CPU得到一个中断请求时,PC指针本来应该跳转到0x08000004处(IAP中)的中断向量表,由于设置了中断向量表偏移量为N+M,因此PC指针被强制跳转到0x08000004+N+M处的中断向量表中得到相应的中断函数地址,再跳转到相应APP程序的中断服务函数,执行结束后返回到main函数中。                        

Ymodem协议
Ymodem协议详解可参考https://blog.csdn.net/huangdenan/article/details/103611081,介绍的不错。

Flash分区
MM32F3277 Flash容量大小为512K,地址范围为0x08000000~0x0807FFFF。如图把Flash分为两部分,第一部分存放IAP执行代码,设置大小为64K,地址范围为:0x08000000~0x0800FFFF;第二部分存放APP用户代码,设置大小为448K,地址范围为0x08010000~0x0807FFFF。需要注意的是由于Flash擦除时是按页擦除,设置两部分存放区容量大小时,容量大小必须是页大小的整数倍,MM32F3277页大小是1K,不同型号页大小可能不同,具体使用时需要查阅DS。(STM32F1系列256K以下页大小为1K,256K及以上页大小为2K)
IAP - 副本.png

设置Keil中IAP代码地址、空间
IAP起始地址为0x08000000,存放IAP的容量大小根据IAP的实际大小进行修改,这里我们取0x10000
1.png
IAP代码中设置跳转到APP用户代码的起始地址0x08010000。
2.png

设置Keil中APP代码地址、空间
APP起始地址为0x08010000,存放APP的空间大小为0x80000-0x10000=0x70000
3.png

设置Keil编译生成.bin文件
Optionsfor Target—>User—>After Build/Rebuild—>Run 1#添加 fromelf --bin".\OBJ\@L.axf" --output ".\OBJ\@L.bin"
4.png

设置超级终端
选择对应的串口
5.png
配置串口波特率、数据位、校验位、停止位等参数
6.png
点击确定后,显示界面
7.png
按下开发板K4按键后,开发板上电,检测到有按键按下时,显示如下
8.png
键盘输入1,等待发送文件
9.png
选择“传送”—>“发送文件”,显示如下对话框
10.png
浏览选择要烧录的用户APP.bin文件,协议选择Ymodem
11.png
点击发送后,开始传送.bin文件
12.png
传送并烧录完成
13.png
执行用户程序
14.png
测试例程
MM32F3270_IAP_UART.zip (577.34 KB, 下载次数: 18)