1. MINI2440存储系统概述
在嵌入式系统开发中,存储器的选择与配置直接影响系统性能和开发方式。MINI2440开发板作为经典的ARM9学习平台,其存储系统设计体现了典型的嵌入式存储架构。让我们先看一个直观的对比表格:
| 存储类型 | 容量 | 特性 | 用途 | 访问方式 |
|---|---|---|---|---|
| SRAM | 4KB | 高速、易失性 | 启动缓冲/栈空间 | 直接寻址 |
| SDRAM | 64MB | 高速、易失性 | 主内存 | 行列地址复用 |
| Nor Flash | 2MB | 非易失、XIP支持 | 固件存储 | 线性寻址 |
| Nand Flash | 256MB | 非易失、块设备 | 文件系统 | 串行访问 |
注意:XIP(eXecute In Place)指代码可以直接在存储器上执行,无需加载到RAM
2. 内部SRAM(Steppingstone)详解
2.1 硬件特性
S3C2440内置的4KB SRAM采用高速静态存储技术:
- 访问周期:10ns级(100MHz级访问速度)
- 供电要求:3.3V±10%
- 工作温度:-40℃~85℃(工业级)
2.2 启动模式差异
两种启动模式下SRAM的地址映射不同:
-
Nor启动模式:
- 地址范围:0x40000000~0x40000FFF
- 用途:早期栈空间
- 特点:CPU直接从Nor Flash取指
-
Nand启动模式:
- 地址范围:0x00000000~0x00000FFF
- 特殊机制:自动加载Nand前4KB内容
- 用途:SPL(Secondary Program Loader)运行空间
2.3 现代系统的局限性
虽然4KB SRAM在2003年设计时足够,但现代需求已发生变化:
- U-Boot SPL典型需求:32~64KB
- 解决方案尝试:
- 代码压缩(LZO/gzip)
- 分阶段加载
- 精简外设驱动
3. 存储控制器架构解析
3.1 BANK地址空间划分
S3C2440的1GB地址空间采用BANK式管理:
| BANK编号 | 地址范围 | 类型 | 典型连接设备 |
|---|---|---|---|
| BANK0 | 0x00000000~0x07FFFFFF | 静态 | Nor Flash |
| BANK1 | 0x08000000~0x0FFFFFFF | 静态 | 扩展设备 |
| ... | ... | ... | ... |
| BANK6 | 0x30000000~0x37FFFFFF | 动态 | SDRAM |
| BANK7 | 0x38000000~0x3FFFFFFF | 动态 | 备用SDRAM |
3.2 关键配置寄存器
存储控制器通过以下寄存器配置:
-
BWSCON(总线宽度控制)
- 设置每个BANK的位宽(8/16/32位)
- 等待状态配置
-
BANKCONn(n=0~5)
- 访问时序控制
- Tacs/Tcos/Tacc/Toch等参数
-
REFRESH(SDRAM专用)
- 刷新周期设置
- 自刷新模式控制
4. SDRAM深度技术解析
4.1 硬件连接原理
开发板采用两片HY57V561620并联:
- 单芯片容量:32MB(4Mx16bitx4banks)
- 并联方式:位扩展(16bit→32bit)
- 地址线连接:
- CPU A[24:2] → SDRAM A[12:0]
- 行地址:13位(RA0~RA12)
- 列地址:9位(CA0~CA8)
4.2 初始化序列
正确的SDRAM初始化流程:
- 预充电所有bank(发送PRE命令)
- 执行8次自动刷新
- 设置模式寄存器(MRS)
- CAS延迟(通常2或3个周期)
- 突发长度(建议设为全页)
- 进入正常操作状态
关键点:初始化期间必须严格遵守时序要求,特别是tRCD(行到列延迟)、tRP(预充电时间)等参数
4.3 实际配置示例
c复制#define MEM_CTL_BASE 0x48000000
void sdram_init(void)
{
volatile unsigned long *p = (volatile unsigned long *)MEM_CTL_BASE;
/* BWSCON */
p[0] = 0x22000000;
/* BANKCON6-7 */
p[6] = 0x18001;
p[7] = 0x18001;
/* REFRESH */
p[8] = 0x8404F5;
/* BANKSIZE */
p[9] = 0xB1;
/* MRSRB6-7 */
p[10] = 0x20;
p[11] = 0x20;
}
5. Nor Flash技术内幕
5.1 硬件接口特点
- 地址线:A0~A20(2MB空间)
- 数据线:D0~D15(16位总线)
- 控制信号:
- CE#:片选(低有效)
- OE#:输出使能
- WE#:写使能
- RY/BY#:就绪/忙状态
5.2 CFI探测实践
通过CFI(Common Flash Interface)获取芯片信息:
c复制void identify_flash(void)
{
volatile unsigned short *flash = (unsigned short *)0x0;
/* 进入CFI模式 */
flash[0x555] = 0x98;
/* 读取CFI信息 */
printf("Manufacturer: %04X\n", flash[0x00]);
printf("Device ID: %04X\n", flash[0x01]);
printf("Flash Size: %dMB\n", 1<<(flash[0x27]&0xFF));
}
5.3 编程算法
典型的Nor Flash写入流程:
- 发送解锁序列(0xAA到0x555, 0x55到0x2AA)
- 发送编程命令(0xA0到0x555)
- 写入目标数据
- 轮询DQ7位判断完成
注意事项:必须按扇区擦除(通常64KB),擦除时间约1秒
6. Nand Flash子系统
6.1 控制器特点
- 独立于BANK系统
- 硬件ECC支持
- 4KB内部SRAM缓冲
- 支持软件模式(通过GPIO模拟)
6.2 关键寄存器
- NFCONF:配置时序参数
- NFCMD:命令寄存器
- NFADDR:地址寄存器
- NFDATA:数据寄存器
- NFSTAT:状态寄存器
6.3 典型操作序列
读取ID示例:
c复制void nand_read_id(void)
{
unsigned char id[4];
NFCONF = 0x8300; // 使能NAND控制器
NFCMD = 0x90; // 读ID命令
NFADDR = 0x00; // 地址周期1
// 省略后续地址周期...
id[0] = NFDATA; // Manufacturer
id[1] = NFDATA; // Device
// 读取更多ID信息...
}
7. 存储系统优化技巧
7.1 性能优化
-
SDRAM时序调优:
- 减小tRCD/tRP参数(需稳定性测试)
- 启用Burst模式
- 合理设置刷新周期
-
Nor Flash加速:
- 启用预取指
- 合理配置等待状态
- 使用Cache
7.2 空间优化
-
代码压缩:
- LZO实时解压
- Gzip压缩内核
-
存储复用:
- 启动后重用Steppingstone
- 动态加载技术
8. 常见问题排查
8.1 SDRAM不稳定
现象:随机崩溃或数据错误
排查步骤:
- 检查供电(3.3V波动应<5%)
- 确认焊接质量
- 调整时序参数
- 运行内存测试模式
8.2 Nor Flash编程失败
现象:写入后校验错误
检查点:
- 确认擦除操作完成
- 检查Vpp编程电压
- 验证解锁序列
- 检查写保护引脚
8.3 Nand Flash坏块处理
标准处理流程:
- 扫描标记坏块(通常第1/2页)
- 建立坏块映射表
- 实现磨损均衡
- ECC校验机制
9. 进阶开发建议
-
混合存储方案:
- XIP从Nor启动
- 内核加载到SDRAM
- 文件系统在Nand
-
安全考虑:
- 启动代码签名验证
- 关键数据加密
- 写保护机制
-
调试技巧:
- 存储访问断点
- 总线分析仪捕获
- 内存内容比对
