你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F7--->SDRAM

[复制链接]
STMCU小助手 发布时间:2021-12-11 12:00
SDRAM4 p& w5 p2 M2 n$ x
SDRAM英文名是 Synchronous Dynamic Random Access Memory ,即同步动态随机存储器,相较于 SRAM(静态存储器) SDRAM 具有:容量大和价格便宜的特点。
( n/ L4 f* K, P' OSTM32F767 支持 SDRAM ,我们可以外挂 SDRAM ,从而大大降低外扩内存的成本,如下SDRAM 型号为: W9825G6KH 的结构框图。
& w8 A. U- T7 l9 s; j4 Y
; R$ r' o* j6 c. B( Z
b7a7616114e04ac29747a9552f422078.png
8 W8 N: H3 ^5 Q( A0 U8 S+ Q. ~
8 e% ~& T8 W* k3 a3 L
一个SDRAM 芯片内部,一般又有4 个存储单元(BANK),所以,在SDRAM 内部寻址的时候,先指定BANK 号和行地址,然后再指定列地址,就可以查找到目标地址。
9 M& f0 h0 }; p3 L+ Q* ISDRAM信号线' C% M3 C: a/ ]) V& @# ?5 F! F
寻址的时候,首先RAS 信号为低电平,选通行地址,地址线A0~A12 所表示的地址,会被传输并锁存到行地址译码器里面,最为行地址,同时BANK地址线上面的BS0,BS1 所表示的BANK地址,也会被锁存,选中对应的BANK,然后,CAS 信号为低电平,选通列地址,地址线A0~A12 所表示的地址,会被传输并锁存到列地址译码器里面,作为列地址,这样,就完成了一次寻址。$ r, D1 j1 P8 E. `# j% W) j5 Q

. n5 P+ I( _: P$ n
30af7623f2bd4ae3a598441893e1045e.png
. S! d2 M1 H! M, q/ M# {/ \1 \$ t& c
+ N9 J2 E* h: q8 F' V8 K& r7 M1 c- |
存储单元2 `  E. U/ O4 \/ r

5 g* j! b, X8 \5 n0 A1 m
0ec8b254ab74423fac8de7e8629ebd6b.png
1 ?! L6 e6 u  I, }- u+ p

1 ?0 t: ~# n0 Y  O存储结构
; i9 K  k" E3 {" J1 ]8 u% wW9825G6KH 的存储结构为:行地址:8192 个;列地址:512 个;BANK 数:4 个;位宽:16 位;这样,整个芯片的容量为:81925124*16=32M 字节。
( S5 ~1 }* V& f6 a( V
1 i+ K' w6 d! e/ G: Q
587fe7f593494021b454b8057063cd44.png
& U+ ^0 |0 Q" J3 x

- G1 k8 U4 P+ B! B" y: o数据传输+ |  x8 T) E% D
在完成寻址以后,数据线DQ0~DQ15 上面的数据会通过数据控制逻辑写入(或读出)存储阵列。' p& d( f! [- g1 b" M3 k
特别注意:因为SDRAM 的位宽,可以达到32 位,也就是最多有32 条数据线,在实际使用的时候,我们可能会以:8 位、16 位、24 位和32 位等宽度来读写数据,这样的话,并不是每条数据线,都会被使用到,未被用到的数据线上面的数据,必须被忽略,这个时候就需要用到数据掩码DQM 线来控制了,每一个数据掩码线,对应8 个位的数据,低电平表示对应数据位有效,高电平表示对应数据位无效。
4 _1 h% r- C5 ~5 I, CW9825G6KH中,假设以8 位数据访问,我们只需要DQ0 ~DQ7 的数据,而DQ8~DQ15的数据需要忽略,此时,我们只需要设置LDQM 为低电平,UDQM 为高电平,就可以了。
5 N$ Q/ \# g& \6 H. D( C- H: P控制命令6 H0 B$ ~+ T/ I: [; l( W# U

4 Y+ w$ S, v: w; f" V. Y) M
36064700762043c8b4c0a864a594dba9.png
: O- G7 p% S6 z) {" \: W1 S
3 w* v/ Z& b! R4 T/ ^  m1 C
空操作命令
( I# }0 Y. H: L' K$ c
NO-Operation,空操作命令,用于选中SDRAM,防止SDRAM接受错误的命令,为接下来的命令发送做准备。
6 {7 A5 V. D9 V# {/ e( ?3 s$ C' l: p4 r% j
激活命令
  E3 T2 ]$ Q1 b9 v% u/ B3 n* |/ jActive,激活命令,该命令必须在读写操作之前被发送,用于设置所需要的Bank和行地址(同时设置这2个地址),Bank地址由BS0,BS1(也写作BA0,BA1,下同)指定,行地址由A0~A12指定
+ i- V( T% x9 v( ?, _( S6 c$ Q* ]
% Y+ E& B$ O% H' x' j& q. b9 ^读写命令  c* b5 E- r% @/ a' {4 y
Read/Write,读/写命令,在发送完激活命令后,再发送列地址就可以完成对SDRAM的寻址,并进行读写操作了,读/写命令和列地址的发送,是通过一次传输完成的。列地址由 A0~A9 指定, WE 信号控制读 写命令,高电平表示读命令,低电平表示写命令。
; z; y7 J9 |( K8 i, N4 q  p8 N% M' N$ n$ S6 F- \
预充电命令
! q/ w) M1 ?; ~Precharge,预充电指令,用于关闭Bank中所打开的行地址。由于SDRAM的寻址具体独占性,所以在进行完读写操作后,如果要对同一Bank的另一行进行寻址,就要将原来有效(打开)的行关闭,重新发送行/列地址。Bank关闭现有行,准备打开新行的操作就叫做预充电(Precharge)。
# b- b: \; j9 X9 F1 L预充电命令可以通过独立的命令发送,也可以在每次发送读 写命令的时候,使用地址线A10 ,来设置自动预充电。在发送读 写命令的时候,当 A10=1 ,则使能所有 Bank 的预充电,在读 写操作完成后,自动进行预充电。这样,下次读 写操作之前,就不需要再发预充电命令了,从而提高读 写速度。
$ |  z# W$ \- K2 d' M% X8 S: t9 o$ Q* J, M3 _
刷新命令# l6 l$ w: R/ }# Y
Refresh,刷新命令,用于刷新一行数据。SDRAM里面存储的数据,需要不断的进行刷新操作才能保留住,因此刷新命令对于SDRAM来说,尤为重要。预充电命令和刷新命令,都可以实现对 SDRAM 数据的刷新,不过预充电仅对当前打开的行有效(仅刷新当前行),而刷新命令,则可以依次对所有的行进行刷新操作。
1 b- h: a/ U' _6 A7 ?% X$ J总共有两种刷新操作:自动刷新(Auto Refresh )和自我刷新 (Self Refresh ),在发送 Refresh7 J$ h" h1 C/ t* s7 x+ r
命令时,如果 CKE 有效(高电平),则使用自动刷新模式,否则使用自我刷新模式。不论是何
- j& J( K) O6 z3 ?* J6 B( s种刷新方式,都不需要外部提供行地址信息,因为这是一个内部的自动操作。
7 o' t. x2 b1 r6 G自动刷新:SDRAM 内部有一个行地址生成器(也称刷新计数器)用来自动 的依次生成要
3 L7 q4 d! _2 U刷新的行地址。由于刷新是针对一行中的所有存储体进行,所以无需列寻址。刷新涉及到所有
1 S5 C8 m1 b! v% }0 q" zBank ,因此在刷新过程中,所有 Bank 都停止工作,而每次刷新所占用的时间为 9 个时钟周期5 ~: S4 l. G6 K, U  ^7 c
PC133 标准),之后就可进入正常的工作状态,也就是说在这 9 个时钟期间内,所有工作指7 O* k$ ?, C( g4 G! R! u8 [: R
令只能等待而无法执行。刷新操作必须不停的执行,完成一次所有行的刷新所需要的时间,称
/ ^4 \8 m; W+ n3 T为刷新周期,一般为 64ms 。显然,刷新操作肯定会对 SDRAM 的性能造成影响,但这是没办法" N9 P' r$ Q+ ?, }( u! U) c
的事情,也是 DRAM 相对于 SRAM (静态内存,无需刷新仍能保留数据)取得 成本优势的同& w0 r- O; A( r4 c) H  `/ ]- c
时所付出的代价。- l' p+ c3 v/ I
自我刷新:主要用于休眠模式低功耗状态下的数据保存,在发出自动刷新命令时,将CKE置于无效状态(低电平),就进入了自我刷新模式,此时不再依靠系统时钟工作,而是根据内部的时钟进行刷新操作。在自我刷新期间除了CKE 之外的所有外部信号都是无效的(无需外部提供刷新指令),只有重新使 CKE 有效(高电平)才能退出自刷新模式并进入正常操作状态。9 \3 _# B5 ?1 Z  m, R5 a8 J) @1 u
+ g7 O( T1 u, R4 i
设置模式寄存器命令
# V0 w  Q$ H5 gMode Register Set,设置模式寄存器命令。SDRAM芯片内部有一个逻辑控制单元,控制单元的相关参数由模式寄存器提供,我们通过设置模式寄存器命令,来完成对模式寄存器的设置,这个命令在每次对SDRAM进行初始化的时候,都需要用到。
  L! V3 A# E$ q6 e/ l) v  ~; x! n, _  Z! [
9b14ac69923344648bdcd7cb20f3941e.png
1 a( V$ u: X- I# V# O9 L" O$ |

/ d; J% {( ~7 O0 @1 S5 c8 rBurst Length突发长度模式(简称 BL ),通过 A0~A2 设置, 是指在同一行中相邻的存储单元连 续进行数据传输的方式,连续传输所涉及到存储单元(列)的数量就是突发长度。
9 h2 d! ?8 g) \2 G& x前面我们说的读写操作,都是一次对一个存储单元进行寻址,如果要连续读 写就还要对当前存储单元的下一个单元进行寻址,也就是要不断的发送列地址与读 写命令(行地址不变,所以不用再对行寻址)。虽然由于读 写延迟相同可以让数据的传输在 I/O 端是连续的,但它占用了大量的内存控制资源,在数据进行连续传输时无法输入新的命令,效率很低 。$ F# e' H8 M5 [2 x8 V# @' T4 ~8 T
为此,人们开发了突发传输技术,只要指定起始列地址与突发长度,内存就会依次地自动对后面相应数量的存储单元进行读 写操作而不再需要控制器连续地提供列地址。 这样,除了第一个数据的传输需要若干个周期外,其后每个数据只需一个周期的即可获得。
3 V" p3 ?% j4 U2 I. l7 K. H8 H% l3 s非突发连续读取模式:不采用突发传输而是依次单独寻址,此时可等效于BL=1 。虽然可以让数据是连续的传输,但每次都要发送列地址与命令信息,控制资源占用极大。
9 V' P9 l4 S9 V3 E0 g. E突发连续读取模式:只要指定起始列地址与突发长度,寻址与数据的读取自动进行,而只要控制好两段突发读取命令的间隔周期(与 BL 相同)即可做到连续的突发传输。 至于 BL 的数值,也是不能随便设或在数据进行传输前临时决定,而是在初始化的时候,通过模式 寄存器设置命令,进行设置。
! r( `  H7 S9 a目前可用的选项是 1 、 2 、 4 、 8 、全页( Full Page ),常见的设定是 4 和 8 。 若传输长度小于突发长度,则需要发送 Burst Stop(停止突发)命令,结束突发传输。' N) I7 V  F" a
Addressing Mode,突发访问的地址模式,通过 A3 设置,可以设置为: Sequential (顺序
9 J1 Z9 [4 a; ?$ y% `1 A8 \或 Interleave (交错)。顺序方式,地址连续访问,而交错模式则地址是乱序的,一般选择连续模式。) y  J& u' u6 U# N- _
CAS Latency列地址选通延迟(简称 CL )。在读命令(同时发送列地址)发送完之后需要等待几个时钟周期, DQ 数据线上的数据,才会有效,这个延迟时间,就叫 CL ,一般设置为 2/3 个时钟周期。
, Y7 S0 S& S5 F/ e2 r* R特别注意:列地址选通延迟(CL ),仅在读命令的时候有效果,在写命令的时候,并不需要这个延迟。. e$ p& D* s; ]
Write Mode即写模式,用于设置单次写的模式,可以选择突发写入或者单次写入。
# W7 C2 b$ p9 n( R; r1 Y% m* |, y
- e6 c" N" q% c+ j初始化
/ u. g- v: R5 B  B初始化分为五个步骤1 q5 a1 v: `) K
1.上电: r6 J) B! Y5 W& `4 I0 H0 j
给SDRAM供电,是能CLK,并发送NOP(No Operation命令),上电后至少要等待200us,再发送其他命令。
! N) U# m7 x' K  |2.发送预充电命令
% _3 i* d  K: a! h发送预充电命令,给所用BANK预充电
+ t2 ~  j+ U  m  A3.发送自动刷新命令) ]7 U7 h* {& o  {% U
至少要放松8次自动刷新命令,每一次自动刷新命令之间的时间间隔为tRC
8 Z; ]! m( }" }/ {4.设置寄存器模式
/ ^. j: e7 i( v1 H( Y: D% C( F发送模式寄存器的值,配置SDRAM的工作参数,配置完成后,需要等待tMRD(也叫tRSC),使模式寄存器的配置生效,才能发送其他命令3 p3 Z) x. U2 J- Z* c
5.完成
! Q, s( x  K/ X1 H+ t0 \% y经过前面四个步骤,SDRAM的初始化就完成了,接下来就可以发送激活命令和读写命令进行数据的读写了。& v: z/ P; S1 o$ O4 U( l5 I4 }3 s
! e) Y' K' H$ v; w# h
写操作
& S, H$ {. b7 H1.发送激活命令
) w6 q' E* y' q- l- K/ g8 c3 j此命令同时设置行地址和BANK地址,发送该命令后,需要等待tRCD时间,才可以发送写命令
# r$ _2 @, i/ w( B; n. y- P) Y3 P2.发送写命令2 M! {  V, P3 O$ d
在发送完激活命令,并等待tRCD后,发送写命令,该命令同时设置列地址,完成对SDRAM的寻址。同时,将数据通过DQ数据线,存入SDRAM% [/ h) l1 B. g2 c
3.使能自动预充电
8 F/ o  Z; T$ Y  p4 I  [: P3 [在发送写命令的同时,拉高A10地址线,使能自动预充电,以提高读写效率; C  P/ ~+ B- k0 R. ~
4.执行预充电) a/ f8 \" d3 m8 I' O- H4 w$ o! P! _
预充电在发送激活命令的tRAS时间后启动,并且需要等待tRP时间
) y. s' \, ~+ J5 q0 U1 ?6 {5.完成一次数据写入4 h3 I7 l7 Y; M9 ?
至此完成了一次数据写入操作,发送第二个激活命令,启动下一次数据传输。# c, T% v3 n" f5 L# Y- h# e9 c

* F. K+ j3 _3 r9 H2 Q6 ]& u读操作
, ]* G2 A) y. y+ j% |, p
1.发送激活命令% a; |" j, d/ y2 c2 y
此命令同时设置行地址和BANK地址,发送该命令后,需要等待tRCD时间,才可以发送写命令- Y: C9 y9 J1 u5 l5 i. G2 D
2.发送读命令
! [  `$ p4 Z+ f( M% M0 e在发送完激活命令,并等待tRCD 后,发送读命令,该命令同时设置列地址,完成对 SDRAM的寻址。读操作还有一个 CL 延迟( CAS Latency ),所以需要等待给定的 CL 延迟( 2 个或 3 个CLK )后,再从 DQ 数据线上读取数据。
1 V+ V9 j& |: P8 h. f3.使能自动预充电
# B3 m3 O3 S# K, f+ L7 s( L0 |, o7 N在发送写命令的同时,拉高A10地址线,使能自动预充电,以提高读写效率
% r- z- @2 S5 r! ^/ \2 r$ l4.执行预充电6 f5 J% a0 O3 a' e. V9 b
预充电在发送激活命令的tRAS时间后启动,并且需要等待tRP时间来完成
+ [7 u! _; E  ~: H' x7 i5.完成一次数据写入& J% Y3 L& S1 T" f' Z
至此完成了一次数据写入操作,发送第二个激活命令,启动下一次数据传输。
1 [4 F7 y  f/ h5 v# j
" Y, [  e) `' J1 nFMC接口驱动SDRAM. I. }3 `, k& R( L4 z! k2 {
SDRAM相关寄存器) U2 b1 n: ^! J- E+ b7 P* J
控制寄存器FMC_SDCR1/FMC_SDCR2

% B" ~$ Q' x- z/ X' ?$ K
) {( w( B$ v1 F9 u' W, B
2f93559309a3463499ec9ecd56db248d.png
$ }0 @0 `' I) D' Q
. E% Y+ w3 U( \) O" E, k- r) |9 x8 E
该寄存器只有低15 位有效,且都需要进行配置:
# s7 j! @, K- ~0 S' L4 P* w7 Y/ l2 n9 L' ?0 W
L%[JX5MR7D@@QTFPC[0BKJ6.png

' w5 T/ P; f5 k' @+ a" B) w1 S& X( O$ P+ S0 O2 M- E; l: F
的时序寄存器FMC_SDTR1/FMC_SDTR2
; y# A+ C6 R2 g5 ]- E  V; a该寄存器用于控制SDRAM的时序/ f9 o! R% t, A+ U% k. V
3 ^- u3 _: T' V/ g
cd1d697b6a32458993b938168cd870a3.png

0 ]& U% r# w; Z. f) ^( ~. R) x: J% \% e* F  F3 S
XYHBJW[%TZ5%Q3L)4I02N13.png

' a( C8 }; f$ l
0 F7 N4 e1 S  g* p  V( y
- h% w$ V$ m, r' o6 u4 y* q的命令模式寄存器 FMC_SDCMR

0 R3 L) [4 r+ q" O6 S. a
; f9 ?! r! C7 k
90a0a2662f4d43339e26cfbed3d6168e.png

3 t/ Z+ R0 @& G$ d5 N4 `  z- a# m" d  q& n& R0 I
YTM_}GBLAQHF8[STBL(VBQS.png
  m; j, S1 l# O/ f+ K, \; E% i

8 E( W3 {  b7 [# }/ I( ^
4 N1 M$ z: [; y1 q% G刷新定时器寄存器: FMC_SDRTR
( b/ ~9 |$ Q  p
以W9825G6KH 为例, W9825G6KH 的刷新周期为 64ms ,行数为 8192行,所以刷新速率为:
4 ^" C  w5 |$ T0 x, o% S" S' @刷新速率=64ms/8192=7.81us! v2 d* T; k" `9 h: ~% D
而SDRAM 时钟频率 =216Mhz/2=108Mhz 9.26ns ,6 [* y+ ]& Z0 }2 c1 R" e3 n
所以 COUNT 的值为:
, n8 M* |3 T8 D  S7 I* _/ \; M6 jCOUNT=7.81us/9.26ns=844) e2 k0 z: L2 [/ n9 N4 J" H. O, o
SDRAM 在接受读请求后,出现内部刷新请求,则必须将刷新速率增加 20 个 SDRAM时钟周期,以获得充足的余量,所以,实际设计的 COUNT 值应该是: COUNT 20=824 。所以设置 FMC_SDRTR 的 COUNT=824 ,就可以完成对该寄存器的配置。
1 ^* c% u8 q0 [6 n% s! U$ r9 p2 j7 W' O. W+ A* s3 G9 l% U
5fdd6f505fa6422cb0276d54268b2acb.png
/ Z# S* R- @* i  r

' r2 R9 f2 s* l, i" O  O' s% F附录
6 K. f2 {6 Z" e# I/ h+ u6 ?交代4 _) ?+ j* F- Q4 G  D0 P* S
上文中的tRC 、 tMRD 和 tRSC 见 SDRAM 的芯片数据手册。
' F! u" l* \# @& o" y% g% l- N0 P0 B% D9 Z! q4 L
声明
$ K( t' x. m1 b  p' e6 k: g本文大部分参考于正点原子
: v5 M% `2 C$ y. `+ }% O' B; Z, @1 W+ P' F, ^: H' J
2 z  \% H% D1 {! a! ?7 N

3 E, I" {- C- ^6 b5 ~- q
赞 收藏 评论0 发布时间:2021-12-11 12:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版