admin管理员组

文章数量:1608852

目录

      • 一、实现方法
      • 二、例程下载

一、实现方法

第 1 个程序:


#define FLASH_SAVE_ADDR  0x08020000		//设置 FLASH 地址(必须为偶数,且其值要大于本代码所占用FLASH的大小+0X08000000)
typedef  void (*iapfun)(void);			//定义一个函数类型的参数.

//设置栈顶地址
//addr:栈顶地址
__asm void MSR_MSP(uint32_t addr) {
    MSR MSP, r0 			//set Main Stack value
    BX r14
}iapfun jump2app; 

//跳转到应用程序段
//appxaddr:用户代码起始地址.
void iap_load_app(uint32_t appxaddr) {
	if(((*(__IO uint32_t*)appxaddr)&0x2FFE0000)==0x20000000) 	//检查栈顶地址是否合法.
	{ 
		jump2app=(iapfun)*(__IO uint32_t*)(appxaddr+4);		//用户代码区第二个字为程序开始地址(复位地址)		
		MSR_MSP(*(__IO uint32_t*)appxaddr);					//初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
		jump2app();									//跳转到APP.
	}
}


int main(void) {
	//判断是否 PA5 按键状态,按下则跳转到 FLASH_SAVE_ADDR 地址运行另外一个程序
	if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == RESET) {
		iap_load_app(FLASH_SAVE_ADDR);//跳转执行FLASH_APP代码
	}
}


第 2 个程序:
在烧写第 2 个程序的时候一定不能覆盖掉第 1 个程序的数据,所以这里 编译前 需要对Keil进行相应的配置,更改 : (0x800 0000 改为 0x802 0000)、(0x40000 改为 0x20000)(由于第2个程序的(Start)是从0x802 0000写入的,所以这里的(Size)内存大小 就只有原来0x40000的一半。)

下面我们只需在第 2 个程序的 main 函数开始处加入下面的语句即可。

//在 main 函数的最开始加入该语句
SCB->VTOR = FLASH_BASE | 0x20000; //内部FLASH的向量表重定位

二、例程下载

STM32实现程序跳转例程: https://download.csdn/download/qq_26043945/85122718.

本文标签: 跳转程序