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

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

[复制链接]
STMCU小助手 发布时间:2021-12-11 12:00
SDRAM# H' ~/ \/ G: \9 ]0 {9 y
SDRAM英文名是 Synchronous Dynamic Random Access Memory ,即同步动态随机存储器,相较于 SRAM(静态存储器) SDRAM 具有:容量大和价格便宜的特点。" q- ?! S* r$ n( t/ w* O
STM32F767 支持 SDRAM ,我们可以外挂 SDRAM ,从而大大降低外扩内存的成本,如下SDRAM 型号为: W9825G6KH 的结构框图。3 y4 V( l$ `* E
3 ?* F9 o1 V; j8 Z( \
b7a7616114e04ac29747a9552f422078.png
' u" {/ L7 v& G
7 w( E- o! s7 |
一个SDRAM 芯片内部,一般又有4 个存储单元(BANK),所以,在SDRAM 内部寻址的时候,先指定BANK 号和行地址,然后再指定列地址,就可以查找到目标地址。
+ y. v% R7 ^4 m* _/ D# o& HSDRAM信号线
- b* n% e5 g7 P; p. {4 {寻址的时候,首先RAS 信号为低电平,选通行地址,地址线A0~A12 所表示的地址,会被传输并锁存到行地址译码器里面,最为行地址,同时BANK地址线上面的BS0,BS1 所表示的BANK地址,也会被锁存,选中对应的BANK,然后,CAS 信号为低电平,选通列地址,地址线A0~A12 所表示的地址,会被传输并锁存到列地址译码器里面,作为列地址,这样,就完成了一次寻址。
0 R6 G4 C  E  N! d, {& d4 g/ ~
30af7623f2bd4ae3a598441893e1045e.png

1 S* w  y# o; j; R  K
4 H5 ?4 k  [( U! B+ U! [- B- G存储单元
3 ]: w" g/ a) z$ U  y+ O9 g3 F
% F! [- S8 t+ O! p7 _; q7 [
0ec8b254ab74423fac8de7e8629ebd6b.png
. f! Z4 ~' I, U/ F

" W9 Y7 t' O5 I0 \% v存储结构
1 r  K+ D+ L; [& `1 h5 lW9825G6KH 的存储结构为:行地址:8192 个;列地址:512 个;BANK 数:4 个;位宽:16 位;这样,整个芯片的容量为:81925124*16=32M 字节。
5 \. r' W  v& K+ W: t
. c% D1 [" |6 O4 G6 @3 c: W
587fe7f593494021b454b8057063cd44.png
* V0 z1 f0 U" [9 {/ ^

/ u0 e; J! P3 H数据传输' U: i* ]% p$ E. e( Z
在完成寻址以后,数据线DQ0~DQ15 上面的数据会通过数据控制逻辑写入(或读出)存储阵列。
2 S3 r/ Q- i5 d  S' i4 {/ z" D: a- |特别注意:因为SDRAM 的位宽,可以达到32 位,也就是最多有32 条数据线,在实际使用的时候,我们可能会以:8 位、16 位、24 位和32 位等宽度来读写数据,这样的话,并不是每条数据线,都会被使用到,未被用到的数据线上面的数据,必须被忽略,这个时候就需要用到数据掩码DQM 线来控制了,每一个数据掩码线,对应8 个位的数据,低电平表示对应数据位有效,高电平表示对应数据位无效。/ }  o8 c) v4 B  B2 p5 W
W9825G6KH中,假设以8 位数据访问,我们只需要DQ0 ~DQ7 的数据,而DQ8~DQ15的数据需要忽略,此时,我们只需要设置LDQM 为低电平,UDQM 为高电平,就可以了。* z3 [8 X4 |5 G
控制命令' g% B0 R4 g9 e# {) T+ i

4 R* S* A6 C& D& q
36064700762043c8b4c0a864a594dba9.png

1 G0 @. C* ~/ K/ ^4 j4 [4 T5 t+ z% ]* J2 ]% k+ R
空操作命令
, y4 N2 Z) ]8 R* |
NO-Operation,空操作命令,用于选中SDRAM,防止SDRAM接受错误的命令,为接下来的命令发送做准备。
& W! b$ F  q- b( n$ i/ G+ x! w3 }; R1 ]- u0 |8 L
激活命令
. Z7 m# x  `4 b: z5 ~( |Active,激活命令,该命令必须在读写操作之前被发送,用于设置所需要的Bank和行地址(同时设置这2个地址),Bank地址由BS0,BS1(也写作BA0,BA1,下同)指定,行地址由A0~A12指定' L# n- j" s  m+ C5 g$ I
" z9 v# d4 O& m
读写命令
" W9 Y. a( K2 C0 a0 H$ i4 P8 DRead/Write,读/写命令,在发送完激活命令后,再发送列地址就可以完成对SDRAM的寻址,并进行读写操作了,读/写命令和列地址的发送,是通过一次传输完成的。列地址由 A0~A9 指定, WE 信号控制读 写命令,高电平表示读命令,低电平表示写命令。$ u% j5 ?/ K" K9 q+ `

8 |* P) h1 v( X  w( h* Z' x' H/ F' @预充电命令
9 {+ Y& f% N' E4 L( i5 VPrecharge,预充电指令,用于关闭Bank中所打开的行地址。由于SDRAM的寻址具体独占性,所以在进行完读写操作后,如果要对同一Bank的另一行进行寻址,就要将原来有效(打开)的行关闭,重新发送行/列地址。Bank关闭现有行,准备打开新行的操作就叫做预充电(Precharge)。% C& h% z" Y4 _+ g- S/ n
预充电命令可以通过独立的命令发送,也可以在每次发送读 写命令的时候,使用地址线A10 ,来设置自动预充电。在发送读 写命令的时候,当 A10=1 ,则使能所有 Bank 的预充电,在读 写操作完成后,自动进行预充电。这样,下次读 写操作之前,就不需要再发预充电命令了,从而提高读 写速度。# ?  D" B+ K% k- C+ W2 Z0 }- ?
1 V! @& H6 _% `
刷新命令
8 D8 g  N+ m. o+ u0 y' JRefresh,刷新命令,用于刷新一行数据。SDRAM里面存储的数据,需要不断的进行刷新操作才能保留住,因此刷新命令对于SDRAM来说,尤为重要。预充电命令和刷新命令,都可以实现对 SDRAM 数据的刷新,不过预充电仅对当前打开的行有效(仅刷新当前行),而刷新命令,则可以依次对所有的行进行刷新操作。
& N% J; {* }3 V总共有两种刷新操作:自动刷新(Auto Refresh )和自我刷新 (Self Refresh ),在发送 Refresh
( G% x9 W3 [9 P  T( z- K- Z* f6 F命令时,如果 CKE 有效(高电平),则使用自动刷新模式,否则使用自我刷新模式。不论是何
7 w5 B9 R* I# D, l/ R4 |种刷新方式,都不需要外部提供行地址信息,因为这是一个内部的自动操作。
; k" L0 ]: `! w' Y: @- @, p自动刷新:SDRAM 内部有一个行地址生成器(也称刷新计数器)用来自动 的依次生成要
8 i1 j" ]1 t5 @' Y刷新的行地址。由于刷新是针对一行中的所有存储体进行,所以无需列寻址。刷新涉及到所有
. G, h4 }) I. R6 }) eBank ,因此在刷新过程中,所有 Bank 都停止工作,而每次刷新所占用的时间为 9 个时钟周期" L! z, N& ]; c+ D/ w8 g
PC133 标准),之后就可进入正常的工作状态,也就是说在这 9 个时钟期间内,所有工作指2 U' G& Q" R1 C+ r4 q- N
令只能等待而无法执行。刷新操作必须不停的执行,完成一次所有行的刷新所需要的时间,称* s' x5 O/ ]5 N2 Z( A% X& [% ^4 w
为刷新周期,一般为 64ms 。显然,刷新操作肯定会对 SDRAM 的性能造成影响,但这是没办法
) a6 m& w! R' F. H的事情,也是 DRAM 相对于 SRAM (静态内存,无需刷新仍能保留数据)取得 成本优势的同
( t6 K  L' o0 }2 I- r时所付出的代价。
9 T$ d( B, F7 l* e. i. R2 ^& {自我刷新:主要用于休眠模式低功耗状态下的数据保存,在发出自动刷新命令时,将CKE置于无效状态(低电平),就进入了自我刷新模式,此时不再依靠系统时钟工作,而是根据内部的时钟进行刷新操作。在自我刷新期间除了CKE 之外的所有外部信号都是无效的(无需外部提供刷新指令),只有重新使 CKE 有效(高电平)才能退出自刷新模式并进入正常操作状态。; {* L4 [$ w2 {( O  ~! [, v8 d
/ z  |0 Y; N5 @% r5 K
设置模式寄存器命令" P8 `2 x  N3 e
Mode Register Set,设置模式寄存器命令。SDRAM芯片内部有一个逻辑控制单元,控制单元的相关参数由模式寄存器提供,我们通过设置模式寄存器命令,来完成对模式寄存器的设置,这个命令在每次对SDRAM进行初始化的时候,都需要用到。1 F) |/ C* J: S1 N3 ?) V
: C4 Z; |( b9 x0 ~0 k
9b14ac69923344648bdcd7cb20f3941e.png
( p7 a# P* J* J& s

- \! \6 u" ^2 `* U5 D$ d- SBurst Length突发长度模式(简称 BL ),通过 A0~A2 设置, 是指在同一行中相邻的存储单元连 续进行数据传输的方式,连续传输所涉及到存储单元(列)的数量就是突发长度。; k9 [7 M+ @3 j6 c, @  i( j0 b" z8 _
前面我们说的读写操作,都是一次对一个存储单元进行寻址,如果要连续读 写就还要对当前存储单元的下一个单元进行寻址,也就是要不断的发送列地址与读 写命令(行地址不变,所以不用再对行寻址)。虽然由于读 写延迟相同可以让数据的传输在 I/O 端是连续的,但它占用了大量的内存控制资源,在数据进行连续传输时无法输入新的命令,效率很低 。
- y8 B1 c  G8 o  w, R为此,人们开发了突发传输技术,只要指定起始列地址与突发长度,内存就会依次地自动对后面相应数量的存储单元进行读 写操作而不再需要控制器连续地提供列地址。 这样,除了第一个数据的传输需要若干个周期外,其后每个数据只需一个周期的即可获得。/ ~! o# O3 n. _7 P( `4 ?! |
非突发连续读取模式:不采用突发传输而是依次单独寻址,此时可等效于BL=1 。虽然可以让数据是连续的传输,但每次都要发送列地址与命令信息,控制资源占用极大。
* |- s& Z7 N/ x8 l0 n突发连续读取模式:只要指定起始列地址与突发长度,寻址与数据的读取自动进行,而只要控制好两段突发读取命令的间隔周期(与 BL 相同)即可做到连续的突发传输。 至于 BL 的数值,也是不能随便设或在数据进行传输前临时决定,而是在初始化的时候,通过模式 寄存器设置命令,进行设置。7 E9 y# B5 K5 o7 s2 H
目前可用的选项是 1 、 2 、 4 、 8 、全页( Full Page ),常见的设定是 4 和 8 。 若传输长度小于突发长度,则需要发送 Burst Stop(停止突发)命令,结束突发传输。1 D7 z! ^4 M4 }, I; V/ A
Addressing Mode,突发访问的地址模式,通过 A3 设置,可以设置为: Sequential (顺序( P; @  Q; O4 z' K7 Z; s: ~, x
或 Interleave (交错)。顺序方式,地址连续访问,而交错模式则地址是乱序的,一般选择连续模式。" ?- O. y  t7 J
CAS Latency列地址选通延迟(简称 CL )。在读命令(同时发送列地址)发送完之后需要等待几个时钟周期, DQ 数据线上的数据,才会有效,这个延迟时间,就叫 CL ,一般设置为 2/3 个时钟周期。4 H7 s) D9 s& P# s* _$ n
特别注意:列地址选通延迟(CL ),仅在读命令的时候有效果,在写命令的时候,并不需要这个延迟。* R! P7 R2 R: h
Write Mode即写模式,用于设置单次写的模式,可以选择突发写入或者单次写入。
* l/ ]* q+ d- Z! R" `+ N+ Z
6 m8 s$ C( a7 P; w初始化
: d8 y% }5 k/ u- k  b8 h% l. }* N初始化分为五个步骤
) A) Y* c+ ]- Q! D9 g; e- t1.上电
( _: W0 N2 R0 D给SDRAM供电,是能CLK,并发送NOP(No Operation命令),上电后至少要等待200us,再发送其他命令。7 A2 ^' R9 m" I$ N' o
2.发送预充电命令
1 p5 H" Y- E9 ?" X: R  a发送预充电命令,给所用BANK预充电
' H3 T+ A+ ]4 u3 G3.发送自动刷新命令
- }8 q4 H5 m' I$ a( I2 }至少要放松8次自动刷新命令,每一次自动刷新命令之间的时间间隔为tRC* f5 `# l2 x- Y/ v
4.设置寄存器模式
& m' n% y% H" U* A5 |5 ?' P+ J* J发送模式寄存器的值,配置SDRAM的工作参数,配置完成后,需要等待tMRD(也叫tRSC),使模式寄存器的配置生效,才能发送其他命令
/ [" a( V8 Q5 Z1 n$ O8 l1 v- N+ x% T5.完成' ^  X' R/ ^/ Z  X
经过前面四个步骤,SDRAM的初始化就完成了,接下来就可以发送激活命令和读写命令进行数据的读写了。! l" U: U. D" @# O3 k  S, ~

, m* H- W. M* s写操作
# Z* N: E. s) C! P6 L' t" T1.发送激活命令
5 M# y* _1 J5 z$ P此命令同时设置行地址和BANK地址,发送该命令后,需要等待tRCD时间,才可以发送写命令9 E& }8 A4 ~% o
2.发送写命令
  |" d: w; J1 r$ K7 A在发送完激活命令,并等待tRCD后,发送写命令,该命令同时设置列地址,完成对SDRAM的寻址。同时,将数据通过DQ数据线,存入SDRAM
8 m! E4 L- l: P5 `% ^; Q5 g8 P3 `3.使能自动预充电! n) a% l, A- |; A" D; @& x7 A6 L
在发送写命令的同时,拉高A10地址线,使能自动预充电,以提高读写效率
. Z4 Q* X$ w5 O. Q. D4.执行预充电) ?/ g0 h  p- ~5 r
预充电在发送激活命令的tRAS时间后启动,并且需要等待tRP时间- e( [. |; v- L) b: x
5.完成一次数据写入
/ M5 K) M  K6 y/ j3 c+ ~至此完成了一次数据写入操作,发送第二个激活命令,启动下一次数据传输。
% \8 c( C8 @, i
( O/ G3 v* q9 |读操作
) f+ n! K0 d: `  m- i
1.发送激活命令
7 E1 f6 b" f3 L1 x6 E0 Y. R  N此命令同时设置行地址和BANK地址,发送该命令后,需要等待tRCD时间,才可以发送写命令5 U1 l5 U: V) E8 K6 q: z/ C: l
2.发送读命令2 K- z( N& Y, `2 r, a  \0 Z
在发送完激活命令,并等待tRCD 后,发送读命令,该命令同时设置列地址,完成对 SDRAM的寻址。读操作还有一个 CL 延迟( CAS Latency ),所以需要等待给定的 CL 延迟( 2 个或 3 个CLK )后,再从 DQ 数据线上读取数据。
8 H3 Q1 O7 ?5 D$ R2 m1 X6 Z3.使能自动预充电; L# ~( L5 \6 M: P' m% X
在发送写命令的同时,拉高A10地址线,使能自动预充电,以提高读写效率2 Y/ x, R5 F3 E8 y; M
4.执行预充电
+ T6 }$ O2 k" P- }! v6 K: x预充电在发送激活命令的tRAS时间后启动,并且需要等待tRP时间来完成. A" z6 @" V, p3 k+ P. x, i3 c
5.完成一次数据写入
& ]# s0 r2 k) J( I, N* _6 f+ @至此完成了一次数据写入操作,发送第二个激活命令,启动下一次数据传输。
1 Y8 }; `% `; W) N" f: @* ~
2 W" E7 o1 |8 c1 fFMC接口驱动SDRAM
6 \; c1 G" I0 XSDRAM相关寄存器
$ H0 I: [/ }" ~- B0 U控制寄存器FMC_SDCR1/FMC_SDCR2

. _* b! v0 T; a8 L0 [3 y; W( u* Y0 x
2f93559309a3463499ec9ecd56db248d.png

' \& N0 U. w0 W9 [% o" J
; }+ U; N$ Y! t该寄存器只有低15 位有效,且都需要进行配置:
2 q" v$ p" Z8 ~1 ^% d+ M1 R) R
' @5 a$ o/ C2 \' I. f
L%[JX5MR7D@@QTFPC[0BKJ6.png
# Y5 y( F# g/ b; U7 J

9 {7 I3 k' w. l# G/ F3 t1 W的时序寄存器FMC_SDTR1/FMC_SDTR2
# |3 \% U! Y) A/ l4 Q. E/ ~6 D6 K8 c( I该寄存器用于控制SDRAM的时序, w7 v6 k# g( B7 n

$ r% c' x: C% {8 K8 ]1 j
cd1d697b6a32458993b938168cd870a3.png
9 N  m6 [3 d4 m' J
; ]0 {! F: `  s" Y
XYHBJW[%TZ5%Q3L)4I02N13.png
/ g) S* d" R! _( q/ k  U+ D1 h5 @1 T

4 G" f5 U& G# N8 \2 V( D- R
- I) j( {0 u. _的命令模式寄存器 FMC_SDCMR

  p: |* F! }# M( [: b
: z7 w7 y* `6 ]9 S4 F( u; L5 R
90a0a2662f4d43339e26cfbed3d6168e.png
' Q# R( {1 t$ Q
, U: D1 ?7 u  q
YTM_}GBLAQHF8[STBL(VBQS.png
. K* z! v9 {/ h1 ?% v$ o' O. O  C7 a

* J. |) ^; a& Y! K7 h( \7 @2 K: w) B* G1 F
刷新定时器寄存器: FMC_SDRTR

: O- p% y$ K' m% i. T以W9825G6KH 为例, W9825G6KH 的刷新周期为 64ms ,行数为 8192行,所以刷新速率为:
9 ~/ F- s: R8 x刷新速率=64ms/8192=7.81us! C! I; z" [& Z! ]
而SDRAM 时钟频率 =216Mhz/2=108Mhz 9.26ns ,0 B* f; [. D( [
所以 COUNT 的值为:
' p0 a. @2 E( N  G3 hCOUNT=7.81us/9.26ns=844# C0 B" p  j$ e; O& E5 n; A% j
SDRAM 在接受读请求后,出现内部刷新请求,则必须将刷新速率增加 20 个 SDRAM时钟周期,以获得充足的余量,所以,实际设计的 COUNT 值应该是: COUNT 20=824 。所以设置 FMC_SDRTR 的 COUNT=824 ,就可以完成对该寄存器的配置。2 C1 U- B3 X- C3 @+ @; S$ O

0 p' b' D1 J: k7 U# G$ T
5fdd6f505fa6422cb0276d54268b2acb.png
/ f6 Q' G9 J1 P5 [8 Y1 u
8 t9 z# e8 }: B1 @
附录# B# B- J0 s8 p9 B! o  D
交代8 s$ z6 `7 M5 O: e* l
上文中的tRC 、 tMRD 和 tRSC 见 SDRAM 的芯片数据手册。3 u; s1 _: S8 N7 ^4 j

& T1 r" l- B' x  I声明- @, Z- l* ^3 I: E2 m
本文大部分参考于正点原子1 g' m/ N* H( [( a7 P" x3 c! p

. ]6 G( U& X+ J" ]0 }; g$ O& F- z
6 U& {# p- M0 J& E- i8 G) P
赞 收藏 评论0 发布时间:2021-12-11 12:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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