一、概述
IAP是通过外设来实现程序升级的一个统称,可以通过的外设有串口、WIFI、蓝牙、网口、无线模块等,只要可以和芯片通讯的都能做为IAP的升级方式。
IAP项目需要三种东西。BOOT、APP和上位机,单独介绍下这几个东西:
BOOT:实现程序的擦除和APP跳转和APP升级。必须实现有两个,一个是和外部升级设备的通讯,另一个是Flash的读写。
APP:运行的程序,必须实现的功能,一个是和外部升级设备的通讯,另一个是Flash的读写,还有一个是软件的重启。(每次在APP运行中进行数据
升级时候,给标志后,重启到BOOT进行升级工作,这样子最省空间,失败就重新刷就好了,又不会变砖)。APP一把需要的是BIN文件。
上位机:用来发送APP给需要升级的芯片的,最好理解的是通过电脑上位机进行串口通讯进行的数据升级。这个升级协议一般都是私有的,根据个人的
习惯和上位机的习惯来定制。现有大家使用比较多的是ymodem的协议有比较多的人在使用。
注意在使用BOOT和APP编程时候有几个东西是共用的,boot地址是0x08000000, IAP大小默认3K,BOOT大小,共用存储空间的大小。
二、实战介绍
使用STM32F1的芯片来实现串口IAP功能,在boot端实现了串口通讯和flash的读写,添加状态机和跳转APP程序,擦除APP区程序,写入APP程序程序;
- 添加状态机在菜单、擦除,跳转和写入之间切换;
- 跳转APP使用下面的函数
int8_t IAP_RunApp(void) { if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)//判断栈定地址值是否在0x2000 0000 - 0x 2000 2000之间 { SerialPutString(" Run to app. "); JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);//ApplicationAddress + 4 即为0x0800 3004 ,里面放的是中断向量表的第二项“复位地址” Jump_To_Application = (pFunction) JumpAddress;//Jump_To_Application指向了复位函数所在的地址 __set_MSP(*(__IO uint32_t*) ApplicationAddress);//设置栈顶地址 用户代码的复位地址付给PC指针 Jump_To_Application(); return 0; } else { SerialPutString(" Run to app error. "); return -1; } }
- 擦除APP
识别需要擦除的大小
按页擦除
- 写入APP