stm32cubeide+bootloader跳转的方法和坑点

发布时间 2023-10-27 12:06:51作者: 小人物1112227

网上介绍方法很多,跳转原理可以看这一篇  基于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参数如下