在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()函数关闭所有的中断。最后将赋值好的函数指针,调用完成跳转。