STM32 FSMC驱动SRAM

STM32 FSMC驱动SRAM

1. 简介

正点原子战舰 / 探索者开发板 板载一颗 1M 字节容量的SRAM芯片:XM8A51216,满足大内存使用需求。

16位宽512K(512*16,即1M字节),使用8080并口时序

  • 高速:具有最高访问速度15ns
  • TTL电平兼容
  • 低功耗:80MHz时55mA,待机电流 20mA
  • 全静态操作:不需要刷新和时钟电路
  • 三态输出
  • 字节控制功能:支持高/低字节控制

2.结构框图

image-20240829202132313

每个地址存放16Bit数据,总容量1MB

  • A0~18:19根地址线,2^19 = 512K
  • DQ0~15:16根数据线,输入/输出
  • CEn:芯片使能信号,低电平有效
  • OEn:输出(读)使能信号,低电平有效
  • WEn:写使能信号,低电平有效
  • BLEn:低字节控制信号(DQ0~7有效)
  • BHEn:高字节控制信号(DQ8~15有效)

3. 8080时序

3.1 读时序

image-20240829202810650

3.2 写时序

image-20240829203007861

4. SRAM 读写操作步骤

  1. 设置地址信号线:发出要访问的存储器目标地址
  2. 控制片选信号:选中器件
  3. 决定数据操作方式:读操作,控制读使能信号OE表示读数据;写操作,控制写使能信号WE表示写数据
  4. 设置获取数据方式:掩码信号BLE和BHE指示要访问目标地址的高、低字节部分
  5. 获取数据:读过程,存储器通过数据线向主机输出目标地址数据;写过程,使用数据线向存储器目标地址写入目标数据

5. FSMC驱动SRAM

image-20240829203345414

如图可见,我们可以通过IO口模拟出时序驱动SRAM,也可以通过配置FSMC驱动SRAM

FSMC时序介绍

访问模式对应的外部存储器设置参数
模式1SRAM/CRAMADDSET、DATAST
模式ASRAM/PSRAM(CRAM)ADDSET、DATAST
模式B/2NOR FLASHADDSET、DATAST
模式CNOR FLASHADDSET、DATAST
模式D带地址扩展的异步操作ADDSET、DATAST、ADDHLD

此处我们选择模式A

5.1 配置FSMC时序

5.1.1 FSMC 模式A 读时序

image-20240829203623369

通过配置ADDSET=0,DATAST=1,就可以成功模拟出读时序

5.1.2 FSMC 模式A 写时序

image-20240829203813532

通过配置ADDSET=0,DATAST=1,就可以成功模拟出写时序

5.2 内核地址映射

image-20240829203851862

从图上我们可以看出,STM32将0x6000 0000 - 0x9FFF FFFF地址划分为扩展外部存储器区域,这个区域就是由FSMC进行地址映射。

SRAM选择Bank1,通过对FSMC映射出来的地址进行读和写操作,就能控制SRAM芯片进行读和写

*(uint16_t *)(SRAM_BASE_ADDR + addr) = data; 向SRAM某个地址写入数据

data = *(uint16_t *)(SRAM_BASE_ADDR + addr);向SRAM某个地址读取数据

SRAM_BASE_ADDR 为0x6000 0000 -0x6FFF FFFF之间区域的一个地址 addr为地址偏移量

6. 配置驱动代码实例

通过HAL_SRAM_Init函数进行配置FSMC

HAL_StatusTypeDef HAL_SRAM_Init(SRAM_HandleTypeDef *hsram, FSMC_NORSRAM_TimingTypeDef *Timing, FSMC_NORSRAM_TimingTypeDef *ExtTiming)

我们接下来看一下他的传参

第一个传参SRAM_HandleTypeDef *hsram

#if (USE_HAL_SRAM_REGISTER_CALLBACKS == 1)
typedef struct __SRAM_HandleTypeDef
#else
typedef struct
#endif /* USE_HAL_SRAM_REGISTER_CALLBACKS  */
{
  FSMC_NORSRAM_TypeDef           *Instance;  /* 寄存器基地址 */

  FSMC_NORSRAM_EXTENDED_TypeDef  *Extended;  /* 扩展模式寄存器基地址 */

  FSMC_NORSRAM_InitTypeDef       Init;      /* SRAM初始化结构体*/

  HAL_LockTypeDef               Lock;       /*!< SRAM locking object                          */

  __IO HAL_SRAM_StateTypeDef    State;      /*!< SRAM device access state                     */

  DMA_HandleTypeDef             *hdma;      /*!< Pointer DMA handler                          */

#if (USE_HAL_SRAM_REGISTER_CALLBACKS == 1)
  void (* MspInitCallback)(struct __SRAM_HandleTypeDef *hsram); /*!< SRAM Msp Init callback              */
  void (* MspDeInitCallback)(struct __SRAM_HandleTypeDef *hsram);  /*!< SRAM Msp DeInit callback            */
  void (* DmaXferCpltCallback)(DMA_HandleTypeDef *hdma);      /*!< SRAM DMA Xfer Complete callback     */
  void (* DmaXferErrorCallback)(DMA_HandleTypeDef *hdma);     /*!< SRAM DMA Xfer Error callback        */
#endif
} SRAM_HandleTypeDef;

我们主要配置*Instance,*Extended,Init

其中FSMC_NORSRAM_InitTypeDef Init配置如下

typedef struct 
{ 
	uint32_t NSBank; 				/* 存储区块号 */ 
	uint32_t DataAddressMux; 		/* 地址/数据复用使能 */ 	
	uint32_t MemoryType; 			/* 存储器类型 */ 	
	uint32_t MemoryDataWidth; 		/* 存储器数据宽度 */
	uint32_t BurstAccessMode;		/* 设置是否支持突发访问模式,只支持同步类型的存储器 */
	uint32_t WaitSignalPolarity;		/* 设置等待信号的极性 */
	uint32_t WrapMode; 			/* 突发模式下存储器传输使能 */
	uint32_t WaitSignalActive; 		/* 等待信号在等待状态之前或等待状态期间有效 */ 
	uint32_t WriteOperation; 		/* 存储器写使能 */ 
	uint32_t WaitSignal; 			/* 是否使能等待状态插入 */  
	uint32_t ExtendedMode; 		/* 使能或者禁止使能扩展模式 */ 
	uint32_t AsynchronousWait; 		/* 用于异步传输期间,使能或者禁止等待信号 */ 
	uint32_t WriteBurst; 			/* 用于使能或者禁止异步的写突发操作 */ 
	uint32_t PageSize; 				/* 设置页大小 */ 
} FSMC_NORSRAM_InitTypeDef;

我们只需要配置NSBank,DataAddressMux,MemoryType,MemoryDataWidth,WriteOperation,ExtendedMode即可

接下来看第二个参数FSMC_NORSRAM_TimingTypeDef *Timing

typedef struct 
{ 
	uint32_t AddressSetupTime; 			/* 地址建立时间 */ 
	uint32_t AddressHoldTime; 			/* 地址保持时间,模式A无效 */ 	
	uint32_t DataSetupTime; 			/* 数据建立时间 */ 	
	uint32_t BusTurnAroundDuration; 	/* 总线周转阶段的持续时间 */
	uint32_t CLKDivision;				/* CLK时钟输出信号的周期 */
	uint32_t DataLatency;				/* 同步突发NOR FLASH的数据延迟 */
	uint32_t AccessMode;				/* 异步模式配置 */
} FSMC_NORSRAM_InitTypeDef;

将配置ADDSET = 0,DATAST = 1,AccessMode=FSMC_ACCESS_MODE_A

  • 28
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值