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 | 系统控制寄存器 / 保留 |
3.2 BootROM 区域
BootROM 是芯片出厂时固化的只读存储器,位于地址空间的最低端。其主要功能包括:
- 启动引导:复位后执行硬件初始化、时钟配置、启动模式检测(如从 Flash、UART、CAN 或 SPI 加载用户代码)。
- 安全校验:验证用户程序区的 CRC 或签名,防止未授权代码运行。
- 固件升级:提供 Bootloader 入口,支持通过串行接口更新用户程序。
BootROM 的典型大小在 32 KB 到 64 KB 之间,用户不可擦除或修改。其内部结构通常包含:
- 复位向量表(包含初始 SP 和 PC)
- 启动模式选择逻辑
- 基本外设初始化代码(如 PLL、Flash 等待周期)
- 通信协议栈(用于下载用户程序)
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);
3.6 整体地址映射结构图
下图展示了 XMC 系列 SOC 的完整地址映射层次,从 BootROM 到外设寄存器区的相对位置和容量比例。
3.7 分区配置验证流程
完成地址映射和分区配置后,建议按以下步骤进行验证:
- 检查链接脚本:确认各段的 VMA(虚拟地址)和 LMA(加载地址)与目标芯片的 Flash/SRAM 地址范围一致。
- 读取 BootROM 版本:通过调试器读取 0x0000 0004 处的 4 字节,验证是否为预期的启动向量。
- 测试 Flash 写入:向用户程序区写入已知数据,再回读校验,确认等待周期配置正确。
- 验证 SRAM 访问:在 SRAM0 和 SRAM1 中分别写入递增模式,检查是否存在地址重叠或总线错误。
- 外设寄存器回读:配置 GPIO 输出寄存器后立即回读,确认 volatile 访问生效且无编译器优化。