打印
[应用相关]

STM32 FSMC驱动SRAM

[复制链接]
293|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2024-9-4 12:15 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1. 简介
正点原子战舰 / 探索者开发板 板载一颗 1M 字节容量的SRAM芯片:XM8A51216,满足大内存使用需求。

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

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



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

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



3.2 写时序



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



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

FSMC时序介绍



此处我们选择模式A

5.1 配置FSMC时序
5.1.1 FSMC 模式A 读时序



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

5.1.2 FSMC 模式A 写时序



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

5.2 内核地址映射



从图上我们可以看出,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
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/dianfu233/article/details/141689470

使用特权

评论回复
沙发
呐咯密密| | 2024-9-4 15:20 | 只看该作者
文章质量不错,过程详细

使用特权

评论回复
板凳
SRAM 读写操作非常不错

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1747

主题

15155

帖子

10

粉丝