3. 存储地址映射与分区

XMC 系列 SOC 采用统一编址的存储映射架构,CPU 通过 32 位地址总线直接访问整个 4 GB 地址空间。系统复位后,地址映射由硬件固化,用户可通过配置 MPU(内存保护单元)和分区寄存器调整部分区域的访问属性。理解地址映射是进行 BootROM 启动、用户程序加载、数据区划分和外设寄存器配置的前提。

3.1 系统地址空间布局

下表列出了 XMC4000 系列典型 4 GB 地址空间的顶层分区。不同型号(如 XMC4500 / XMC4700)在 Flash 和 SRAM 容量上存在差异,但映射结构保持一致。

地址范围 区域名称 容量 访问属性
0x0000 0000 – 0x0FFF FFFF BootROM / Flash 映射区 256 MB 可执行、只读(BootROM 段)
0x1000 0000 – 0x1FFF FFFF 用户程序 Flash 区 256 MB 可执行、读/写(通过 Flash 控制器)
0x2000 0000 – 0x3FFF FFFF SRAM / 数据区 512 MB 读/写、可缓存
0x4000 0000 – 0x5FFF FFFF 外设寄存器区 512 MB 读/写、不可缓存、强序
0x6000 0000 – 0x9FFF FFFF 外部存储器 / 扩展区 1 GB 由外部总线接口定义
0xA000 0000 – 0xFFFF FFFF 系统控制 / 保留区 1.5 GB 系统控制寄存器 / 保留
关键点:BootROM 区域在地址 0x0000 0000 处开始,系统复位后 CPU 直接从该地址取指。用户程序区通常映射在 0x0800 0000(XMC4500)或 0x0C00 0000(XMC4700),具体偏移需参考对应型号的参考手册。

3.2 BootROM 区域

BootROM 是芯片出厂时固化的只读存储器,位于地址空间的最低端。其主要功能包括:

  • 启动引导:复位后执行硬件初始化、时钟配置、启动模式检测(如从 Flash、UART、CAN 或 SPI 加载用户代码)。
  • 安全校验:验证用户程序区的 CRC 或签名,防止未授权代码运行。
  • 固件升级:提供 Bootloader 入口,支持通过串行接口更新用户程序。

BootROM 的典型大小在 32 KB 到 64 KB 之间,用户不可擦除或修改。其内部结构通常包含:

  1. 复位向量表(包含初始 SP 和 PC)
  2. 启动模式选择逻辑
  3. 基本外设初始化代码(如 PLL、Flash 等待周期)
  4. 通信协议栈(用于下载用户程序)
注意:调试期间若将 PC 指向 BootROM 区域内的数据段而非代码段,可能导致 HardFault。建议在链接脚本中将 BootROM 地址范围标记为只读,并禁止写入操作。

3.3 用户程序区

用户程序区位于 BootROM 之后,通常映射在片内 Flash 的起始地址。该区域用于存放用户固件、常量数据和中断向量表(若未重定位)。

典型分区方式如下表所示:

段名称 起始地址(示例) 大小 内容
.vectors 0x0800 0000 0x400 (1 KB) 中断向量表
.text 0x0800 0400 可变 程序代码
.rodata 0x0800 0400 + .text 大小 可变 常量数据(字符串、查找表)
.ARM.exidx 紧随 .rodata 0x8 对齐 异常展开表(C++ 异常处理)

用户程序区的访问需通过 Flash 控制器配置等待周期(WS)和预取缓冲。典型配置代码:

/* 设置 Flash 等待周期为 3(适用于 120 MHz 主频) */
FLASH->WS = 0x3;
/* 使能预取缓冲 */
FLASH->FBCR |= FLASH_FBCR_PREFEN_Msk;

3.4 数据区

数据区对应片内 SRAM,用于存放堆、栈、全局变量和 DMA 缓冲区。XMC 系列通常提供多个 SRAM 块(如 SRAM0、SRAM1、SRAM2),支持不同的访问延迟和总线主控。

典型 SRAM 分区:

  • SRAM0(系统 SRAM): 通常 64 KB – 128 KB,CPU 和 DMA 均可访问,用于主堆栈和全局变量。
  • SRAM1(外设 SRAM): 通常 16 KB – 32 KB,紧邻外设总线,用于 USB 或 Ethernet 缓冲区。
  • SRAM2(保留/扩展): 部分型号提供,用于 ECC 校验或冗余存储。

链接脚本中需显式指定各段的加载地址和运行地址。以下为 GCC 链接脚本片段:

MEMORY
{
    FLASH (rx)  : ORIGIN = 0x08000000, LENGTH = 1024K
    SRAM0 (rwx) : ORIGIN = 0x20000000, LENGTH = 128K
    SRAM1 (rwx) : ORIGIN = 0x20020000, LENGTH = 32K
}

SECTIONS
{
    .text : { *(.text*) } > FLASH
    .data : { *(.data*) } > SRAM0 AT > FLASH
    .bss  : { *(.bss*)  } > SRAM0
}

3.5 外设寄存器区

外设寄存器区映射在 0x4000 0000 – 0x5FFF FFFF 范围内,每个外设占用 4 KB 或 16 KB 的地址块。该区域访问必须使用 volatile 关键字,且编译器不能优化读写顺序。

常见外设基地址示例:

外设 基地址 大小
GPIO 0x4000 0000 4 KB
USIC0 0x4002 0000 4 KB
CAN 0x4004 0000 4 KB
ADC 0x4006 0000 4 KB
Timer (CCU4) 0x4008 0000 4 KB

外设寄存器通常以结构体指针方式访问,例如:

#define GPIO_BASE 0x40000000UL
typedef struct {
    volatile uint32_t OUT;      /* 输出寄存器 */
    volatile uint32_t IN;       /* 输入寄存器 */
    volatile uint32_t DIR;      /* 方向寄存器 */
    volatile uint32_t RES;      /* 保留 */
} GPIO_TypeDef;

#define GPIO ((GPIO_TypeDef *) GPIO_BASE)
/* 设置 P0.0 为输出并输出高电平 */
GPIO->DIR |= (1 << 0);
GPIO->OUT |= (1 << 0);
性能提示:外设寄存器区默认不可缓存,每次读写都直接访问总线。频繁访问同一外设寄存器时,建议在 RAM 中缓存状态变量,仅在必要时同步到寄存器,以减少总线负载。

3.6 整体地址映射结构图

下图展示了 XMC 系列 SOC 的完整地址映射层次,从 BootROM 到外设寄存器区的相对位置和容量比例。

XMC 系列 SOC 存储地址映射结构 BootROM 区域 (0x0000 0000 – 0x0000 FFFF) 复位向量 · 启动模式检测 · 安全校验 · Bootloader 用户程序 Flash 区 (0x0800 0000 – 0x0FFF FFFF) .vectors · .text · .rodata · .ARM.exidx 等待周期配置 · 预取缓冲使能 SRAM 数据区 (0x2000 0000 – 0x3FFF FFFF) SRAM0 (系统堆栈/全局变量) · SRAM1 (外设缓冲) · SRAM2 (ECC/保留) 链接脚本中定义 .data / .bss / 堆栈段 外设寄存器区 (0x4000 0000 – 0x5FFF FFFF) GPIO · USIC · CAN · ADC · Timer (CCU4) · 其他外设 不可缓存 · 强序访问 · volatile 声明 外部存储器 / 系统控制 / 保留区 (0x6000 0000 – 0xFFFF FFFF) 地址从低到高排列

3.7 分区配置验证流程

完成地址映射和分区配置后,建议按以下步骤进行验证:

  1. 检查链接脚本:确认各段的 VMA(虚拟地址)和 LMA(加载地址)与目标芯片的 Flash/SRAM 地址范围一致。
  2. 读取 BootROM 版本:通过调试器读取 0x0000 0004 处的 4 字节,验证是否为预期的启动向量。
  3. 测试 Flash 写入:向用户程序区写入已知数据,再回读校验,确认等待周期配置正确。
  4. 验证 SRAM 访问:在 SRAM0 和 SRAM1 中分别写入递增模式,检查是否存在地址重叠或总线错误。
  5. 外设寄存器回读:配置 GPIO 输出寄存器后立即回读,确认 volatile 访问生效且无编译器优化。
推荐工具:使用 SEGGER J-Link 的 MemView 或 ARM Cortex-M 的 MPU 配置寄存器,可以实时观察各区域的访问权限和缓存属性,快速定位映射错误。