🗺️ 1. 存储器映射概述
GD32 基于 ARM Cortex-M 内核,遵循其规定的存储器映射结构。整个 4GB 的地址空间被划分为多个预定义区域,用于不同的存储器和外设。
地址范围 | 区域类型 | 说明 |
---|---|---|
0x0000 0000 - 0x1FFF FFFF | 代码区 | 用于存放程序代码,通常映射到内部 Flash 或系统存储器。 |
0x2000 0000 - 0x3FFF FFFF | SRAM 区 | 用于存放运行时的数据(变量、栈、堆),直接对应芯片的物理 RAM。 |
0x4000 0000 - 0x5FFF FFFF | 外设区 | 所有片上外设(如 GPIO、USART、定时器等)的寄存器都映射到此区域。 |
0x6000 0000 - 0xDFFF FFFF | 外部存储器 | 用于连接外部存储设备(如 SDRAM、NOR Flash),通过 EXMC(外部存储器控制器)访问。 |
0xE000 0000 - 0xFFFF FFFF | Cortex-M 内核外设 | 包括 NVIC、SysTick、调试组件等。 |
💾 2. 内部存储器
GD32 芯片内部集成了两种主要的存储器:Flash 和 SRAM。
片上 Flash 存储器
- 功能 :主要用于存储程序代码和只读数据(如常量字符串)。
- 地址 :通常起始于 0x0800 0000。
- 结构 :通常分为几个部分:
- 主存储块 (Main Memory):用户程序的主要存放区域。按页(Page)组织,不同型号的页大小可能不同(例如 1KB 或 2KB)。在写入前需要先擦除。
- 信息块 (Information Block) :
- 系统存储器 (System Memory) :存储芯片厂商预置的 Bootloader(串口下载程序),用户不可修改。
- 选项字节 (Option Bytes):用于配置芯片的读写保护、看门狗、复位电平等功能。
片上 SRAM 存储器
- 功能 :用于程序运行时的数据存储,如全局变量、局部变量、堆栈等。
- 地址 :起始于 0x2000 0000。
- 特性 :易失性存储器,断电后数据丢失。支持字节、半字(16位)和字(32位)访问。
下表对比了 GD32 内部两种主要存储器的特性:
特性 | 片上 Flash | 片上 SRAM |
---|---|---|
用途 | 存储程序代码、常量数据 | 存储运行时变量、堆栈 |
起始地址 | 0x0800 0000 | 0x2000 0000 |
易失性 | 非易失性 (断电数据不丢失) | 易失性 (断电数据丢失) |
写入方式 | 需先擦除页(Page)再写入 | 可直接按字节/半字/字写入 |
寿命 | 擦写次数有限 (通常 1万-10万次) | 几乎无限次读写 |
速度 | 读取较快,写入和擦除较慢 | 读写速度都非常快 |
🔄 3. 启动配置
GD32 的启动模式通过 BOOT0 和 BOOT1 引脚的电平组合在复位时选择,决定了芯片上电后从哪个存储器开始执行程序。
BOOT1 Pin | BOOT0 Pin | 启动模式 | 启动地址 (示例) | 典型应用场景 |
---|---|---|---|---|
0 | 0 | 主闪存启动 | 0x0800 0000 | 最常用模式,从用户 Flash 程序启动 |
0 | 1 | 系统存储器启动 | 0x1FFF F000 (F1系列) | 通过串口下载程序 (ISP) |
1 | 1 | SRAM 启动 | 0x2000 0000 | 调试程序,减少对 Flash 的擦写磨损 |
关键点:
- 芯片复位后,Cortex-M 内核总是从 0x0000 0000 地址获取主堆栈指针 (MSP),并从 0x0000 0004 地址获取复位向量,开始执行程序。
- 上述的启动地址(如 0x0800 0000)会被硬件自动映射到 0x0000 0000 开始的空间,以便内核访问。
🧠 4. 外部存储器控制器 (EXMC)
对于需要扩展存储空间的场景,GD32 提供了 EXMC(External Memory Controller)。
- 功能 :EXMC 可以连接各种外部存储器,如 SRAM, ROM, NOR Flash, NAND Flash, PC Card 和 SDRAM。
- 地址映射 :外部存储器的地址被映射到 GD32 的地址空间中(例如 0x6000 0000 - 0xDFFF FFFF),CPU 可以像访问内部内存一样直接访问它们。
- 配置:使用 EXMC 需要初始化相关的时序参数和控制寄存器,以匹配所连接存储器的规格。
🛡️ 5. 存储保护
GD32 提供了存储器保护机制,增强安全性:
- 读保护 (RDP):防止通过调试接口(如 SWD/JTAG)读取 Flash 中的程序代码,保护知识产权。
- 写保护 (WRP):可以保护特定的 Flash 页免受误写或擦除,提高可靠性。
💡 6. 编程提示
- 代码优化 :对于性能关键的代码,尽量将其放在 0x0800 0000 开始的前 256KB Flash 中,因为这部分空间CPU执行指令是零等待的,访问速度最快。
- 数据存放 :
- 常量、只读数据可存放在 Flash 中(使用
const
关键字)。 - 频繁读写的数据、堆栈应放在 SRAM 中。
- 常量、只读数据可存放在 Flash 中(使用
- 选项字节:修改选项字节(如读保护)需谨慎,错误的配置可能导致芯片无法正常下载或运行程序。
💎 总结
GD32 的存储架构清晰且强大,涵盖了从内部 Flash 和 SRAM 到丰富的外部存储器扩展能力。理解其存储器映射、启动模式以及各类存储器的特性和用途,是进行高效GD32开发的基础。