图文详解STM32单片机远程升级

发布时间: 2024-03-25
来源: 电子工程世界

1、需要两份程序

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

c9dd396e-6930-11ed-8abf-dac502259ad0.pngca2f8110-6930-11ed-8abf-dac502259ad0.png


2、在BootLoader中的跳转函数


 


#define APP_FLASH_ADDR 0x8008000 



iap_load_app(APP_FLASH_ADDR);

//#include "include.h"



#include "iap.h"


#include "main.h"


typedef  void (*iapfun)(void);//?¨ò?ò???oˉêyààDíμ?2?êy.


iapfun jump2app; 


__asm void MSR_MSP(u32 addr) 


{


    MSR MSP, r0    //set Main Stack value


    BX r14


}




/******************************************************************************


 *   Function name  £o iap_load_app


 *    Function describe     £o ì?×aμ?app3ìDò?£


 *    Input      £o appxaddr£oapp3ìDòμ?μ??·?£       


 *    Output      £o No


 *    Illustration     £o  


 *   Revise   £o


 *   Existing problems  :  No


*****************************************************************************/

void iap_load_app(u32 appxaddr)

{


 if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)

  

 { 


  jump2app=(iapfun)*(vu32*)(appxaddr+4);


  MSR_MSP(*(vu32*)appxaddr);


  jump2app(); //ì?×aμ?APP.


 }


}


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

ca56e714-6930-11ed-8abf-dac502259ad0.png

caac94de-6930-11ed-8abf-dac502259ad0.pngcac3e72e-6930-11ed-8abf-dac502259ad0.png

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

适用场景,一颗芯片里面有3个程序:

BootLoader程序,起始地址:0x08000000

APP1程序,起始地址:0x08008000

APP2程序,起始地址:0x08013000

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

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

cb01152c-6930-11ed-8abf-dac502259ad0.png

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

cb30fa62-6930-11ed-8abf-dac502259ad0.png

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

文章来源于: 电子工程世界 原文链接

本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。