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

  目录

需要两份程序

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

在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.
 }
}

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

图片
图片
图片

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

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

  • BootLoader程序,起始地址:0x08000000
  • APP1程序,起始地址:0x08008000
  • APP2程序,起始地址:0x08013000

这种情况就需要BootLoader程序自动选择往哪个地址跳转,这个地址再升级完以后会变,比如当前的跳转地址是app1,那么升级后跳转的地址就变为app1。
针对这种场景,做如下修改:
图片

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

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

版权声明

文章来源于网络,版权归原作者所有,如有侵权,请联系删除。
原文:https://mp.weixin.qq.com/s/N0DADxo6E44b9HYEbcxAyQ


文章作者: 改变世界
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 改变世界 !
评论