|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
STM32实例教程,带你了解FSMC的功能和用法
* Z. V. V/ A! S+ b9 {4 ]+ E
, Y) j3 P, x4 D2 f2 x/ pFSMC 简介
6 A, I5 e% X6 _7 P9 O- S zSTM32F103 100 引脚以上系列芯片都带有 FSMC 接口,我们开发板上使用的是 STM32F103ZET6,因此也具有FSMC 接口。6 m. }8 L& v* ]+ p! l
FSMC(Flexible Static Memory Controller,灵活的静态存储控制器)是% W6 {3 ]# r; ?5 V' ?7 E! D; P
STM32 系列采用一种新型的存储器扩展技术,能够连接同步、异步存储器和 16位 PC 存储卡。STM32通过FSMC可以与SRAM、 ROM、 PSRAM、 NOR Flash和NANDFlash等存储器的引脚直接相连。STM32F1的FSMC内部框图如下图所示:(大家也可以查看 《STM32F10x中文参考手册》-19 灵活的静态存储控制器(FSMC)-19.2 章节内容)% ]. P% i/ }* ?/ g2 e7 s( i6 Y
( f: Q3 U0 x9 B- B( M& `0 j- Z6 X
我们把 FSMC 结构框图分成3 个子模块,按照顺序依次进行简单介绍。+ b/ U2 Z: o& {* w+ t! g" R
(1)标号 1:时钟输入
$ N+ o3 O; G9 Z% Z$ b2 ~/ w6 q3 eFSMC 的时钟来至时钟控制器HCLK,在前面我们讲解“存储器与寄存器”时,我们知道,AHB 区域内包含 FSMC 模块,所以如果要使用 FSMC,必须使能 AHB 总线时钟。! h7 I, n& ^ x2 a- D! Y8 m
(2)标号 2:AHB 接口) y; E$ b/ a" K# S
CPU 和其它 AHB 总线主设备可通过该 AHB 从设备接口访问外部静态存储
1 p+ X( w2 A$ i) w器。FSMC 可通过一个寄存器组进行配置。有关 NOR Flash/PSRAM 控制寄存器的详细说明,请参《STM32F10x 中文参考手册》-19 灵活的静态存储控制器(FSMC)-19.5章节内容。$ n1 v7 z+ @2 S9 C# t. |1 W
(3)FSMC 外部设备
& \. m$ B6 ?% s2 [7 eSTM32F1 的 FSMC 将外部设备分为 2 类:NOR/PSRAM 设备、NAND/PC 卡设备。他们共用地址数据总线等信号,但具有不同的 CS 以区分不同的设备。
K% u9 Z% `# P/ C. A5 _本实验我们使用的是FSMC 的 NOR/PSRAM 存储器控制器部分,即把TFTLCD当成 SRAM 设备使用。为什么可以把 TFTLCD 当成 SRAM 设备用,这个首先要了解 NOR/PSRAM 存储器控制器的接口信号,其接口信号功能如下:
4 @# U* q _& f# z7 Q; k- r4 A![]()
, E2 w6 n. A& ~: z从上图中可以看出外部 SRAM 的控制一般有:地址线(如 A0~A25)、双向数据线(如 D0~D15)、写信号( NWE)、读信号( NOE)、片选信号(NE[x]),如果 SRAM 支持字节控制,那么还有 UB/LB 信号。而 TFTLCD 的信号我们在上一节有介绍,包括:RS、DB0-DB15、 WR、 RD、 CS、 RST 等,其中真正在操作 LCD 的时候需要用到的就只有:RS、 DB0-DB15、 WR、 RD、 CS。这样一来它们的操作接口信号完全类似,唯一不同就是 TFTLCD 有 RS 信号,但是没有地址信号。
! s; Y h: p' M0 j5 g, bTFTLCD 通过 RS 信号来决定传送的数据是数据还是命令,本质上可以理解
4 G0 L7 z% F( `+ e0 ~/ q( {/ B6 m为一个地址信号,比如我们把 RS 接在 A0 上面,那么当 FSMC 控制器写地址 0的时候,会使得 A0 变为 0,对 TFTLCD 来说,就是写命令。而 FSMC 写地址 1的时候, A0 将会变为 1,对 TFTLCD 来说,就是写数据了。这样,就把数据和命令区分开了,他们其实就是对应 SRAM 操作的两个连续地址。当然 RS 也可以接在其他地址线上,我们STM32F1 开发板是把 RS 连接在 A10 上面的。
0 n* V* E5 Z! q( L, H6 l7 r知道了可以将 TFTLCD 当做 SRAM 设备用,下面我们就来看下 FSMC 的外部设备地址映射,从 FSMC 的角度,外部存储器被划分为 4 个固定大小的存储区域(Bank),每个存储区域的大小为 256 MB,共 1GB 空间。如下图所示:0 C3 G2 G6 V' o9 T8 c; e/ I1 G+ }
& S) N0 G# H- X& i2 G/ \ s7 z
4 R8 l+ u; D; r' E9 |本实验使用到的是Bank1,所以我们只讲解这块存储区域,其他的区域大家可参考《STM32F10x 中文参考手册》-19 灵活的静态存储控制器(FSMC)章节内容。
' u$ |" |# U* U4 ]1 A, F: F" q% `' K! T存储区域 1 可连接多达 4 个 NOR Flash 或 PSRAM 存储器器件。此存储区域被划分为 4 个 NOR/PSRAM 区域, 带 4 个专用片选信号。存储区域 2 和 3 用于连接 NAND Flash 器件(每个存储区域一个器件)。存储区域 4 用于连接 PC卡设备。对于每个存储区域, 所要使用的存储器类型由用户在配置寄存器中定义。
1 \6 n# j4 ^6 L! v& [STM32F1 的 FSMC 各 Bank 配置寄存器如下图所示:6 q! Y( h3 m. [' y5 Y; C
& R) a& b1 z) }/ T7 X5 ]6 \0 M3 G; Z3 x" J5 ~
STM32F1 的 FSMC 存储块 1 ( Bank1) 又被分为 4 个区, 每个区管理 64M 字节空间,每个区都有独立的寄存器对所连接的存储器进行配置。 Bank1 的 256M字节空间由 28 根地址线 (HADDR[27:0]) 寻址。 这里 HADDR 是内部 AHB 地址 总线, 其 中 HADDR[25:0] 来自外部存储器地 址 FSMC_A[25:0], 而 HADDR[26:27]对 4 个区进行寻址。如下图所示:0 D K, L+ I1 j( M8 J) M- z3 Z
; o9 l$ p! ?1 P
: r% z- }2 e" S
本实验我们使用的是 Bank1 的第 4 区,即起始地址为 0X6C000000。这里要特别注意 HADDR[25:0], HADDR[25:0]包含外部存储器地址。由于 HADDR 为字节地址,而存储器按字寻址,所以根据存储器数据宽度不同,实际向存储器发送的地址也将有所不同,如下图所示:
. s. r3 r! i1 X% o; c) }
$ I3 B' [$ Q1 a5 R9 |" H
8 e- J2 d+ W; I: r" @# C9 C
8 ^9 |3 t- d# H, P$ q8 R+ ^: l2 R* N! k; @+ u o N- b( B. c% ^
如果外部存储器的宽度为 8 位, FSMC 将使用内部的 HADDR[25:0] 地址来作为对外部存储器的寻址地址 FSMC_A[25:0]。
/ e" T2 H' m" `/ H这里请大家特别留意,如果外部存储器的宽度为 16 位, FSMC 将使用内部的 HADDR[25:1] 地址来作为对外部存储器的寻址地址 FSMC_A[24:0],相当于右移了一位,在后面我们设置 A10 地址的时候就要使用到。无论外部存储器的宽度为 16 位还是 8 位, FSMC_A[0] 都应连接到外部存储器地址 A[0]。
& z) d* b3 C( z* S/ Z另外,HADDR[27:26]的设置,是不需要我们干预的,比如:当你选择使用Bank1 的第三个区,即使用 FSMC_NE3 来连接外部设备的时候,即对应了
* I$ ~# A. c% @" ]! x8 w D4 J7 D7 }HADDR[27:26]=10,我们要做的就是配置对应第 3 区的寄存器组,来适应外部设备即可。FSMC 的各 Bank配置寄存器在上图 38.1.2.3 以列出。1 X% n6 W, a, y: r1 a( i% B- O
对于 NOR FLASH 控制器,主要是通过 FSMC_BCRx、 FSMC_BTRx 和: M6 {8 J |# u, ~& f- Y
FSMC_BWTRx 寄存器设置(其中 x=1~4,对应 4 个区)。通过这 3 个寄存器,可以设置 FSMC 访问外部存储器的时序参数, 拓宽了可选用的外部存储器的速度范围。+ M# |8 X6 C5 W; S& S( ~% }
FSMC 的 NOR FLASH 控制器支持同步和异步突发两种访问方式。选用同步突发访问方式时, FSMC 将 HCLK(系统时钟)分频后,发送给外部存储器作为同步时钟信号 FSMC_CLK。此时需要的设置的时间参数有 2 个:' l% \" }# L) w) V! g! X. b
①HCLK 与 FSMC_CLK 的分频系数(CLKDIV),可以为 2~16 分频;
) a6 a- R9 b3 Y' ^②同步突发访问中获得第 1 个数据所需要的等待延迟(DATLAT)。
# h% R' o2 d$ V' o0 q* r# J9 ?! \对于异步突发访问方式, FSMC 主要设置 3 个时间参数:地址建立时间
5 d6 A( F# w$ }0 ?4 x4 i# ?(ADDSET)、 数据建立时间(DATAST)和地址保持时间(ADDHLD)。FSMC 综合了 SRAM/ROM、 PSRAM 和 NORFlash 产品的信号特点,定义了 4 种不同的异步时序模型。选用不同的时序模型时,需要设置不同的时序参数,如下图所列:
' {5 s. t& ^% j4 G: M5 p1 ]/ q3 E
( N; v( @: t$ U" \
4 ?1 o0 ~; i. c5 O, b ( r; x, W3 _7 v0 ]6 ?" _, V
在实际扩展时,根据选用存储器的特征确定时序模型,从而确定各时间参数与存储器读/写周期参数指标之间的计算关系;利用该计算关系和存储芯片数据手册中给定的参数指标,可计算出 FSMC 所需要的各时间参数,从而对时间参数寄存器进行合理的配置。! e1 _7 C9 h& M: a
本实验我们使用异步模式 A( ModeA)方式来控制 TFTLCD,模式 A 的读操作时序如下图所示:
) a6 y; b6 g4 m& b0 J6 J
- z/ G0 d# Q% D' T
7 T$ C5 b: E) j [9 ?
; @0 L% T, ?: G% }4 \5 l
模式 A 支持独立的读写时序控制, 这个对我们驱动 TFTLCD 来说非常有用,因为 TFTLCD 在读的时候,一般比较慢,而在写的时候可以比较快,如果读写用一样的时序,那么只能以读的时序为基准,从而导致写的速度变慢,或者在读数据的时候,重新配置 FSMC 的延时,在读操作完成的时候,再配置回写的时序,这样虽然也不会降低写的速度,但是频繁配置,比较麻烦。而如果有独立的读写时序控制,那么我们只要初始化的时候配置好,之后就不用再配置,既可以满足速度要求,又不需要频繁改配置。模式 A 的写操作时序如下图所示:
, `# T& A! k, g$ q( {" [2 ~) u
% q) W: ]3 H8 S" }4 S, G9 N) n2 @/ x ]( \" Z4 m
模式 A 读写时序中的 ADDSET 与 DATAST,是通过不同的寄存器设置的。由于篇幅限制, 本文并没有对 FSMC 相关寄存器进行介绍, 大家可以参考 《STM32F10x中文参考手册》-19 灵活的静态存储控制器(FSMC)章节寄存器内容,里面有详细的讲解。不过,这里还要给大家做下科普,在标准库的寄存器定义里面,并没有定义 FSMC_BCRx、 FSMC_BTRx、 FSMC_BWTRx 等这个单独的寄存器,而是将他们进行了一些组合。6 q6 p# X O* \& e
FSMC_BCRx 和 FSMC_BTRx, 组合成 BTCR[8]寄存器组, 他们的对应关系如下:0 ] H. K) ?# n1 y
BTCR[0]对应 FSMC_BCR1, BTCR[1]对应 FSMC_BTR1
) J/ a& J! Z: _" a" yBTCR[2]对应 FSMC_BCR2, BTCR[3]对应 FSMC_BTR2* I% o9 G. q& G1 M: v
BTCR[4]对应 FSMC_BCR3, BTCR[5]对应 FSMC_BTR3
, \' a! p J+ L# p3 h: ?! P0 vBTCR[6]对应 FSMC_BCR4, BTCR[7]对应 FSMC_BTR4
0 Y; \9 L% n) f eFSMC_BWTRx 则组合成 BWTR[7],他们的对应关系如下:
2 K1 @: X( ]) v, o0 t+ }BWTR[0]对应 FSMC_BWTR1, BWTR[2]对应 FSMC_BWTR2,
# P; f% E6 [! v8 A& k8 K! YBWTR[4]对应 FSMC_BWTR3, BWTR[6]对应 FSMC_BWTR4, t: E" d9 h" M* [& T6 Z
BWTR[1]、 BWTR[3]和 BWTR[5]保留,没有用到。9 Y( y/ h+ N. q/ J0 a
FSMC 内部还是比较复杂的,如果看不懂的可以暂时放下,因为我们使用的是库函数开发,只需简单配置下即可使用。8 v% F U7 P" O2 \7 K1 T! n+ u! C
, H& B- B; w; i" ~ |
|