在嵌入式系统开发中,内存资源常常成为限制系统性能的瓶颈。F28335 DSP芯片虽然内置了34K*16位的SRAM,但在处理复杂算法或图形界面时,这些内存可能捉襟见肘。本章将详细介绍如何通过XINTF接口扩展外部SRAM,并利用DMA实现高效数据传输。
XINTF(External Interface)是F28335提供的外部存储器扩展接口,采用非复用异步总线架构,支持SRAM、FLASH等存储器的扩展。我们使用的普中DSP28335开发板集成了一颗IS62WV51216 SRAM芯片,容量为1M字节。本章实验将通过XINTF接口操作这片外部SRAM,并使用DMA将数据从外部SRAM传输到芯片内部RAM,同时通过LED指示灯展示系统运行状态。
F28335的XINTF接口采用增强型哈佛总线架构,支持程序和数据存储空间的并行访问。其核心特性包括:
XINTF的三个存储区域映射如下:
每个区域都有独立的片选信号(XZCS0/XZCS6/XZCS7),读写时序可单独配置。这种灵活性使得XINTF能够适配不同速度的外部设备。
相比前代F2812,F28335的XINTF接口有显著改进:
这些改进使F28335更适合处理大数据量应用,如数字信号处理、图像处理等场景。
普中开发板将IS62WV51216 SRAM连接到XINTF Zone 7,具体连接方式如下:
这种连接方式充分利用了XINTF Zone 7的1M地址空间,为系统提供了额外的存储资源。
IS62WV51216 SRAM的主要参数:
根据SRAM的访问时间,我们需要合理配置XINTF的时序参数,确保可靠的数据读写。
配置XINTF Zone 7访问外部SRAM的关键步骤如下:
c复制EALLOW;
SysCtrlRegs.PCLKCR3.bit.XINTFENCLK = 1;
EDIS;
c复制void InitXintf16Gpio(void);
c复制XintfRegs.XINTCNF2.bit.XTIMCLK = 0; // XTIMCLK = SYSCLKOUT
XintfRegs.XINTCNF2.bit.WRBUFF = 3; // 使能3级写缓冲
XintfRegs.XINTCNF2.bit.CLKOFF = 0; // 使能XCLKOUT输出
XintfRegs.XINTCNF2.bit.CLKMODE = 0; // XCLKOUT = XTIMCLK
c复制// 写时序
XintfRegs.XTIMING7.bit.XWRLEAD = 1; // 写前导周期
XintfRegs.XTIMING7.bit.XWRACTIVE = 2; // 写有效周期
XintfRegs.XTIMING7.bit.XWRTRAIL = 1; // 写跟踪周期
// 读时序
XintfRegs.XTIMING7.bit.XRDLEAD = 1; // 读前导周期
XintfRegs.XTIMING7.bit.XRDACTIVE = 3; // 读有效周期
XintfRegs.XTIMING7.bit.XRDTRAIL = 0; // 读跟踪周期
// 其他配置
XintfRegs.XTIMING7.bit.X2TIMING = 0; // 不双倍时序
XintfRegs.XTIMING7.bit.USEREADY = 0; // 不使用XREADY
XintfRegs.XTIMING7.bit.XSIZE = 3; // 16位数据总线
关键点:时序参数需要根据SRAM规格和系统时钟计算。例如,当SYSCLKOUT=150MHz时,XTIMCLK周期约6.67ns。对于访问时间为15ns的SRAM,XRDACTIVE至少需要3个周期(20ns)才能确保可靠读取。
DMA配置是实现高效数据传输的核心:
c复制void DMACH1_Init(volatile Uint16 *DMA_Dest, volatile Uint16 *DMA_Source)
{
// 使能DMA和定时器0时钟
EALLOW;
SysCtrlRegs.PCLKCR3.bit.DMAENCLK = 1;
SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1;
EDIS;
// 初始化DMA和XINTF
DMAInitialize();
init_zone7();
// 配置DMA地址和传输参数
DMACH1AddrConfig(DMA_Dest, DMA_Source);
DMACH1BurstConfig(31, 2, 2); // 32位模式
DMACH1TransferConfig(31, 2, 2);
// 使用定时器0触发DMA
DMACH1ModeConfig(DMA_TINT0, PERINT_ENABLE, ONESHOT_ENABLE,
CONT_DISABLE, SYNC_DISABLE, SYNC_SRC,
OVRFLOW_DISABLE, THIRTYTWO_BIT, CHINT_END, CHINT_ENABLE);
// 启动定时器0
CpuTimer0Regs.TIM.half.LSW = 512;
CpuTimer0Regs.TCR.bit.TSS = 0;
}
c复制#define DMA_BUF_SIZE 1024
#pragma DATA_SECTION(DMABuf1, "DMARAML4");
#pragma DATA_SECTION(DMABuf2, "ZONE7DATA");
volatile Uint16 DMABuf1[DMA_BUF_SIZE]; // 内部RAM
volatile Uint16 DMABuf2[DMA_BUF_SIZE]; // 外部SRAM
void main()
{
// 初始化系统和外设
InitSysCtrl();
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
LED_Init();
TIM0_Init(150, 200000); // 200ms定时
// 初始化DMA
DMACH1_Init(DMABuf1, DMABuf2);
// 填充测试数据
for (Uint16 i=0; i<DMA_BUF_SIZE; i++) {
DMABuf1[i] = 0;
DMABuf2[i] = i; // 外部SRAM写入0-1023
}
StartDMACH1(); // 启动DMA传输
while(1) {
static Uint16 counter = 0;
if (++counter % 200 == 0) {
LED6_TOGGLE; // LED闪烁指示系统运行
}
DELAY_US(1000);
}
}
数据读写错误:
DMA传输失败:
系统稳定性问题:
c复制XintfRegs.XINTCNF2.bit.WRBUFF = 3; // 启用3级写缓冲
可提高连续写操作的效率,减少CPU等待时间。
32位总线模式:
将XSIZE配置为32位模式可提升吞吐量,但需注意SRAM支持情况。
合理设置DMA传输:
使用32位模式和大块传输可减少传输开销:
c复制DMACH1BurstConfig(31, 2, 2); // 32位突发传输
完成程序下载后,可通过CCS的Memory Browser和Watch窗口验证数据传输:
查看外部SRAM数据:
在Memory Browser中输入Zone 7地址(如0x200000),应看到写入的0-1023序列。
检查内部RAM数据:
查看DMABuf1数组,确认数据已从SRAM正确传输。
实时监测:
LED6以200ms间隔闪烁,指示系统正常运行。
调试技巧:在DMA传输前后设置断点,单步执行观察寄存器状态,可有效定位问题。
本章方案可扩展应用于以下场景:
大数据缓冲:
在音频处理、图像采集等场景中,外部SRAM可作为数据缓冲区。
算法加速:
将算法代码或系数表存放在外部存储器,减少内部RAM压力。
多存储器管理:
通过XINTF连接不同类型的存储器(如SRAM+FLASH),构建分层存储系统。
实际应用中,还需考虑以下因素: