
一,FSMC简介1 E3 o& T, [: ]1 g FSMC:灵活的静态存储控制器8 r. W1 F- B' D8 v) w 能够与同步或异步存储器和16位PC存储器卡连接 STM32的FSMC接口支持包括SRAM、NAND FLASH、NOR FLASH和PSRAM等存储器6 Z( Q( e! r. L STM32 407和103是不支持SD RAM的,429,439支持SD RAM操作 5 ^% i' g }8 V' f6 \( F 二,FSMC驱动LCD原理 ![]() FSMC驱动外部SRAM(LCD被当做SRAM)- W% X; B- ? X SRAM控制包含: 地址线(如A0~A25) 数据线(如D0~D15), S$ @, V, L, T2 _: M 写信号(WE,即WR) 读信号(OE,即RD) H$ u6 |1 ?! Z% E) D 片选信号(CS) 若SRAM支持字节控制,还有UB/LB信号。 % W0 ^) `* A6 H3 W& C& L3 G+ [7 _ 上一节提到的TFTLCD信号,RS、D0~D15、WR、RD、CS、RST和BL等 9 }" b' `, n6 i 其中真正操作LCD时用到的就只有:9 _$ Y* z9 Y0 m 数据&命令:RS2 }; d; r3 d$ ? 数据线 ![]() 写信号:WR 读信号:RD 片选信号:CS# A! ~0 B6 i2 H1 i7 n( `% X" B6 Y4 u 操作时序和SRAM控制类似,唯一不同是TFTLCD有RS信号,但是没有地址信号 3 D0 F- |3 r/ v1 O2 o" A( s& Z% Z4 ` TFTLCD通过RS信号来决定传送是数据还是命令,可以理解为一个地址信号 ; L: S- {/ X6 S 将RS接到FSMC地址线A10(A0-A25随意),TFTLCD就被当做一个SRAM使用 7 C- o( _$ j! Q" z& j 这样TFTLCD成为只有一个地址的SRAM设备,从而实现FSMC驱动TFTLCD2 z( a5 B2 {& U1 a4 t 三,FSMC存储块' {0 }% F- C8 N# r2 \8 } STM32的FSMC支持8/16/32位数据宽度,我们使用的LCD为16位,所以设置选择16位 % D3 z& L4 e9 l0 W9 G& e8 |; n FSMC的外部设备地址映像:STM32的FSMC将外部存储器划分为固定大小为256M字节的四个存储块 ![]() ; l4 y# B" a0 a 如图: FSMC分为4块,每块256M字节又被划分为4*64,即四个片选 NOR / PSRAM使用块1,共256M( P( Q q# {1 y6 f5 @ NAND闪存使用块2,3,共512M" }3 ]* @' Q5 x) H9 X! h9 d0 y* n PC卡使用块4,共256M; C$ P; w! i+ `1 B8 K$ S; o 所以我们使用NOR PSRAM驱动TFTLCD 四,存储块1(Bank1)寄存器介绍1 ~) ?% h; e) g STM32的FSMC存储块1(Bank1)用于驱动NOR FLASH/SRAM/PSRAM 1 D1 S" F. ^9 B; R9 } Bank1被分为4个区,每个区管理64M字节空间,每个区都有独立的寄存器对所连接的存储器进行配置。 5 S* O: Y7 i* c0 B1 Z Bank1的256M字节空间由28根地址线(HADDR[27:0])寻址。 这里HADDR,是内部AHB地址总线 - T4 w- D( g( b4 o5 n HADDR[25:0]来自外部存储器地址FSMC_A[25:0],而HADDR[26:27]对4个区进行寻址。 ' X+ N2 d; O: u0 a0 t 如下图所示: + Z, h8 H, j! [0 t9 u( Y ![]() 说明: HADDR[27:26]是不可手动配置的,当选择所在区后会自动赋值9 C- M& N# c9 e9 c # w) p: l0 c& \1 \+ H/ K 注意: 1,当Bank1接 8位宽度存储器时:HADDR[25:0] -> FSMC_A[25:0] 2 添加当Bank1接16位宽度存储器时:HADDR[25:1] -> FSMC_A[24:0]对应关系的进一步解释 7 [8 h7 \% V) h" Q3 P 添加寄存器FSMC_BTRx为读时序控制,FSMC_BWTRx为写时序控制 由于内部每个地址对应一个字节,外部设备16位宽,FSMC的一个地址对应两个字节 即:# }8 j& X6 k# s, n$ q) { 0000对应FSMC_A[0]=0 (2字节) 0010对应FSMC_A[0]=1 (2字节) 0100对应FSMC_A[1]=1 (2字节)6 O$ R/ P: c7 t: u+ m& H 所以对应关系需要除以2,内部右移一位对齐$ a0 V/ @; U I* a# c; J% O0 n 此时最低位没用,访问最低位需要使用UB/LB ( l- D3 p7 q, K, G5 {$ f 不论外部接8位/16位宽设备,FSMC_A[0]永远接在外部设备地址A[0] c, \( d j. ?1 D+ L j" S 3 j* g0 C- {5 Q: `$ ~1 ?4 m0 V 五,存储块1(Bank1)模式A读写时序6 I# H* B ~5 W9 h STM32的FSMC存储块1支持的异步突发访问模式 2 w4 E' h6 e- L7 T B9 ~ 包括模式1,模式A~D等多种时序模型,驱动SRAM一般使用模式1或模式A 我们使用模式A驱动LCD(当做SRAM使用),模式A支持读写时序分开设置2 q& r. H8 v2 V4 p& x2 A* z ) _" } U5 P4 A3 I 上一篇说的LCD时序,我们知道,LCD的读写耗时是不同的.写快读慢 8 _, L- i: b0 A# x5 p$ y" [) V 这里采用模式A,针对不同的速度,做不同的设置 % d* n' U9 W; {( D. r% B 模式A读时序:; R8 G% V2 c4 `1 U. K7 B ![]() 模式A写时序:4 k1 A" c4 U# b6 r ![]() ILI9341时序-读写高低电平最小持续时间:# M& g6 E8 P4 D% B* C # W# z; O" F8 l ![]() , `! P" K, a) |/ b; _ H 根据ILI9341时序读写高低电平最小持续时间来配置模式A的读写时序 & M! e# K* z' D1 y9 } 六,FSMC相关寄存器介绍 对于NOR FLASH/PSRAM控制器-存储块1,可通过FSMC_BCRx、FSMC_BTRx和FSMC_BWTRx寄存器设置(其中x=1~4,对应4个区)。 : \ Y. P& x2 b4 e 通过这3个寄存器,可以设置FSMC访问外部存储器的时序参数,拓宽了可选用的外部存储器的速度范围。 $ O. q0 a! W2 n* D) w: e9 T 1,SRAM/NOR闪存片选控制寄存器(FSMC_BCRx) f, k9 v+ I7 N/ J( D+ R0 P* B ![]() EXTMOD:" K" ?( r4 K0 H/ [3 u# q 扩展模式使能位,控制是否允许读写不同的时序,需设置为1( X( C" C4 y/ Q- s* r+ Q2 O0 M WREN: 写使能位。我们要向TFTLCD写数据,需设置为1& }( n8 Z3 P. d% @6 P$ P' g/ S& } MWID[1:0]:7 }; P0 O0 {/ J$ w9 |- O 存储器数据总线宽度。00,表示8位数据模式;01表示16位数据模式;10和11保留。 我们的TFTLCD是16位数据线,需设置WMID[1:0]=01。7 e, O* \2 u ~ MTYP[1:0]: 存储器类型。00表示SRAM、ROM;01表示PSRAM;10表示NOR FLASH;11保留。 我们把LCD当成SRAM用,需设置MTYP[1:0]=00。& d( N1 p3 [! Z* @/ Z MBKEN:1 z6 j5 E* g3 q g. i& o- m 存储块使能位。需设置为1+ C" {: u' S# L. y3 `8 t# c" K$ g 2,SRAM/NOR闪存片选时序寄存器(FSMC_BTRx)-读时序控制 ![]() + Z! T4 A4 Q0 z1 w( ]+ s5 x ACCMOD[1:0]:9 l" c4 }0 u( ^: { W& ?4 \, j 访问模式。00:模式A;01:模式B;10:模式C;11:模式D。# ?5 a M3 ]- p2 T& c. j9 m 我们使用模式A,需设置为00* P6 e7 D8 j' k DATAST[7:0]:* G* y/ M x {% R. J 数据保持时间,等于: DATAST(+1)个HCLK时钟周期,DATAST最大为255。% [8 p5 i; H$ E9 n3 T$ s5 \" g 对于ILI9341相当于RD低电平持续时间,最大355ns5 d- v v$ H, X) Z0 l" e 对于STM32F1,一个HCLK=13.8ns (1/72M),设置为15,相当于16个HCLK=220.8,加上STM32F1的FSMC性能较低一些,配置为15即可 对于STM32F4,一个HCLK=6ns(1/168M) ,设置为60(360)。 ADDSET[3:0]:4 z) P2 J5 a1 A! p' S0 v3 o% K 地址建立时间。表示:ADDSET+1个HCLK周期,ADDSET最大为15。 对ILI9341来说,这里相当于RD高电平持续时间,为90ns。) o0 T" J1 Z) ~7 R# H6 B- e STM32F1的FSMC性能较低,即便设置为0,RD也有190ns高电平,所以设置为10 G! H# g9 w: S1 _9 A STM32F1设置为15 ( X! l" @. f8 {# t: {6 H& N9 S 注意: 如果未设置EXTMOD位,则读写共用FSMC_BTRx时序寄存器 3,SRAM/NOR闪存写时序寄存器(FSMC_BWTRx)-写时序控制 6 y. k. D' r* Q$ x0 J ![]() ! ~7 Z/ U% ?/ L) t) v8 ` ACCMOD[1:0]: 访问模式。00:模式A;01:模式B;10:模式C;11:模式D。# |/ z& T/ w. J4 u* \% X DATAST[7:0]:! H% o! s8 B; k) W6 s! Q# `" M6 M 数据保持时间,等于: DATAST(+1)个HCLK时钟周期,DATAST最大为255。 对ILI9341来说,其实就是WR低电平持续时间,为15ns,不过ILI9320等则需要50ns。 考虑兼容性,对STM32F1一个HCLK=13.8ns (1/72M),设置为3(4*13.8=55.2);1 o8 L9 T* m. @2 {/ s5 K 对STM32F4,一个HCLK=6ns(1/168M) ,设置为9(9*6=54)。 ADDSET[3:0]: 地址建立时间。表示:ADDSET+1个HCLK周期,ADDSET最大值为1111 = 15。 对ILI9341来说,这里相当于WR高电平持续时间,为15ns。 O) y+ L2 M7 o8 ^ 考虑兼容ILI9320,STM32F1即便设置为1,WR也有100ns高电平,所以设置为1。- I$ {5 d5 O* X, ?, [ 而对STM32F4,则设置为8(9*6=54)+ b* E* c5 f) f5 w: u" {7 |- [! u, h 七,寄存器组合说明# i& [/ C, A& }- i ST官方库寄存器定义中并没有FSMC_BCRx、FSMC_BTRx、FSMC_BWTRx等单独寄存器 而是将他们进行了一些组合。规律如下:' Z0 t1 ?* i. I0 o* j( }1 z: a FSMC_BCRx和FSMC_BTRx,组合成BTCR[8]寄存器组,他们的对应关系如下: BTCR[0]对应FSMC_BCR1,BTCR[1]对应FSMC_BTR1 BTCR[2]对应FSMC_BCR2,BTCR[3]对应FSMC_BTR2 BTCR[4]对应FSMC_BCR3,BTCR[5]对应FSMC_BTR3 BTCR[6]对应FSMC_BCR4,BTCR[7]对应FSMC_BTR4% }0 Z' ^4 ?0 Y, _7 q & y3 b6 \- z4 b% K4 I9 \ FSMC_BWTRx则组合成BWTR[7],他们的对应关系如下:0 ~4 R. b/ t4 q' U# G& J, i ] / w/ }5 Q v9 O/ T. t9 u BWTR[0]对应FSMC_BWTR1, BWTR[2]对应FSMC_BWTR2, BWTR[4]对应FSMC_BWTR3,( A( O& ]- u' ~( C3 _ BWTR[6]对应FSMC_BWTR4, BWTR[1]、BWTR[3]和BWTR[5]保留 5 J- |# ?$ [5 v$ O 6 g' T# U2 C% C0 d+ w) Z8 e! d9 I 转载自BraveWangDev 6 J: s- ?0 T# f3 X7 w$ d, Z+ ` |
买了野火的学习板,只有库文件方式FSMC控制,我想要寄存器方式控制 |