前言玩STM32/GD32这类Cortex-M内核单片机做IAP固件升级、Bootloader引导程序的时候启动原理、Bootloader跳转到用户App 是必过的核心关卡也是新手90%踩坑的地方。今天用最直白的方式一次性讲透两大核心一、核心一单片机上电「启动两要素」 任何Cortex-M内核芯片一上电、一复位永远只做两件事顺序永远固定1. 初始化SP堆栈指针从内存最开头的地址0x00000000取出栈顶地址直接赋值给SP堆栈指针寄存器。2. 作用给程序分配栈空间后续函数调用、局部变量、中断处理才有地方落脚不然芯片连运行的基础都没有。3. 赋值PC程序计数器紧接着取复位中断对应的函数地址直接给到PC程序计数器。4. 作用PC指向哪CPU就去哪执行代码。拿到复位函数地址后CPU就正式跳进启动文件开始执行我们写的程序。 易错提醒很多新手以为上电直接跑main函数其实main是层层跳转后的最终目的地SP和PC的初始化是一切运行的前提。二、核心二Bootloader → App 跳转四大步 我们做IAP的时候先跑一小段Bootloader负责固件校验、升级烧录之后要跳转到存放在Flash其他区域的用户App程序绝对不能直接裸跳转必须严格走完4步少一步必死机、必跑飞 第①步关中断 跳转之前必须彻底关闭所有外设中断、全局中断。 - 原因如果跳转瞬间还有中断在挂起、运行新旧程序的中断向量表不一样中断一来直接乱套程序立马硬fault崩溃。 第②步重设MSP主堆栈指针 从用户App的中断向量表首地址重新取出新的栈顶地址更新MSP主堆栈指针。 - 原因Bootloader有自己的栈App有自己独立的栈如果不重置栈两个程序共用栈空间内存彻底错乱。 第③步重设VTOR中断向量偏移寄存器 把VTOR寄存器指向用户App自己的中断向量表起始地址。 - 原因默认中断都去找0x08000000的Bootloader向量表不改偏移App里的按键、定时器等中断全部无法触发。 第④步强制跳转PC运行App 拿到App复位函数的入口地址直接赋值给PC寄存器CPU正式移交控制权彻底运行用户App代码。新手高频踩坑总结 1. 不关中断就跳转90%概率跳转后直接死机2. 忘记重置MSP栈错乱随机跑飞3. 不改VTORApp一切正常但所有中断全部失效4. App工程没修改链接脚本、起始地址向量表错位跳转完全失效5. 一句话终极口诀 上电先搭栈(SP)复位跑起来(PC)跳转先关断栈表先重置改完偏移再跳App