Boot跳到APP后主循环能执行,SysTick或外设中断一来却HardFault,常见根因不是跳转指令本身,而是中断向量表仍指向Boot区。核心判断是:装载APP栈顶并跳到Reset_Handler只接管主流程;还要校验APP地址、切换VTOR,并清理跳转前留下的中断、SysTick和外设状态。
IAP程序接收固件、写入Flash后,读取APP首地址作为MSP,再跳到第二个字的Reset_Handler。串口打印已经进入APP,LED也能翻转;一打开定时器或SysTick,程序立即跑飞。这个症状说明CPU已经执行APP代码,但异常入口仍可能沿用Boot阶段的地图。
先看向量表前两个字,而不是直接强跳
Cortex-M向量表的第一个字保存初始主栈指针,第二个字保存复位入口。Boot决定跳转前,应检查APP起始地址是否符合Flash布局和对齐要求,栈顶是否落在有效RAM范围,复位入口是否落在允许的APP代码区并带有正确的Thumb状态。任何一项不合法,都不应执行跳转。
普通启动时,CPU从向量表取初始栈顶与Reset_Handler,再进入异常和主程序入口。
APP链接地址必须与实际写入地址一致。若链接器仍按0x08000000生成代码,却把Bin文件写到后面的分区,绝对地址、常量和中断入口就会错位。IROM起始地址、Boot预留区大小、Flash擦除粒度和升级包边界要在同一份内存布局中管理。
MSP和PC切过去,只完成了主流程交接
跳转代码通常先关闭中断,设置MSP,再调用APP复位入口。这样能让CPU使用APP栈并开始执行启动代码,却不会自动把所有系统寄存器恢复到上电状态。Boot开启过的PLL、SysTick、DMA、UART中断和外设时钟仍可能保留,挂起中断也可能在APP开中断后立刻响应。
更关键的是向量表基址。支持VTOR的Cortex-M内核通过该寄存器决定异常编号对应哪张表。若VTOR仍指向Boot向量表,APP里的中断使能后,CPU会从Boot区域取入口;Boot中对应处理函数不存在、已被覆盖或上下文不兼容,就会进入错误地址。
带IAP的运行流程包含Boot向量表、APP向量表和跳转后的异常入口切换。
..