STM32中bootloader跳转到主程序

论坛 期权论坛 脚本     
已经匿名di用户   2022-7-2 21:50   2930   0

在STM32中,从bootloader程序中要跳转到最后的主任务程序中,需要我们自己去做一下以下事情:

首先,需要把STM32的所有中断关闭,否则可能导致跳转的失败。

其次,要设置到新的堆栈首地址,即最后要跳转的主任务程序的起始地址。

接着,就是要将要跳转到达的程序的首地址赋值给一个函数指针。

最后,就是利用刚才的函数指针完成跳转。

博主以自己之前实际中用到的程序,进行举例:

/* 需要在对应文件中增加下列头文件以及宏定义等 */
#include "stm32f4xx_hal.h"
#define CLOSE_ALL_INT()  __set_PRIMASK(1)
#define PROGRAM_ADDRESS 0x08000000   /* 要跳转到的地址 */
typedef void (*Iapfun)(void);
static Iapfun jump2app;
 
/* 在程序中需要跳转的地方添加下列代码 */
jump2app=(Iapfun)*(volatile uint32_t *)(PROGRAM_ADDRESS+4); 
__set_MSP(*(volatile uint32_t *)PROGRAM_ADDRESS);
CLOSE_ALL_INT();
jump2app();

如上图中代码,博主使用的是STM32F429的芯片,程序中使用了STM的HAL库,所以先包含需要的头文件。在程序编译时,设置的要跳转到的程序首地址为PROGRAM_ADDRESS定义的地址,即0x08000000,接着定义一个函数指针。由于STM中断向量表的设置,实际main函数的地址有一个4字节的偏移,所以给函数指针赋值时,为PROGRAM_ADDRESS+0x4。接着使用__set_MSP设置堆栈的首地址。然后CLOSE_ALL_INT()函数关闭所有的中断。最后将赋值好的函数指针,调用完成跳转。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:81
帖子:4969
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP