关于STM32之IAP与APP互跳转重点

大家会很好奇IAP和APP是如何实现跳转的,如果你是需要完成这个任务的话,肯定已经了解了不少的知识,我就不重复别人的博客进行分析了,话不多说,直接来吧。
首先,如果你是使用IAR软件的话,你一定要去看看自己生成的.map文件是否有Reset_Handle这个地址,我在我现有的IAR里面是生成不出来的,可以在工程文件夹里面直接搜索.map文件进行查看,所以,下面我都是使用KEIL进行测试。
这个就是KEIL生成出来的这个复位中断地址,简单说一下这个就是跳转的中断,不要好奇,因为这个只要在APP文件中设置正确,自动会续寻找到这个地址。在这里插入图片描述
1.设置IAP,我使用的是STM32F103VET6,我想应该大概STM32Fx系列的都是一样的吧,哈哈哈哈,我猜的。还有一些.bin文件的生成我就不在这里多说了,去参考一下别人的,都一大堆。
在这里插入图片描述
2.记住,如果要实现跳转,一定要在IAP和APP两个程序都打开总中断,在跳转IAP或者APP前都要关闭总中断,下面会说到跳转到IAP的。我这里的Uart_Recevid是我使用串口通讯来进行通讯这里是发送0x77跳到APP程序,那边是发送0x88跳到IAP程序(如果使用串口的话,一定要两个程序的串口都要配置正确,不然收不到指令也不会运行)

3.对于网上你们也搜索到一些差不多的东西,当然我的也一样,不要问为什么,直接用就行,都是OK的,如果要去专研,可以去看看STM32内存存储的一些问题。我这里的注释都是乱码,算了,去别的地方也可以看到的啦。

void iap_write_appbin(u32 appxaddr,u8 *appbuf,u32 appsize)
{
	u16 t;
	u16 i=0;
	u16 temp;
	u32 fwaddr=appxaddr;
	u8 *dfu=appbuf;
	for(t=0;t<appsize;t+=2)
	{						    
		temp=(u16)dfu[1]<<8;
		temp+=(u16)dfu[0];	  
		dfu+=2;
		iapbuf[i++]=temp;	    
		if(i==1024)
		{
			i=0;
			STMFLASH_Write(fwaddr,iapbuf,1024);	
			fwaddr+=2048;//Æ«ÒÆ2048  16=2*8.ËùÒÔÒª³ËÒÔ2.
		}
	}
	if(i)STMFLASH_Write(fwaddr,iapbuf,i);//½«×îºóµÄһЩÄÚÈÝ×Ö½Úд½øÈ¥.  
}

void iap_load_app(u32 appxaddr)
{
	if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)	//¼ì²éÕ»¶¥µØÖ·ÊÇ·ñºÏ·¨.
	{ 
		jump2app=(iapfun)*(vu32*)(appxaddr+4);		//Óû§´úÂëÇøµÚ¶þ¸ö×ÖΪ³ÌÐò¿ªÊ¼µØÖ·(¸´Î»µØÖ·)		
		MSR_MSP(*(vu32*)appxaddr);					//³õʼ»¯APP¶ÑÕ»Ö¸Õë(Óû§´úÂëÇøµÄµÚÒ»¸ö×ÖÓÃÓÚ´æ·ÅÕ»¶¥µØÖ·)
		jump2app();									//Ìøתµ½APP.
	}
}		

到这里 IAP程序已经搞定了,下面说说APP的配置。
4.APP的配置,重点是要配置对.bin文件哦,因为这个是要生成bin文件的,配置不对是跳不进去的。
在这里插入图片描述

![在这里插入图片描述](https://img-blog.csdnimg.cn/0cd270a9df414bb984106ae4b2cea8b9.png)
6.之后进入循环呗:
![在这里插入图片描述](https://img-blog.csdnimg.cn/cf0fcb97f1554a2999c1ec0224f46079.png)

7.注意这个跳到IAP的函数内容会不同,仔细看看哦

```c
void app_load_iap(void)
{
       int a  = 0;
	u32 JumpAddress;
	iapfun JumpToBootload;                  

	if (((*(__IO uint32_t*)STM32_FLASH_BASE) & 0x2FFE0000) == 0x20000000)  
	{             
      
		/*Jump to user application*/
		JumpAddress = *(__IO u32*)(STM32_FLASH_BASE+4);
		JumpToBootload  = (iapfun)JumpAddress;
		/*Initialize user application's Stack pointer*/
		__set_MSP(*(__IO u32*)STM32_FLASH_BASE);
    __disable_irq();  
		JumpToBootload();
	}
}

8.基本就配置完成啦。另外补充一下吧,调试过程的这个JumpAddress一定对应的是你要跳转的那个工程文件的复位中断地址Reset_Handle,可以自己去尝试一下。记得去map文件寻找能不能找到这个复位中断,如果生成不了,是解决不了问题的。
如果这个
9.有一个简单的办法,就是清除掉Flash后,可以先download APP程序,你会发现没有现象,然后再去写入IAP程序,就会自动跳转到APP程序啦。亲测可以正确使用的,还有一个重点,测试文件都不可以很大,不允许超过芯片RAM的大小,尽量大家用超级简单的点灯或者亮屏来测试,不然你都不会发现是什么原因跑不过去,避开这些坑,你一定行。

10.对于太大的bin文件,已经超过了RAM储存的容量,比如有300KB,而芯片的RAM只有64KB,你必须要采用分包的方式去处理,就相当于将300KB的东西打包成10个30KB的进行写入,如果你们想看的话,之后可以一起探讨一下呗


  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值