一、IAP简介

IAP是应用编程,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级,后续产品发布后,更新程序我只需要把.bin文件通过串口发送给芯片就可以执行更

新,很方便产品的维护工作。对于应用IAP的项目,整个项目需要有两个项目的代码,第一个项目程序不执行正常的功能,通过串口或者USB等通信来接收对第二个项目代码,并且执行更新第二

部分的代码,称这个程序为Bootloader程序,第二个项目的程序是我们产品要实现的功能程序,即产品功能程序。针对我的工程项目,当芯片上电后,首先会执行Bootloader程序,并且会执行以

下操作:

1、通过按键来判断是否需要对产品功能程序进行更新
2、不更新则跳转到4运行产品功能程序。
3、进入更新功能程序状态,要等待串口发送过来的产品功能程序, 接收成功后并开始功能程序的更新工作。更新完成后自己跳转到4运行产品功能程序
4、进入到产品的功能程序。

Bootloader程序一般使用JLINK下载或者ISP串口下载到芯片里边,而产品的功能程序则是通过设置后,KEIL在编译后把.axf文件转为.bin文件,更新产品功能程序则是通过串口软件把.bin文件发送

给Bootloader程序,就可以进行产品功能。

二、IAP 程序运行流程

STM32芯片正常运行的流程如下:

加入IAP程序后,STM32芯片运行的流程如下:

三、IAP配置

1、Bootloader程序:

我使用的芯片STM32F407VET6,在Bootloader程序是参考正点原子的源代码修改的,我通过一个拨码开关来判断是不是要更新产品功能程序,如果要更新则拨到ON,程序会通过串口等待接收

要更新的代码,接收完成后会自己更新,更新完成后自动进入到产品功能程序里边,下次需要更新则需要重新上电或者复位。程序代码如下:

while(1)
	{
	 	if(USART_RX_CNT)
		{
			if(oldcount==USART_RX_CNT)//新周期内,没有收到任何数据,认为本次数据接收完成.
			{
				applenth=USART_RX_CNT;
				oldcount=0;
				USART_RX_CNT=0;
				printf("用户程序接收完成!\r\n");
				printf("代码长度:%dBytes\r\n",applenth);
				flagtest=0;
			}
			else 
				oldcount=USART_RX_CNT;			
		}
		t++;
		delay_ms(10);
		if(t==30)
		{
			LED0=!LED0;
			t=0;
		}	  	 
		key=KEY_Scan(0);
		if(key==1)	//按键按下
		{
			if(applenth&&flagtest==0)
			{
				flagtest=1;
				printf("开始更新固件...\r\n");	
 				if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
				{	 
					iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,applenth);//更新FLASH代码  
					printf("固件更新完成!\r\n");	
				}else 
				{ 
					printf("非FLASH应用程序!\r\n");
				}
 			}
			else 
			{
				printf("没有可以更新的固件!\r\n");
			}							 
		}
		else
		{
			flagtest=0;
			printf("开始执行FLASH用户代码!!\r\n");
			if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
			{	 
				iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
			}else 
			{
				printf("非FLASH应用程序,无法执行!\r\n"); 
			}									 
		} 
	}  

2、产品功能程序的IAP配置

因为加入IAP功能后,实际上我们的程序由两个部分组成,一个是Bootloader程序,另一个的产品功能程序。那么我们会在芯片的Flash中设置64k来保存bootloader程序,64k以后存储产品的功

能程序,如下图所示,IROM1的起始地址一般为0X08000000,大小为0X80000(512k),STM32F407VET6的flash为512k,而对于bootloader程序预留了64K的空间,对于产品功能程序的起始地

址为0X08010000,即偏移量0X10000(64k)预留给bootloader,而0X8010000开始以后都是产品功能程序的存储空间。

另外,在程序中还需要设置产品功能程序中断向量表的起始地址,表示flash是从这个新设置的起始地址开始的。一般放在main函数的最开头。

SCB->VTOR = FLASH_BASE | 0x10000;//设置偏移量

我们要知道更新产品程序是通过串口发送bin文件给bootloader项目的程序,我们要怎么配置把产品功能程序生成.bin文件?在KEIL环境中设置,如下图所示,name of Executable为axf文件的名

字,实际上.bin文件是通过.axf文件转换的。

图中输入的内容为D:\software\keil\ARM\ARMCC\bin\fromelf.exe --bin -o E:\IMI_101项目\IMI_101\MDK-ARM\IMI_101.bin E:\IMI_101项目\IMI_101\MDK-ARM\IMI_101\IMI_101.axf

其中fromelf.exe为安装KEIL软件包含的软件,主要用于把axf文件转换为bin文件。
E:\IMI_101项目\IMI_101\MDK-ARM\IMI_101.bin 为生成的bin文件存放的路径和文件名字
E:\IMI_101项目\IMI_101\MDK-ARM\IMI_101\IMI_101.axf 为axf文件所在的路径和文件名

产品功能程序在编译无报错即就可以生成IMI_101.bin文件。

四、参考文档

http://www.docin.com/p-972460815.html

by 羊羊得亿
2017-11-23 ShenZhen