前言
`
IAP(在线应用编程)程序通过提前写入用于升级代码的 bootloader,可以完成 MCU APP 功能的升级,增强了代码的灵活性,在完成 APP 代码升级之后,程序需要从 Bootloader 代码跳转到 APP 代码运行, 本应用笔记基于 stm32/GD32F10x 系列(跳转函数通用),介绍如何实现程序从 Bootloader 代码跳转到 APP 代码
—`
一、IAR程序
AP 程序通常由两个部分组成:Bootloader 和 APP。Bootloader 和 APP 分别为两个工程程序,存放在 Flash 的 Main Flash 区,即 0x08000000 开始的区域。
二、Bootloader
当检测不需要更新时,调用下面这个函数,就会跳转到APP程序地址运行
#include "IAP.h"
void MSR_MSP(uint32_t addr)
{
__ASM volatile("MSR MSP, r0");
__ASM volatile("BX r14");
}
typedef void (*iapfun)(void);定义一个函数指针结构体
iapfun jump2app;
//跳转到应用程序段 appxaddr:用户代码起始地址.
void iap_load_app(uint32_t appxaddr)
{
if(((*(uint32_t*)appxaddr)&0x2FFE0000)==0x20000000)//检查栈顶地址是否合法.
{
/* Jump to user application */
jump2app=(iapfun)*(uint32_t*)(appxaddr+4);//用户代码区第二个字为程序开始地址(复位地址)
// + 4 地址处存储的是 Reset_Handler 向量,该向量为 Reset_Handler 处理函数的入口地址,
/* Initialize user application's Stack Pointer */
MSR_MSP(*(uint32_t*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
jump2app();//跳转到APP.
}
// HAL_NVIC_SystemReset(); 系统软复位命令
}
2.APP程序
代码如下(示例):
/* set the NVIC vector table base address to APP code area */
nvic_vector_table_set(NVIC_VECTTAB_FLASH, APP_OFFSET);//GD32单片机使用
或者使用STM32
SCB->VTOR = FLASH_BASE | 0x20000; //将中断向量地址和程序存储区域一起偏移
要完成 APP 的升级,要事先将编写好的 Bootloader 代码下载到 MCU 0x08000000 地址开始的 Flash 中。并且要保证 APP 代码区域不与 Bootloader 代码区域有重叠。
APP地址设置
BOOT 地址设置