zoukankan      html  css  js  c++  java
  • STM32开发——bootloader跳转App执行的实现

    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
        }
    }
    
  • 相关阅读:
    「SOL」工厂选址(BZOJ)
    「NOTE」数论小札
    Flask实现简单的群聊和单聊
    python基础总结
    基于Flask和百度AI实现与机器人对话
    django创建路径导航
    django中权限控制到按钮级别
    django中非菜单权限的归属
    MongoDB的增删改查
    jQuery于js的区别和联系
  • 原文地址:https://www.cnblogs.com/rootming/p/10854297.html
Copyright © 2011-2022 走看看