在嵌入式图像处理、数据采集、高速缓存等场景中,片内 RAM 往往不够用,外接 SDRAM 成为标配。极海 APM32F4xx 系列通过内置DMC 动态存储控制器,可以直接驱动 16bit 位宽 SDRAM,轻松扩展大容量高速缓存。
AN1082 应用笔记把 SDRAM 原理、DMC 控制器、引脚分配、时序配置、初始化流程与读写操作讲得透彻易懂。本文用工程化语言完整解读,帮你一次调通 SDRAM,直接用于显示缓冲、数据记录、算法缓存等项目。
资料获取:AN1082_APM32F4xx_SDRAM应用笔记
1. SDRAM 基础要点(先看懂再驱动)
SDRAM = 同步动态随机存储器,必须有时钟、定时刷新、时序严格匹配才能稳定工作。
1.1 关键参数(配置 DMC 必须用)
- CAS Latency(CL):列地址到数据输出延迟
- tRCD:行地址选通到列地址选通延迟
- tRP:预充电到下次激活行的时间
- tRAS:行激活到预充电的最小时间
- tWR:写恢复时间,保证数据可靠写入
- 刷新周期:全芯片刷新一次64ms
- 位宽:APM32F4xx DMC 默认支持16bit
1.2 容量计算(常用)
容量 = 2^ 行 × 2^ 列 × 位宽 / 8 × Bank 数
例如:11 行 + 8 列 + 16bit+2Bank = 2MB
2. DMC 动态存储控制器(APM32F4xx 外接 SDRAM 核心)
DMC 是 MCU 与 SDRAM 之间的 “桥梁”,负责时序转换、地址映射、刷新控制、数据读写。
2.1 DMC 结构
- 主机接口:对接 AHB 总线
- 存储接口:对接 SDRAM
- 控制单元:时序、刷新、命令
- FIFO:提升读写效率
2.2 DMC 引脚分配
全部引脚必须配置为复用 AF_EMMC,推挽、50MHz、无上拉下拉。
| 信号 | 引脚 | 功能 |
|---|---|---|
| A0~A10 | PF0,PF1~PF10,PH3 | 地址总线 |
| D0~D15 | PD10,PD12~PD15,PG2~PG3,PG4~PG6,PG8,PH8,PH10,PH13,PH15,PI3 | 16 位数据 |
| BA | PI11 | Bank 地址 |
| CLK | PG1 | 时钟 |
| CKE | PA3 | 时钟使能 |
| NWE | PI7 | 写使能 |
| NCAS | PI8 | 列选通 |
| NRAS | PI9 | 行选通 |
| NCS | PI10 | 片选 |
| LDQM/UDQM | PG15/PF11 | 字节使能 |
3. DMC 初始化流程(官方标准流程)
按照 AN1082,SDRAM 驱动只需要 4 步:
3.1 初始化 GPIO
所有 DMC 相关引脚配置为复用 AF_EMMC。
RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOA|RCM_AHB1_PERIPH_GPIOD|RCM_AHB1_PERIPH_GPIOE|RCM_AHB1_PERIPH_GPIOF|RCM_AHB1_PERIPH_GPIOG|RCM_AHB1_PERIPH_GPIOH|RCM_AHB1_PERIPH_GPIOI);
GPIO_Config_T gpioConfig;
gpioConfig.mode = GPIO_MODE_AF;
gpioConfig.speed = GPIO_SPEED_50MHz;
gpioConfig.otype = GPIO_OTYPE_PP;
gpioConfig.pupd = GPIO_PUPD_NOPULL;
// 对所有DMC引脚配置...
GPIO_Config(GPIOX, &gpioConfig);
GPIO_ConfigPinAF(GPIOX, PinSource, GPIO_AF_EMMC);
3.2 配置时序参数(与 SDRAM 芯片匹配)
时序直接决定稳定性,按 SDRAM 手册填写。
DMC_TimingConfig_T timing;
timing.latencyCAS = DMC_CAS_LATENCY_3;
timing.tRCD = DMC_DELAY_TIME_1;
timing.tRP = DMC_PRECHARGE_1;
timing.tRAS = DMC_RAS_MINIMUM_2;
timing.tWR = DMC_NEXT_PRECHARGE_2;
timing.tARP = DMC_AUTO_REFRESH_10;
timing.tCMD = DMC_ATA_CMD_1;
timing.tXSR = 3;
timing.tRFP = 0x2F9; // 刷新周期
3.3 配置 DMC 结构体
DMC_Config_T dmcConfig;
dmcConfig.bankWidth = DMC_BANK_WIDTH_1; // 1bit=2Bank
dmcConfig.rowWidth = DMC_ROW_WIDTH_11; // 11根行地址
dmcConfig.colWidth = DMC_COL_WIDTH_8; // 8根列地址
dmcConfig.clkPhase = DMC_CLK_PHASE_REVERSE;
dmcConfig.timing = timing;
RCM_EnableAHB3PeriphClock(RCM_AHB3_PERIPH_EMMC);
DMC_Config(&dmcConfig);
DMC_EnableAccelerateModule();
DMC_Enable();
3.4 访问 SDRAM
APM32F4xx 将 SDRAM 映射到0x60000000开始地址,直接指针操作即可读写。
// 写
*(uint16_t *)0x60000000 = 0x1234;
// 读
uint16_t val = *(uint16_t *)0x60000000;
4. SDRAM 时序配置速查表(直接套用)
AN1082 给出通用推荐值,适合大多数 2MB~8MB 16bit SDRAM:
| 参数 | 推荐配置 | 说明 |
|---|---|---|
| CAS Latency | 3 | 最常用稳定值 |
| tRCD | 1 | 行到列延迟 |
| tRP | 1 | 预充电时间 |
| tRAS | 2 | 行激活最短时间 |
| tWR | 2 | 写恢复 |
| Refresh | 0x2F9 | 64ms 刷新周期 |
| Bank 宽度 | 1 | 2Bank |
| 行地址 | 11 位 | 兼容 2MB/8MB |
| 列地址 | 8 位 | 兼容 2MB/8MB |
5. PCB 与硬件设计要点(AN1082 重点强调)
- SDRAM 时钟线尽量短,且与其他线等长
- 地址 / 数据 / 控制线要短、等长、远离干扰源
- SDRAM 电源加100nF+10uF滤波电容
- CKE、CLK、NCS 等控制信号不能有毛刺
- 尽量铺完整地平面,减少回流噪声
6. 典型应用场景
AN1082 是 APM32F4xx 外接 SDRAM 的官方标准驱动手册,核心就是:GPIO 复用 → 时序配置 → DMC 初始化 → 直接地址访问。
只要按文档配置引脚与时序,SDRAM 就可以像内部 RAM 一样使用,地址从0x60000000开始,稳定可靠、性能强劲,适合需要大容量 RAM 的高端嵌入式项目。
726