bootloader部分要點
- 跳轉前需要關閉無關中斷,防止APP中未使用該中斷, 卻因為中斷而跳轉到中斷向量表時找不到對應函數入口
- bootloader最終生成的固件大小不要超過划定的區域
App部分要點
- 在Keil設置中要設置對應的flash起始地址與大小, 同時起始地址減去flash起始地址的偏移量應該滿足0x200的整數次
- 在主函數中應該重設中斷向量表,在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
}
}