复位
 └─ CPU 从掩膜 ROM (0x00000000 区) 取指执行
     ├─ 读 flash 头 4 KB 的启动头(我们链接脚本保留 0x08000000~0x08000FFF 的原因)
     ├─ 配 QSPI 引脚(专用引脚,不需要我们做 GPIO 复用)
     ├─ 配 XFC 寄存器:DEVICE_PARA(协议/伪周期/分频)
     │                 CACHE_INTF_CMD ← XIP 的本体,见下
     ├─ 使能 ICACHE/DCACHE
     └─ 跳到 flash 执行 → 我们的 Reset_Handler → SystemInit → main

复位 → 掩膜 ROM(芯片内部,初始化 XIP)→ ??? → 我们的程序 (0x08001000)
                                              ↑
              这里是两种可能:A) ROM 读头 4KB 里的【数据头】(magic/入口地址),直接跳
                             B) ROM 跳到头 4KB 里的【一小段 loader 代码】执行后再跳

链接地址

说明:0x08000000 ~0x0800FFFF启动头在官方提供的烧录工具,会帮我们添上去。

__ROM_BASE   = 0x08001000; //链接地址
__ROM_SIZE   = 0x01FFF000; // 大小32MB

我们直接拿最后4KB作为存储。读写这个4KB即可完成配置记录

__ROM_BASE   = 0x08001000; //链接地址
__ROM_SIZE   = 0x01FFE000; // 大小32MB-4KB
0x08000000 ┬─ 启动头 4 KB            烧录工具写,ROM 读它启动
0x08001000 ┼─ 固件区开始              ← __ROM_BASE(现用 394,944 B,余 ~31.4 MB)
0x080616C0 │   ← __flash_image_end__(驱动挡擦/写)
   ...     │      (代码连续向上长,跨过 16 MB 边界也没问题——取指走 XIP)
0x09FFF000 ┼─ 数据扇区 4 KB          ← FLASH_XFC_SETTINGS_ADDR(芯片末尾)
0x0A000000 ┴─ 芯片结束(32 MB)