网上介绍方法很多,跳转原理可以看这一篇 基于STM32的简易Bootloader实现 - JiuLiBlog - 博客园 (cnblogs.com)
大概步骤为:先判断栈顶地址是否合法,再关闭总中断和systick中断,再设置跳转地址、再加载栈顶地址,然后就可以跳转了,跳转后的应用程序需要先设置栈顶地址、再开启之前关闭的所有中断。
bootloader跳转参考代码如下:
void iap_load_app(u32 appxaddr) { if(((*(u32*)appxaddr)&0x2FF00000)==0x24000000) //检查栈顶地址是否合法. { __disable_irq(); // 关闭总中断 __set_PRIMASK(1); SysTick->CTRL = 0; SysTick->LOAD = 0; SysTick->VAL = 0; // SCB->VTOR = FLASH_BASE|0x20000;//设置偏移量 jump2app=(iapfun)*(u32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址) __set_MSP(*(__IO uint32_t*) appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址) jump2app(); //跳转到APP. } }
二、坑点
这里是使用cubeide时需要注意的坑点,使用MDK编译软件时,再魔法棒里面设置程序下载地址就可以正常运行了,在cubeide里面如果只是把编译好的代码用stlink-uinity或者stm32cubeideprogrammer下载到指定地址是不行的,程序运行不起来。
需要修改xxxxxFLASH.ld,的参数。修改flash的地址和大小为你程序对应的地址和大小。如下
把上图红框中的芯片flash原始参数改为自己的参数。我的地址是0x08020000,剩余flash大小为1920k参数如下