1535|0

6828

帖子

0

TA的资源

五彩晶圆(高级)

楼主
 

 EFM32的BootLoader跳转过程 [复制链接]

 BootLoader升级完成后,要想正确完成跳转,有3部分工作需要完成。1、跳转到新的程序地址执行程序;2、重新设置新程序的堆栈首地址;3、重新设置中断向量表。结合下图说明如下:

        新程序的下载地址就是下图的首地址,Initial SP value对应的实际地址是首地址+0,Reset对应的实际地址是首地址+4。Initial SP value里面的值是重新设置的堆栈首地址;Reset里面的值是新程序的执行地址。

  

        #define USER_DEFINE_RUN_ADDR 0x5000

方式一:c语言配合寄存器

        1、设置新的PC指向,需要放在bootloader里面

        typedef  OS_S32 (*PM3EntryFunc)(OS_VOID);         /* 定义一个新的函数指针类型,和新程序的main类型相同 */
        PM3EntryFunc pfJumpToApp = NULL;                    /* 定义一个函数指针变量 */

        OS_U32 g_u32JumpAddress = 0;                             /* 保存地址 */  

        g_u32JumpAddress = *( OS_U32*) (USER_DEFINE_RUN_ADDR + 4);
        pfJumpToApp = (PM3EntryFunc)g_u32JumpAddress;        
        pfJumpToApp();

        2、设置新的中断向量:

                SCB->VTOR = USER_DEFINE_RUN_ADDR;

        3、设置新的堆栈地址

                __set_MSP(*(OS_U32*) USER_DEFINE_RUN_ADDR);

方式二:嵌入式汇编配合寄存器

        1、重新设置堆栈和跳转指针,需要传入新程序的下载地址

        __ASM void StartApplication(uint32_t start_addr)
        {
            LDR   R2, [R0]               ;// Get App MSP.
            MSR   MSP, R2                ;// Set the main stack pointer to the applications MSP.  设置堆栈指针
            LDR   R3, [R0, #0x00000004]  ;// Get application reset vector address.   设置跳转地址
            BX    R3                     ;// No return - stack code is now activated only through SVC and plain interrupts.
            ALIGN

        }

        StartApplication(USER_DEFINE_RUN_ADDR);

        2、设置新的中断向量:

                SCB->VTOR = USER_DEFINE_RUN_ADDR;

点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表