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
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM