|
一,FSMC简介# _: i$ `* e# {5 T3 S5 f+ r FSMC:灵活的静态存储控制器 ] i& l! B: I2 W 能够与同步或异步存储器和16位PC存储器卡连接* i/ t" \; J5 p. h, D5 M* g$ N STM32的FSMC接口支持包括SRAM、NAND FLASH、NOR FLASH和PSRAM等存储器' l2 z4 a8 j1 |1 n STM32 407和103是不支持SD RAM的,429,439支持SD RAM操作 二,FSMC驱动LCD原理# K1 P) ^" k9 l# R4 J) L
FSMC驱动外部SRAM(LCD被当做SRAM) - F1 p8 J: K I, B1 w SRAM控制包含:4 g6 y0 C+ m3 p 地址线(如A0~A25)1 L! \4 F& W/ b; v* K4 ` 数据线(如D0~D15), n, a$ k, Y6 [+ o' y9 V W) Q 写信号(WE,即WR) 读信号(OE,即RD)1 m) ~) J* M: g7 o/ C! {! e8 J 片选信号(CS) 若SRAM支持字节控制,还有UB/LB信号。 上一节提到的TFTLCD信号,RS、D0~D15、WR、RD、CS、RST和BL等% ~" y( T7 r2 H5 n; {5 h w0 v3 D* Q 其中真正操作LCD时用到的就只有:: D) ~" n. X& Z6 J L 数据&命令:RS 数据线 0~D15写信号:WR 读信号:RD! r" z Z0 i; n! |1 n* z/ F 片选信号:CS9 c) P( V. q$ D+ z1 A: } g! R/ Y 操作时序和SRAM控制类似,唯一不同是TFTLCD有RS信号,但是没有地址信号" x3 C4 M0 h G. f8 [ q TFTLCD通过RS信号来决定传送是数据还是命令,可以理解为一个地址信号 2 p& a* z1 A9 S! o# F% B) B: p 将RS接到FSMC地址线A10(A0-A25随意),TFTLCD就被当做一个SRAM使用 5 \# F8 \+ S& u2 O9 y 这样TFTLCD成为只有一个地址的SRAM设备,从而实现FSMC驱动TFTLCD 三,FSMC存储块8 q$ f$ V9 \5 W; C: [& r( p STM32的FSMC支持8/16/32位数据宽度,我们使用的LCD为16位,所以设置选择16位 FSMC的外部设备地址映像:STM32的FSMC将外部存储器划分为固定大小为256M字节的四个存储块& p2 b7 g/ a% Q
7 w( i1 n7 I$ Y7 m3 U7 e 如图: FSMC分为4块,每块256M字节又被划分为4*64,即四个片选; ?5 i2 s8 T# S, z NOR / PSRAM使用块1,共256M NAND闪存使用块2,3,共512M5 t4 R1 ~7 U; m4 t& q+ c PC卡使用块4,共256M 所以我们使用NOR PSRAM驱动TFTLCD # C* m- ~. O4 B& K" g 四,存储块1(Bank1)寄存器介绍4 m6 l2 R$ ]/ j' k STM32的FSMC存储块1(Bank1)用于驱动NOR FLASH/SRAM/PSRAM 9 r: ~1 Q! i$ o- F: ~ Bank1被分为4个区,每个区管理64M字节空间,每个区都有独立的寄存器对所连接的存储器进行配置。 - m9 C5 `- l- z1 }: g! H r Bank1的256M字节空间由28根地址线(HADDR[27:0])寻址。 这里HADDR,是内部AHB地址总线 HADDR[25:0]来自外部存储器地址FSMC_A[25:0],而HADDR[26:27]对4个区进行寻址。 如下图所示:" x8 j/ Q0 s$ Q5 {6 h
5 [& f# K; J1 K$ A 说明: HADDR[27:26]是不可手动配置的,当选择所在区后会自动赋值7 F4 M) W0 [: \1 v6 v7 d 3 t9 c5 M( [8 Q3 {5 V3 f5 y0 x 注意: 1,当Bank1接 8位宽度存储器时:HADDR[25:0] -> FSMC_A[25:0] 2 添加当Bank1接16位宽度存储器时:HADDR[25:1] -> FSMC_A[24:0]对应关系的进一步解释 5 u. U7 y3 b3 Z, g3 b- f6 L# U, J 添加寄存器FSMC_BTRx为读时序控制,FSMC_BWTRx为写时序控制 9 }+ B, w8 i, O+ B7 H9 a1 C9 X' l 由于内部每个地址对应一个字节,外部设备16位宽,FSMC的一个地址对应两个字节* G# R' M/ n0 f9 S 即:4 V3 `5 ^- X5 q& |& `& w( { 0000对应FSMC_A[0]=0 (2字节) 0010对应FSMC_A[0]=1 (2字节)0 m5 y' d' W+ [9 x- a* I. } 0100对应FSMC_A[1]=1 (2字节)& [& U/ ?! z: ?, k0 t9 L: ~ 7 ^" b* v' r5 s# K9 n+ F$ i' _ 所以对应关系需要除以2,内部右移一位对齐 此时最低位没用,访问最低位需要使用UB/LB5 q" w8 I+ p6 }5 k 9 \ L: T) F* K! ~% Z3 ^9 D$ K. w/ i 不论外部接8位/16位宽设备,FSMC_A[0]永远接在外部设备地址A[0] 五,存储块1(Bank1)模式A读写时序 STM32的FSMC存储块1支持的异步突发访问模式 5 y5 _4 r* l: e/ j7 T* \+ I 包括模式1,模式A~D等多种时序模型,驱动SRAM一般使用模式1或模式A 我们使用模式A驱动LCD(当做SRAM使用),模式A支持读写时序分开设置 上一篇说的LCD时序,我们知道,LCD的读写耗时是不同的.写快读慢 . Y! V7 d2 \! i 这里采用模式A,针对不同的速度,做不同的设置 ) V1 Z" ^; E: C3 Z, y; l 模式A读时序:1 p* `' s" P: F' z+ d8 A
* n1 e% Q0 d3 N$ x. E: @ 模式A写时序:
ILI9341时序-读写高低电平最小持续时间:$ l+ J7 t) q* {' O 3 c. G E. e7 B# t" a: S7 t
0 M8 A; ?' ?( H1 I0 R. e4 \) u/ R0 }- s3 h 根据ILI9341时序读写高低电平最小持续时间来配置模式A的读写时序5 e, L& p& v+ P4 l* s! } 6 b0 d. [& U) H& U 六,FSMC相关寄存器介绍; I% I" W) n' L) \" i 对于NOR FLASH/PSRAM控制器-存储块1,可通过FSMC_BCRx、FSMC_BTRx和FSMC_BWTRx寄存器设置(其中x=1~4,对应4个区)。 : T, o. s- O/ E9 Q7 Q 通过这3个寄存器,可以设置FSMC访问外部存储器的时序参数,拓宽了可选用的外部存储器的速度范围。2 P7 s3 U- l5 U6 c; z( e2 p J$ J3 f/ [5 S/ o; U n- V 1,SRAM/NOR闪存片选控制寄存器(FSMC_BCRx)
EXTMOD:* |$ \0 f& I1 S3 d 扩展模式使能位,控制是否允许读写不同的时序,需设置为12 ^# m0 i! D( `& @! O' l' M( b WREN: 写使能位。我们要向TFTLCD写数据,需设置为10 E; P& g) i9 {) ^/ ^ MWID[1:0]:% y3 [0 Q9 V' G2 c3 y' [ 存储器数据总线宽度。00,表示8位数据模式;01表示16位数据模式;10和11保留。 我们的TFTLCD是16位数据线,需设置WMID[1:0]=01。 MTYP[1:0]:. I- S) Q, `/ r# y, j 存储器类型。00表示SRAM、ROM;01表示PSRAM;10表示NOR FLASH;11保留。 我们把LCD当成SRAM用,需设置MTYP[1:0]=00。 MBKEN:: `) B4 n: p0 D+ D% b l) f# K 存储块使能位。需设置为1 , Y' q F) w4 ]' ^) [ 2,SRAM/NOR闪存片选时序寄存器(FSMC_BTRx)-读时序控制
! G7 ?5 y" U8 I o7 n' } ACCMOD[1:0]: 访问模式。00:模式A;01:模式B;10:模式C;11:模式D。2 i' Q% s, @5 b- K 我们使用模式A,需设置为00 DATAST[7:0]: 数据保持时间,等于: DATAST(+1)个HCLK时钟周期,DATAST最大为255。 对于ILI9341相当于RD低电平持续时间,最大355ns 对于STM32F1,一个HCLK=13.8ns (1/72M),设置为15,相当于16个HCLK=220.8,加上STM32F1的FSMC性能较低一些,配置为15即可2 I4 Y6 X/ v3 @! k& r; q 对于STM32F4,一个HCLK=6ns(1/168M) ,设置为60(360)。1 m8 j' ?! }+ `* e ADDSET[3:0]:0 q3 a. b" w2 C, }' O, { 地址建立时间。表示:ADDSET+1个HCLK周期,ADDSET最大为15。5 f4 r( E, d0 B; A 对ILI9341来说,这里相当于RD高电平持续时间,为90ns。/ f2 k) o/ |3 e( } STM32F1的FSMC性能较低,即便设置为0,RD也有190ns高电平,所以设置为1 STM32F1设置为150 j" F1 [" ]6 V5 m0 f! p 注意:0 {* e2 t/ Y' U 如果未设置EXTMOD位,则读写共用FSMC_BTRx时序寄存器 + o6 N9 R5 Z4 j2 q( b5 } 3,SRAM/NOR闪存写时序寄存器(FSMC_BWTRx)-写时序控制0 ?% B, v% a9 a4 N; _% F 8 A% }( V5 w7 l; ?. \4 D" S, ?
* U/ m- p ]; O' s/ K) k8 G: g# g K ACCMOD[1:0]: 访问模式。00:模式A;01:模式B;10:模式C;11:模式D。 DATAST[7:0]: 数据保持时间,等于: DATAST(+1)个HCLK时钟周期,DATAST最大为255。) |, S" V+ I4 \" D# J Z2 a5 h 对ILI9341来说,其实就是WR低电平持续时间,为15ns,不过ILI9320等则需要50ns。8 `3 V# f; M* w' v8 N; y# P, S) R9 B 考虑兼容性,对STM32F1一个HCLK=13.8ns (1/72M),设置为3(4*13.8=55.2);( |8 Z! [* N+ |% y: M; i 对STM32F4,一个HCLK=6ns(1/168M) ,设置为9(9*6=54)。 ADDSET[3:0]:3 D9 J6 W, e# R8 F. n 地址建立时间。表示:ADDSET+1个HCLK周期,ADDSET最大值为1111 = 15。 对ILI9341来说,这里相当于WR高电平持续时间,为15ns。 考虑兼容ILI9320,STM32F1即便设置为1,WR也有100ns高电平,所以设置为1。) i: i' k) Z9 I/ B+ j4 y 而对STM32F4,则设置为8(9*6=54) : V2 U& j. i9 m* W 七,寄存器组合说明 ST官方库寄存器定义中并没有FSMC_BCRx、FSMC_BTRx、FSMC_BWTRx等单独寄存器 0 ]) `! [+ ]9 s) j+ X& D8 a+ V 而是将他们进行了一些组合。规律如下: * j8 r/ D9 ?( D# J FSMC_BCRx和FSMC_BTRx,组合成BTCR[8]寄存器组,他们的对应关系如下: # V; }- U3 f! Y+ q( L! }. E BTCR[0]对应FSMC_BCR1,BTCR[1]对应FSMC_BTR1" k8 N; A+ i4 M! D BTCR[2]对应FSMC_BCR2,BTCR[3]对应FSMC_BTR22 S! N) T8 V% R: @4 g5 X" ], t BTCR[4]对应FSMC_BCR3,BTCR[5]对应FSMC_BTR3; X5 {, M7 `) K, }/ }& M BTCR[6]对应FSMC_BCR4,BTCR[7]对应FSMC_BTR4( r, }: g1 B1 U+ D0 h FSMC_BWTRx则组合成BWTR[7],他们的对应关系如下: / a9 m( p2 K% L% O$ ^: E8 g6 X& @ BWTR[0]对应FSMC_BWTR1,4 y5 X! X, V" A2 n3 ?; W BWTR[2]对应FSMC_BWTR2, BWTR[4]对应FSMC_BWTR3, BWTR[6]对应FSMC_BWTR4,* ?4 y' F/ e+ l( X BWTR[1]、BWTR[3]和BWTR[5]保留7 w$ G a' s4 ^( G, E $ T7 ^( s; ~/ u6 H2 z1 \ 转载自BraveWangDev o0 s& O! T' ?9 B! J |
| 买了野火的学习板,只有库文件方式FSMC控制,我想要寄存器方式控制 |
微信公众号
手机版