STM32单片机远程升级

发布于:2023-07-04 ⋅ 阅读:(133) ⋅ 点赞:(0)

目录

1、需要两份程序

2、在BootLoader中的跳转函数

3、在app中修改中断向量表的偏移地址

4、程序自动选择向量表的偏移地址

5、keil编译器中设置的程序起始地址会别写进bin文件


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个程序:

  1. BootLoader程序,起始地址:0x08000000
  2. APP1程序,起始地址:0x08008000
  3. APP2程序,起始地址:0x08013000

         这种情况就需要BootLoader程序自动选择往哪个地址跳转,这个地址再升级完以后会变,比如当前的跳转地址是app1,那么升级后跳转的地址就变为app1。

        针对这种场景,做如下修改:

5、keil编译器中设置的程序起始地址会别写进bin文件

 

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


网站公告

今日签到

点亮在社区的每一天
去签到