目录
1、需要两份程序
BootLoader和App程序,两份程序均可以通过jlink下载,只需要将下载地址修改一下即可:


2、在BootLoader中的跳转函数
#define APP_FLASH_ADDR 0x8008000
iap_load_app(APP_FLASH_ADDR);
//#include "include.h"
#include "iap.h"
#include "main.h"
//Ìø×ªµ½Ó¦ÓóÌÐò¶Î
//appxaddr:Óû§´úÂëÆðʼµØÖ·.
typedef void (*iapfun)(void);//¶¨ÒåÒ»¸öº¯ÊýÀàÐ͵IJÎÊý.
iapfun jump2app;
//ÉèÖÃÕ»¶¥µØÖ·
//addr:Õ»¶¥µØÖ·
__asm void MSR_MSP(u32 addr)
{
MSR MSP, r0 //set Main Stack value
BX r14
}
/******************************************************************************
* Function name £º iap_load_app
* Function describe £º Ìø×ªµ½app³ÌÐò¡£
* Input £º appxaddr£ºapp³ÌÐòµÄµØÖ·¡£
* Output £º No
* Illustration £º
* Revise £º
* Existing problems : No
*****************************************************************************/
void iap_load_app(u32 appxaddr)
{
if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //¼ì²éÕ»¶¥µØÖ·ÊÇ·ñºÏ·¨.
{
jump2app=(iapfun)*(vu32*)(appxaddr+4);//Óû§´úÂëÇøµÚ¶þ¸ö×ÖΪ³ÌÐò¿ªÊ¼µØÖ·(¸´Î»µØÖ·)
MSR_MSP(*(vu32*)appxaddr);//³õʼ»¯APP¶ÑÕ»Ö¸Õë(Óû§´úÂëÇøµÄµÚÒ»¸ö×ÖÓÃÓÚ´æ·ÅÕ»¶¥µØÖ·)
jump2app(); //Ìø×ªµ½APP.
}
}
3、在app中修改中断向量表的偏移地址


4、程序自动选择向量表的偏移地址
适用场景,一颗芯片里面有3个程序:
- BootLoader程序,起始地址:0x08000000
- APP1程序,起始地址:0x08008000
- APP2程序,起始地址:0x08013000
这种情况就需要BootLoader程序自动选择往哪个地址跳转,这个地址再升级完以后会变,比如当前的跳转地址是app1,那么升级后跳转的地址就变为app1。
针对这种场景,做如下修改:

5、keil编译器中设置的程序起始地址会别写进bin文件
上图中的地址会被写入到bin文件中,所有在编译APP1程序和APP2程序的时候,要记着修改这里的起始地址。