目录
概述
1 硬件介绍
1.1 SRAM的电路
1.2 IS61WV102416ALL芯片
2 STM32Cube配置工程
2.1 配置FSMC
2.2 其他参数配置
2.3 生成工程
3 SRAM的功能验证
3.1 编写测试函数
3.1.1 写数据函数
3.1.2 读数据函数
3.2 完整代码
4 测试
测试代码下载地址:
stm32-f407-fsmc-sRAM资源-CSDN文库
概述
本文主要介绍使用STM32F4的FSMC控制SRAM,以扩展内存,文中介绍了SRAM相关的电路,以及和MCU之间的对应关系。还使用STM32Cube配置一个项目来实现FMSC操作SRAM的功能,并编写测试程序,验证该功能。
1 硬件介绍
1.1 SRAM的电路
1.2 IS61WV102416ALL芯片
TheISSIIS61WV102416ALL / BLLandIS64WV102416BLL高速,16m位静态RAM组织为1024K 16位。它是采用ISSI的高性能CMOS技术制造的。这个高度可靠的过程加上创新的电路设计技术,产量高性能、低功耗器件。
当CE为HIGH(未选择)时,设备假定a在待机模式下,功耗可以随CMOS输入电平降低。通过使用Chip Enable,可以方便地扩展内存使能输入,CE和OE。主动LOWWrite Enable (WE)控制对象的写和读内存。一个数据字节允许上字节和下字节LB (Byte)访问。
芯片框架结构:
芯片引脚定义:
2 STM32Cube配置工程
2.1 配置FSMC
选项名称 | 类型 |
---|---|
Chip Select | NE3 |
Memory type | SRAM |
Address | 20 bits |
Data | 16 bits |
在 STM32Cube中的配置信息如下:
2.2 其他参数配置
SRAM芯片的使能信号与FSMC_NE3连接,所以它会被映射到STM32中的BANK1 NOR/SRAM3区域, 该区域的地址范围为0x68000000-0x6BFFFFFF,因此,当内核访问从基地址0x68000000开始的2MB空间时,FSMC外设会自动控制原理图中的引脚产生访问时序,访问这个外部SRAM存储器。
2.3 生成工程
完成以上配置后,可以点击GENERATE生成项目,打开工程后,fsmc.c中已经生成了和FSMC相关的代码,包括接口函数如下:
函数名称: void MX_FSMC_Init(void)
功能: FSMC接口参数初始化
函数名称: static void HAL_FSMC_MspInit(void)
功能: 和FSMC相关的IO初始化
3 SRAM的功能验证
3.1 编写测试函数
创建App/Fsmc文件目录,并在该目录下创建fsmc_test.c文件。然后在该文件中编写测试SRAM的带代码。
3.1.1 写数据函数
代码18行: 确定扩展SRAM地址的buff
代码29行:向RAM地址写数据
3.1.2 读数据函数
代码46行: 确定读数据的扩展SRAM地址
代码50行:从RAM中读取数据
3.2 完整代码
创建fsmc_test.c,然后在该文件中编写如下代码:
程序功能概述:
1)从地址0x68000000开始,写48k数据
2)从地址0x68000000开始,读48k数据
3)将写如下的数据打印出来
#include "fsmc_test.h"#define EXT_SRAM_ADDR ((uint32_t)0x68000000)
#define EXT_SRAM_SIZE (24* 1024)#define TEST_BUF_SIZE 1024*48
#define TEST_ADDRESS 0uint8_t g_TestBuf[TEST_BUF_SIZE]; /* 数据测试用缓冲区 */static void WriteTest(uint8_t _Value)
{uint32_t i, n;int32_t iTime1, iTime2;uint16_t *pBuf;uint16_t usTemp;pBuf = (uint16_t *)EXT_SRAM_ADDR;usTemp = (_Value << 8) + _Value;/* 写EEPROM, 起始地址 = 0,数据长度为 256 */iTime1 = HAL_GetTick(); /* 记下开始时间 */pBuf = (uint16_t *)EXT_SRAM_ADDR;for (n = 0; n < 10; n++){for (i = 0; i < EXT_SRAM_SIZE / 2; i++){*pBuf++ = usTemp;}}iTime2 = HAL_GetTick(); /* 记下结束时间 *//* 打印速度 */printf("数据写耗时: %dms, 写速度: %dKB/s\r\n", iTime2 - iTime1, (10 * (EXT_SRAM_SIZE / 1024) * 1000) / (iTime2 - iTime1));
}static void ReadTest(void)
{uint16_t i;int32_t iTime1, iTime2;uint8_t *pBuf;/* 写EEPROM, 起始地址 = 0,数据长度为 256 */iTime1 = HAL_GetTick(); /* 记下开始时间 */pBuf = (uint8_t *)(EXT_SRAM_ADDR + TEST_ADDRESS);for (i = 0; i < TEST_BUF_SIZE; i++){g_TestBuf[i] = *pBuf++;}iTime2 = HAL_GetTick(); /* 记下结束时间 */printf("物理地址:0x%08X 大小: %d字节, 数据如下: \r\n", EXT_SRAM_ADDR + TEST_ADDRESS, TEST_BUF_SIZE);/* 打印数据 */for (i = 0; i < TEST_BUF_SIZE; i++){printf(" %02X", g_TestBuf[i]);if ((i & 31) == 31){printf("\r\n"); /* 每行显示16字节数据 */}else if ((i & 31) == 15){printf(" - ");}}/* 打印读速度 */printf("读耗时: %dms, 读速度: %dB/s\r\n", iTime2 - iTime1, (TEST_BUF_SIZE * 1000) / (iTime2 - iTime1));
}uint8_t bsp_TestExtSRAM(void)
{WriteTest(0x5A);ReadTest();
}
4 测试
编译代码,将编译的文件下载到板卡中,然后运行代码
代码第79行:向RAM写48k数据0x5a
代码第80行:读出数据,并打印到终端
运行程序后,在终端可以看见:
.......