• 正文
  • 相关推荐
申请入驻 产业图谱

SMC 硬件原理图、软件实现流程、工程配置与移植排错要点

10/26 17:39
49
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

1. 硬件电路设计要点(IS62WV12816 参考原理图)

示例硬件:IS62WV12816‑BLL(16bit,256KB),SMC_NE1 (PD7) 作为片选。

  1. 电源部分:SRAM VDD 接 3.3V;电源引脚并联 0.1uF 去耦电容;
  2. 地址线 A0‑A18 连接 PF、PG、PD 端口;数据线 D0‑D15 连接 PD、PE 端口;
  3. 控制信号:PD7 (NE1) 片选,PD4 (NOE 读),PD5 (NWE 写);PE0 (LB0)、PE1 (UB1) 字节掩码;
  4. 片选上拉:SMC_NE1 通过 10K 上拉电阻到 3.3V;

PCB 注意:并行高速信号,地址、数据线走线尽量等长、缩短走线长度,减少信号反射与串扰;布线不合理,即使软件时序参数正确,依然会出现读写不稳定。

资料获取:AN1092_APM32F4xx_SMC_SRAM应用笔记

2. 完整软件执行流程

软件执行步骤(文档流程图)

  1. 初始化 SMC 所复用的全部 GPIO 引脚,配置为复用推挽输出模式;
  2. 开启 SMC 外设 AHB3 时钟;
  3. 配置 SMC_NORSRAMTimingConfig_T 时序结构体,按照 SRAM 手册计算 ADDSET、DATASET 参数;
  4. 填充 SMC_NORSRAMConfig_T 初始化结构体,选择 bank、位宽、SRAM 类型、关闭突发模式,配置读写时序指针;
  5. 调用SMC_ConfigNORSRAM()完成 SMC 外设硬件寄存器配置;
  6. 直接使用 C 指针访问映射地址空间,完成外部 SRAM 读写。

3. GPIO 引脚初始化配置要点

所有 SMC 相关 GPIO 必须配置为复用功能 AF 模式:

  1. 开启对应 GPIO 端口 AHB1 时钟;
  2. 模式:GPIO_MODE_AF,推挽输出GPIO_OTYPE_PP;
  3. 速度配置 100MHz;上拉 / 下拉可配置上拉;
  4. 调用GPIO_ConfigPinAF()配置引脚复用功能为 SMC;

漏配置复用功能,引脚为普通 GPIO,SMC 外设无法输出总线时序,SRAM 完全无法工作。

4. SMC 外设完整初始化代码解析

void SMC_SRAM_Init(void)
{
SMC_NORSRAMConfig_T SMC_NORSRAM_ConfigStruct;
SMC_NORSRAMTimingConfig_T readWriteTimingStruct;

SMC_SRAM_GPIOConfig();                          //GPIO初始化
RCM_EnableAHB3PeriphClock(RCM_AHB3_PERIPH_EMMC); //开启SMC时钟

//时序配置,适配IS62WV12816
readWriteTimingStruct.addressSetupTime = 0x00;
readWriteTimingStruct.addressHodeTime = 0x00;
readWriteTimingStruct.dataSetupTime = 0x0A;     //DATASET=10
readWriteTimingStruct.busTurnaroundTime = 0x00;
readWriteTimingStruct.clockDivision = 0x00;
readWriteTimingStruct.dataLatency = 0x00;
readWriteTimingStruct.accessMode = SMC_ACCESS_MODE_A;

//SMC参数配置
SMC_NORSRAM_ConfigStruct.bank = SMC_BANK1_NORSRAM_1;
SMC_NORSRAM_ConfigStruct.dataAddressMux = SMC_DATA_ADDRESS_MUX_DISABLE;
SMC_NORSRAM_ConfigStruct.memoryType = SMC_MEMORY_TYPE_SRAM;
SMC_NORSRAM_ConfigStruct.memoryDataWidth = SMC_MEMORY_DATA_WIDTH_16BIT;
SMC_NORSRAM_ConfigStruct.burstAcceesMode = SMC_BURST_ACCESS_MODE_DISABLE;
SMC_NORSRAM_ConfigStruct.asynchronousWait = SMC_ASYNCHRONOUS_WAIT_DISABLE;
SMC_NORSRAM_ConfigStruct.waitSignalPolarity = SMC_WAIT_SIGNAL_POLARITY_LOW;
SMC_NORSRAM_ConfigStruct.wrapMode = SMC_WRAP_MODE_DISABLE;
SMC_NORSRAM_ConfigStruct.waitSignalActive = SMC_WAIT_SIGNAL_ACTIVE_BEFORE_WAIT_STATE;
SMC_NORSRAM_ConfigStruct.writeOperation = SMC_WRITE_OPERATION_ENABLE;
SMC_NORSRAM_ConfigStruct.waiteSignal = SMC_WAITE_SIGNAL_DISABLE;
SMC_NORSRAM_ConfigStruct.extendedMode = SMC_EXTENDEN_MODE_ENABLE;
SMC_NORSRAM_ConfigStruct.writeBurst = SMC_WRITE_BURST_DISABLE;
SMC_NORSRAM_ConfigStruct.readWriteTimingStruct = &readWriteTimingStruct;
SMC_NORSRAM_ConfigStruct.writeTimingStruct = &readWriteTimingStruct;

SMC_ConfigNORSRAM(&SMC_NORSRAM_ConfigStruct);
}

示例为 IS62WV12816;更换 SRAM 器件必须重新计算 addressSetupTime、dataSetupTime。

5. 外部 SRAM 应用层访问编程方式

  1. 直接指针读写;
  2. 定义全局数组定位至外部 SRAM 地址段,示例:
uint8_t ext_sram_buf[256*1024] __attribute__((at(0x60000000)));

注意:链接脚本不需要额外修改,硬件地址已经由 SMC 映射;编译器访问0x60000000直接访问外部 SRAM。

6. 项目移植、时序调试、故障排查要点

  1. 硬件核对:确认片选引脚对应 SMC_NE1‑NE4,确认对应映射起始地址;16bit /8bit SRAM 核对数据线接线;电源 0.1uF 去耦电容不可省略。
  2. 时序参数必须重新计算:不能直接复制示例 0、10 参数,必须阅读目标 SRAM datasheet,带入 tWC、tRC、tPWE 计算 ADDSET、DATASET。
  3. 现象:读写全 0 或者全 0xFF:大概率 GPIO 复用模式配置错误、时钟没有开启。
  4. 现象:偶现读写错误,间歇性数据错乱:时序参数过小,或者 PCB 布线信号完整性差,优先增大 dataSetupTime 做验证。
  5. 位宽匹配:8bit SRAM 需要把memoryDataWidth设置为 8BIT,不可设置 16BIT。

相关推荐