码迷,mamicode.com
首页 > 移动开发 > 详细

STM32开发——bootloader跳转App执行的实现

时间:2019-05-12 23:40:00      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:初始化   volatil   地址   ffffff   初始   代码   cat   rcc   偏移量   

bootloader部分要点

  1. 跳转前需要关闭无关中断,防止APP中未使用该中断, 却因为中断而跳转到中断向量表时找不到对应函数入口
  2. bootloader最终生成的固件大小不要超过划定的区域

App部分要点

  1. 在Keil设置中要设置对应的flash起始地址与大小, 同时起始地址减去flash起始地址的偏移量应该满足0x200的整数次
  2. 在主函数中应该重设中断向量表,在RTThread中, 可以写在application的init前

bootloader跳转代码:

__asm void MSR_MSP(uint32_t addr)
{
    MSR MSP, r0
    BX r14
}
void jump_app(uint32_t addr)
{
    // 检查栈顶地址是否合法
    if(((*(volatile uint32_t *)addr) & 0x2FFE0000) == 0x20000000) {
        jump2app=(void(*)())*(volatile uint32_t *)(addr + 4); // 用户代码区第二个字为程序开始地址(复位地址)
        MSR_MSP(*(volatile uint32_t *)addr); // 初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
        for(int i = 0; i < 8; i++) {
            NVIC->ICER[i] = 0xFFFFFFFF; // 关闭中断
            NVIC->ICPR[i] = 0xFFFFFFFF; // 清除中断标志位
        }
        RCC_DeInit();
        // DeInit();
        SysTick->CTRL = 0;
        SysTick->LOAD = 0;
        SysTick->VAL = 0;
        jump2app(); // 跳转到APP
    }
}

STM32开发——bootloader跳转App执行的实现

标签:初始化   volatil   地址   ffffff   初始   代码   cat   rcc   偏移量   

原文地址:https://www.cnblogs.com/rootming/p/10854297.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有 京ICP备13008772号-2
迷上了代码!