以stm32103zet6(flash 起始地址 0x8000000 大小512k)为例。
boot程序
1、option->target->IROM1 Size要改成合适的大小
2、跳转前要关闭所有外设
3、跳转代码参考
__asm jump_to_app(uint32_t sp_addr)
{
;//sp_addr(r0)为app程序的起始地址
mov r1, #0x0
msr control, r1
msr basepri, r1
msr faultmask, r1
msr primask, r1 ;//初始化特殊寄存器
mov r1, #0x01000000
msr xpsr, r1 ;//写xPSR为0x01000000
mov lr, #0xffffffff ;//写lr为 0xffffffff
ldr r1,[r0] ;//将r0(sp_addr)赋值给r1 (msp指针)
msr msp, r1 ;//将r1的值赋给msp指针(主栈指针)
ldr r1,[r0,#0X04] ;//将r0(sp_addr)加4地址处的值(pc指针)赋给r1
mov pc, r1 ;//跳转到r1处继续执行 短跳转最大距离32M: bx r1 长跳转 mov pc, r1
}
app程序
1、option->target->IROM1起始地址以及大小要改
2、SystemInit()函数中,中断向量表偏移地址要改成程序起始地址
总结:boot程序的跳转目标地址=app程序中断向量表偏移地址=flash 下载地址=程序起始地址