大家会很好奇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;
}
}
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);
jump2app();
}
}
到这里 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的进行写入,如果你们想看的话,之后可以一起探讨一下呗
|