复位
└─ 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)