# FSMC
# In one word
可变静态存储控制器
通过它能够读写外部存储器,相当于把外部存储器连接到了内核 External RAM 的地址,可直接访问
配置时有多种时序模型
参考资料:https://blog.csdn.net/as480133937/article/details/123740365 与 探索者开发指南
本文主要讨论 NOR/PSRAM/SRAM 控制器 即块 1
# 对外部存储器的划分
四个存储块(Bank),大小 256MB
存储块下分四个区,即每个区 64MB
# 寻址
# Intro
问:Bank1 的 256MB 空间,怎么去寻址?
答:通过 28 根地址线 HADDR [27:0]
HADDR 是 内部 AHB 的地址总线
# 寻址的过程
[27:26] 决定了选区(1-4)控制 NEx 信号
[25:0] 对应外部存储器地址 2^26 = 2^6 M = 64M FSMC_A [25:0] 外部存储器的地址总线
每个地址是 1Byte 数据
# 不同宽度数据总线
其中对应不同宽度的数据总线,HADDR 与 FSMC_A 的关系略有不同
(此处是考虑这种情况,比方说只支持 16 位写入的 16 位 NOR FLASH)
16 位:HADDR [25:1] —> FSMC_A [24:0]
8 位:HADDR [25:0] —> FSMC_A [25:0]
存储空间的一个验证性计算:
- 16 位,总空间:地址数 2^25 * 数据位宽 16 \ 字节位数 8 = 2^26 = 64M
- 8 位,总空间:地址数 2^26 * 数据位宽 8 \ 字节位数 8 = 2^26 = 64M
# NOR/PSRAM/SRAM 控制器的寄存器配置
# 概括
控制 NOR FLASH 的有 FSMC_BCR1/2/3/4 控制寄存器、FSMC_BTR1/2/3/4 片选时序寄存器以及 FSMC_BWTR1/2/3/4 写时序寄存器。
每种寄存器都有 4 个,分别对应于 4 个不同的存储区域,x=1-4 对应四个区
FSMC_BCR 控制寄存器可配置要控制的存储器类型、数据线宽度以及信号有效极性能参数。
FMC_BTR 时序寄存器用于配置 SRAM 访问时的各种时间延迟,如数据保持时间、地址保持时间等。
FMC_BWTR 写时序寄存器与 FMC_BTR 寄存器控制的参数类似,它专门用于控制写时序的时间参数
# FSMC_BCRx:控制寄存器
几个比较关键的位
- EXTMOD 扩展模式使能(是否允许读写不同的时序)
- WREN 写入使能(控制能否在存储区域写入)
- MWID 配置存储器的数据总线宽度(8 位或者 16 位)
- MTYP 配置存储器类型
- MBKEN 存储区域使能(控制能否访问该存储区域)
EXTMOD 使能后,分别控制 FSMC_BTRx, FSMC_BWTRx
# FSMC_BTRx:片选时序寄存器
配置读操作的时序
- ACCMOD 配置异步访问模式(共 4 种)
- DATAST 配置数据的持续时间
- ADDSET 配置地址的持续时间
# FSMC_BWTRx:写时序寄存器
与 FSMC_BTRx 类似,但是配置的是写操作的时序
- ACCMOD DATAST ADDSET
这三个寄存器可以设置 FSMC 访问外部存储器的时序参数
# FSMC 时钟
挂载在 AHB 总线,时钟 = HCLK,同步时钟输出就是由它分频得到
# 两种访问方式
同步突发访问与异步突发访问
- 同步:
- 需要提供时钟信号,将 HCLK 分频后作为 FSMC_CLK 输出
- 设置分频系数(CLKDIV)和等待延迟(DATLAT)
- 异步:
- 4 种模型 ModeA~D
- 参数主要有:地址建立时间,数据建立时间,地址保持时间
- 实际中需要根据选用的存储器确定时序模型
# ModeA 读写时序
# 相关信号的定义:
- A [25:0] 地址总线
- D [15:0] 数据总线
- NBL [1:0] 数据掩码 一共有 4 种组合,32 位对应 4 字节,然而存储器的数据总线 8 或 16 位,因此要多次传输,需要一个数据掩码标注传输的是哪一部分的数据
下面的全部低电平有效
- NEx 单个存储块内部的某一个区的片选信号 NE 一共有 4 位,对应 4 个区
- NOE 输出使能
- NWE 写使能
# 工作的过程(如何访问外部存储器)
当 FSMC 外设被配置成正常工作,并且外部接了 PSRAM,若向 0x60000000 地址写入数据
如 0xABCD,FSMC 会自动在各信号线上产生相应的电平信号,写入数据。FSMC 会控制片选
信号 NE1 输出低电平,相应的 PSRAM 芯片被片选激活,然后使用地址线 A [25:0] 输出
0x60000000,在 NWE 写使能信号线上发出低电平的写使能信号,而要写入的数据信号 0xABCD
则从数据线 D [15:0] 输出,然后数据就被保存到 PSRAM 中了。
经过正确配置,外部存储器的存储单元映射到 External RAM,这之后,程序可以对这个地址直接进行读写操作,与外部存储器交互的过程即实际的操作(地址、数据、时序)由 FSMC 外设自动完成
正点原子 TFT 屏
正点原子 TFT 屏移植 CubeMX