
三种启动模式F407 通过BOOT0和BOOT1两个引脚选择启动方式BOOT0BOOT1启动位置说明0任意Flash0x08000000正常启动运行你的程序10System Memory0x1FFF0000出厂 Bootloader串口 ISP 下载11SRAM0x20000000调试用掉电丢失平时 BOOT0 0程序从 Flash 启动。这是最常用的模式。启动位置做了什么芯片读向量表的前两个值栈顶地址 PC 指针。所以Flash 启动读 0x08000000 → 取 MSP读 0x08000004 → 取 PCSystem Memory 启动读 0x1FFF0000 → 取 MSP读 0x1FFF0004 → 取 PC进入出厂 BootloaderSRAM 启动读 0x20000000 → 取 MSP读 0x20000004 → 取 PC出厂 Bootloader 是什么STM32 出厂时在 System Memory 区域固化了一段不可擦除的程序它支持接口引脚USART1常用PA9/PA10USART2PD5/PD6USB DFUPA11/PA12CAN2PB5RX/ PB6TX进入条件BOOT01, BOOT10 → 上电/复位 → 芯片从 System Memory 启动 → 检测串口信号必须在特定时间内收到 0x7F 字节→ 进入 ISP 模式。这就是为什么做串口 ISP 下载时要复位 点击开始编程——bootloader 只在启动后短暂几毫秒内监听串口信号。自己写一个 Bootloader如果你要实现 IAPIn-Application Programming就需要自己写一个 bootloaderFlash 布局 0x08000000 ─── Bootloader~16KB 就够 0x08004000 ─── App用户程序Bootloader 代码精简版#define APP_ADDR 0x08004000 #define APP_STACK *(volatile uint32_t *)APP_ADDR #define APP_RESET *(volatile uint32_t *)(APP_ADDR 4) void JumpToApp(void) { // 1. 关全局中断 __disable_irq(); // 2. 复位所有外设 HAL_DeInit(); // 3. 关 SysTick SysTick-CTRL 0; // 4. 设置向量表偏移 SCB-VTOR APP_ADDR; // 5. 设置栈顶指针 __set_MSP(APP_STACK); // 6. 跳转到 app 的复位向量 void (*app_main)(void) (void (*)(void))APP_RESET; app_main(); }App 工程需要修改链接脚本把起始地址改为 0x08004000。修改 APP 起始地址需手动编辑 .ld 链接脚本CubeMX 的 Project Manager → Linker Settings 仅可查看路径不能在 GUI 中直接修改 Flash 起始地址。在代码中也要设置向量表偏移// app 的 main 函数最开头加 SCB-VTOR 0x08004000;常见问题写了 Bootloader但跳转到 App 后死机了App 的向量表偏移设了吗SCB-VTOR APP_ADDRApp 的链接脚本改了 Flash 起始地址吗跳转前关中断了吗App 的 SRAM 起始地址和 Bootloader 冲突了吗最简单验证方法先不写 Bootloader直接把 App 烧到 0x08000000 测试能不能跑。能跑说明 App 本身没问题问题在跳转上。