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.
版权声明:本文标题:STM32实现程序跳转 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1728554187a1163632.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论