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

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

[复制链接]
STMCU小助手 发布时间:2021-12-11 12:00
SDRAM" \5 F* k3 P5 x) S; Q- d! d/ y
SDRAM英文名是 Synchronous Dynamic Random Access Memory ,即同步动态随机存储器,相较于 SRAM(静态存储器) SDRAM 具有:容量大和价格便宜的特点。
" U6 m, d% x/ h" f- aSTM32F767 支持 SDRAM ,我们可以外挂 SDRAM ,从而大大降低外扩内存的成本,如下SDRAM 型号为: W9825G6KH 的结构框图。4 o9 V, B9 R: P2 N5 T  ]: N

6 f+ k' P5 ?1 t" z9 u
b7a7616114e04ac29747a9552f422078.png
* C, e. c; h7 f% V
% h  f: E4 n' E9 m8 y
一个SDRAM 芯片内部,一般又有4 个存储单元(BANK),所以,在SDRAM 内部寻址的时候,先指定BANK 号和行地址,然后再指定列地址,就可以查找到目标地址。' r; L' e- h& u! p% R& ?/ S6 p
SDRAM信号线
/ [& z/ ^: X" F, W8 r: G寻址的时候,首先RAS 信号为低电平,选通行地址,地址线A0~A12 所表示的地址,会被传输并锁存到行地址译码器里面,最为行地址,同时BANK地址线上面的BS0,BS1 所表示的BANK地址,也会被锁存,选中对应的BANK,然后,CAS 信号为低电平,选通列地址,地址线A0~A12 所表示的地址,会被传输并锁存到列地址译码器里面,作为列地址,这样,就完成了一次寻址。
5 o  Q2 O" z& Z  w$ p# r# u' n
4 s+ L/ ~  r; E' m- Q
30af7623f2bd4ae3a598441893e1045e.png

' w- V, M/ ]1 r4 E
2 k, T0 Z( @2 |5 F" O- h存储单元
' O1 [6 K+ X4 x5 p5 b, s, f; a. C* v/ M3 P. k5 P( K2 c9 `% o, `
0ec8b254ab74423fac8de7e8629ebd6b.png
+ _5 }, m/ Y) _& G" @7 Z) C
7 N; a9 @* @- u, w. ~6 V
存储结构* M3 I. {7 J& g+ o4 {) [* E. V
W9825G6KH 的存储结构为:行地址:8192 个;列地址:512 个;BANK 数:4 个;位宽:16 位;这样,整个芯片的容量为:81925124*16=32M 字节。; L1 z# h5 O7 M. A9 \2 y& a

9 A6 X! J$ g0 m1 `) T! `1 Q0 G
587fe7f593494021b454b8057063cd44.png

' T5 @2 O5 ?# N: d* Z! Q* ]
0 x2 @+ N# O9 s数据传输
, c& h* A* r& Y/ K3 y7 N在完成寻址以后,数据线DQ0~DQ15 上面的数据会通过数据控制逻辑写入(或读出)存储阵列。( k+ F* w1 F1 B' w6 Y2 u
特别注意:因为SDRAM 的位宽,可以达到32 位,也就是最多有32 条数据线,在实际使用的时候,我们可能会以:8 位、16 位、24 位和32 位等宽度来读写数据,这样的话,并不是每条数据线,都会被使用到,未被用到的数据线上面的数据,必须被忽略,这个时候就需要用到数据掩码DQM 线来控制了,每一个数据掩码线,对应8 个位的数据,低电平表示对应数据位有效,高电平表示对应数据位无效。* L3 e! t0 R/ C6 q# l( f; {% [2 u# ?
W9825G6KH中,假设以8 位数据访问,我们只需要DQ0 ~DQ7 的数据,而DQ8~DQ15的数据需要忽略,此时,我们只需要设置LDQM 为低电平,UDQM 为高电平,就可以了。
& _1 x* D- a9 Q. s- T  Q; x1 k控制命令
5 f' \4 T+ Q5 ?7 |. o' J0 {. u, j6 l. r+ {! a
36064700762043c8b4c0a864a594dba9.png
6 B7 ^  ^6 K; b3 |) U3 @6 S7 K! i6 X1 `
' c  ^/ t8 S. ~' A; A9 O- [+ g9 d$ s% d
空操作命令

3 ?' [3 o$ ~( r" r% ^# b8 f' `8 n  ]NO-Operation,空操作命令,用于选中SDRAM,防止SDRAM接受错误的命令,为接下来的命令发送做准备。3 m% \2 K; O. j! j/ y7 B+ _

3 }4 \0 S4 D6 W# O" f激活命令
3 |5 R- @5 W6 g+ Y/ D7 {+ dActive,激活命令,该命令必须在读写操作之前被发送,用于设置所需要的Bank和行地址(同时设置这2个地址),Bank地址由BS0,BS1(也写作BA0,BA1,下同)指定,行地址由A0~A12指定
" M5 C2 ^7 V/ ]9 A+ r; U+ o; P& Q
$ H. R2 E: t; r读写命令
9 y* f- b7 S5 Q9 C: \7 W& BRead/Write,读/写命令,在发送完激活命令后,再发送列地址就可以完成对SDRAM的寻址,并进行读写操作了,读/写命令和列地址的发送,是通过一次传输完成的。列地址由 A0~A9 指定, WE 信号控制读 写命令,高电平表示读命令,低电平表示写命令。' M' s: q" A% ]
% D6 q; j  P3 K& K8 o! |
预充电命令, P0 d1 u3 E. Q3 ~& |
Precharge,预充电指令,用于关闭Bank中所打开的行地址。由于SDRAM的寻址具体独占性,所以在进行完读写操作后,如果要对同一Bank的另一行进行寻址,就要将原来有效(打开)的行关闭,重新发送行/列地址。Bank关闭现有行,准备打开新行的操作就叫做预充电(Precharge)。8 s& m6 g" o8 s( }) T& ]/ @9 P% l
预充电命令可以通过独立的命令发送,也可以在每次发送读 写命令的时候,使用地址线A10 ,来设置自动预充电。在发送读 写命令的时候,当 A10=1 ,则使能所有 Bank 的预充电,在读 写操作完成后,自动进行预充电。这样,下次读 写操作之前,就不需要再发预充电命令了,从而提高读 写速度。
" C2 s! |4 \9 `
& }) [/ j: d+ ?5 m9 w* e4 r; S/ |刷新命令
1 B% A; f  T( eRefresh,刷新命令,用于刷新一行数据。SDRAM里面存储的数据,需要不断的进行刷新操作才能保留住,因此刷新命令对于SDRAM来说,尤为重要。预充电命令和刷新命令,都可以实现对 SDRAM 数据的刷新,不过预充电仅对当前打开的行有效(仅刷新当前行),而刷新命令,则可以依次对所有的行进行刷新操作。2 ~: s/ C5 v- {! N5 y; f# k9 ?
总共有两种刷新操作:自动刷新(Auto Refresh )和自我刷新 (Self Refresh ),在发送 Refresh
' Z3 M7 ~' v& i" U1 o( r命令时,如果 CKE 有效(高电平),则使用自动刷新模式,否则使用自我刷新模式。不论是何3 s" r5 ]# d: ]  _6 j' m
种刷新方式,都不需要外部提供行地址信息,因为这是一个内部的自动操作。9 E* z) W4 G# p, U- y  m8 A# K
自动刷新:SDRAM 内部有一个行地址生成器(也称刷新计数器)用来自动 的依次生成要
8 N8 |" a0 g, Q4 P& }刷新的行地址。由于刷新是针对一行中的所有存储体进行,所以无需列寻址。刷新涉及到所有
3 b9 E! s, R% Z5 G9 ]$ p1 a7 ~+ bBank ,因此在刷新过程中,所有 Bank 都停止工作,而每次刷新所占用的时间为 9 个时钟周期
) j8 }- [* Y" \PC133 标准),之后就可进入正常的工作状态,也就是说在这 9 个时钟期间内,所有工作指
3 D3 a6 x# @- l1 d4 z  P: K5 A* U( T, a令只能等待而无法执行。刷新操作必须不停的执行,完成一次所有行的刷新所需要的时间,称
  x0 U9 L/ O3 ^6 u为刷新周期,一般为 64ms 。显然,刷新操作肯定会对 SDRAM 的性能造成影响,但这是没办法! z5 V, j- `- S8 g1 b( o7 ?
的事情,也是 DRAM 相对于 SRAM (静态内存,无需刷新仍能保留数据)取得 成本优势的同7 i' X) I9 J9 [# c( x* r' Z. c) j
时所付出的代价。
5 Y! v; U( t. u自我刷新:主要用于休眠模式低功耗状态下的数据保存,在发出自动刷新命令时,将CKE置于无效状态(低电平),就进入了自我刷新模式,此时不再依靠系统时钟工作,而是根据内部的时钟进行刷新操作。在自我刷新期间除了CKE 之外的所有外部信号都是无效的(无需外部提供刷新指令),只有重新使 CKE 有效(高电平)才能退出自刷新模式并进入正常操作状态。4 V4 p$ v. \" {- u. D
9 }8 g! ~& O7 x  m/ h* f* j
设置模式寄存器命令
0 [- W, N! y6 j7 _Mode Register Set,设置模式寄存器命令。SDRAM芯片内部有一个逻辑控制单元,控制单元的相关参数由模式寄存器提供,我们通过设置模式寄存器命令,来完成对模式寄存器的设置,这个命令在每次对SDRAM进行初始化的时候,都需要用到。2 l) t- g8 Q+ k* q: ?# x! U- I

) a5 ]7 `" |3 Y' {7 X6 e
9b14ac69923344648bdcd7cb20f3941e.png
$ q' A# L/ U0 i# u" p: a

9 t4 c" h& E  ABurst Length突发长度模式(简称 BL ),通过 A0~A2 设置, 是指在同一行中相邻的存储单元连 续进行数据传输的方式,连续传输所涉及到存储单元(列)的数量就是突发长度。* k9 r+ [8 U( w$ ~- b- o1 q
前面我们说的读写操作,都是一次对一个存储单元进行寻址,如果要连续读 写就还要对当前存储单元的下一个单元进行寻址,也就是要不断的发送列地址与读 写命令(行地址不变,所以不用再对行寻址)。虽然由于读 写延迟相同可以让数据的传输在 I/O 端是连续的,但它占用了大量的内存控制资源,在数据进行连续传输时无法输入新的命令,效率很低 。, g- y  ^+ s1 V
为此,人们开发了突发传输技术,只要指定起始列地址与突发长度,内存就会依次地自动对后面相应数量的存储单元进行读 写操作而不再需要控制器连续地提供列地址。 这样,除了第一个数据的传输需要若干个周期外,其后每个数据只需一个周期的即可获得。& b2 L( B6 b9 R& D* h- `1 Y
非突发连续读取模式:不采用突发传输而是依次单独寻址,此时可等效于BL=1 。虽然可以让数据是连续的传输,但每次都要发送列地址与命令信息,控制资源占用极大。; [+ J; O! u4 i) d" m7 ~
突发连续读取模式:只要指定起始列地址与突发长度,寻址与数据的读取自动进行,而只要控制好两段突发读取命令的间隔周期(与 BL 相同)即可做到连续的突发传输。 至于 BL 的数值,也是不能随便设或在数据进行传输前临时决定,而是在初始化的时候,通过模式 寄存器设置命令,进行设置。9 n0 C: C, c* `+ O) b% ~
目前可用的选项是 1 、 2 、 4 、 8 、全页( Full Page ),常见的设定是 4 和 8 。 若传输长度小于突发长度,则需要发送 Burst Stop(停止突发)命令,结束突发传输。
( A- A. d$ n, y. I9 _, H4 P8 d" lAddressing Mode,突发访问的地址模式,通过 A3 设置,可以设置为: Sequential (顺序' I9 u0 _8 D0 X. K
或 Interleave (交错)。顺序方式,地址连续访问,而交错模式则地址是乱序的,一般选择连续模式。  v5 H0 B* n6 d: Z6 r  \8 A# o
CAS Latency列地址选通延迟(简称 CL )。在读命令(同时发送列地址)发送完之后需要等待几个时钟周期, DQ 数据线上的数据,才会有效,这个延迟时间,就叫 CL ,一般设置为 2/3 个时钟周期。
* E% w6 }2 a8 _9 d, W$ ?/ N特别注意:列地址选通延迟(CL ),仅在读命令的时候有效果,在写命令的时候,并不需要这个延迟。
) x, w# k0 h; \$ T8 R: KWrite Mode即写模式,用于设置单次写的模式,可以选择突发写入或者单次写入。0 j6 i) a; |( i' Q5 p
2 u8 p9 }4 E- I1 v) ]+ E8 k
初始化5 @! a) K) Y- c4 I0 |; h" s
初始化分为五个步骤
% j! x) I- ~' l* |1.上电5 F# V2 N& ]( [
给SDRAM供电,是能CLK,并发送NOP(No Operation命令),上电后至少要等待200us,再发送其他命令。
/ q% Z/ Z3 e( C7 @' K. a2.发送预充电命令9 N$ [3 F1 W# L5 V6 t/ b: |6 r  Q
发送预充电命令,给所用BANK预充电5 u1 B) x9 D$ _$ c  \
3.发送自动刷新命令
* I8 T* u" n* d7 o, W. @9 G至少要放松8次自动刷新命令,每一次自动刷新命令之间的时间间隔为tRC# N7 X- b8 W/ y$ b/ ]/ U
4.设置寄存器模式
, _% {# O6 ]$ h+ u4 v0 I发送模式寄存器的值,配置SDRAM的工作参数,配置完成后,需要等待tMRD(也叫tRSC),使模式寄存器的配置生效,才能发送其他命令
) Q7 [& u& b$ w- t. Q4 C5.完成
0 d% y8 E3 n- q& s. D) Z$ `7 O经过前面四个步骤,SDRAM的初始化就完成了,接下来就可以发送激活命令和读写命令进行数据的读写了。
+ C2 F+ k" L; h2 i$ u5 Z+ x% \# J4 w( N
写操作
& e7 r/ i" Y" i/ z  E0 Q! j! ]1.发送激活命令
% m7 m2 C1 \+ [4 e* q* H! }* F9 b8 Z此命令同时设置行地址和BANK地址,发送该命令后,需要等待tRCD时间,才可以发送写命令: w+ ?: I# e/ `0 z8 g: t0 ]. q
2.发送写命令, Q0 a4 Y, F  ?4 W6 n8 V7 x* z
在发送完激活命令,并等待tRCD后,发送写命令,该命令同时设置列地址,完成对SDRAM的寻址。同时,将数据通过DQ数据线,存入SDRAM
5 ]. H6 i7 a& `$ A: p) B& I- }3.使能自动预充电
  v, D& Y# L) X! @1 y: d7 W! [在发送写命令的同时,拉高A10地址线,使能自动预充电,以提高读写效率
% ~5 \/ S* o' R6 r, Q4.执行预充电
) K  ]; ~' u1 k( D0 r2 \, ]预充电在发送激活命令的tRAS时间后启动,并且需要等待tRP时间* n( _! y; e; m9 o  m8 S
5.完成一次数据写入
6 V. ], A4 }7 h6 D% v( M. y0 f4 I8 f至此完成了一次数据写入操作,发送第二个激活命令,启动下一次数据传输。! l' T; H1 R% q, P
5 o2 D- `) p8 q( K4 ]/ b7 Q% L& u
读操作

+ U8 u0 `$ G5 ]/ T: K* V4 U1.发送激活命令. {' @' l8 M) m5 H
此命令同时设置行地址和BANK地址,发送该命令后,需要等待tRCD时间,才可以发送写命令
; F/ n4 J/ [; A" f3 L* [: Q2.发送读命令
5 W* `0 s( @: T3 G2 u在发送完激活命令,并等待tRCD 后,发送读命令,该命令同时设置列地址,完成对 SDRAM的寻址。读操作还有一个 CL 延迟( CAS Latency ),所以需要等待给定的 CL 延迟( 2 个或 3 个CLK )后,再从 DQ 数据线上读取数据。
: b4 O) a" B6 a3 u1 g3.使能自动预充电6 s) A/ m. s' c% m
在发送写命令的同时,拉高A10地址线,使能自动预充电,以提高读写效率
" e9 q7 k2 p: l5 U7 F4.执行预充电
- C, f4 X% `, E预充电在发送激活命令的tRAS时间后启动,并且需要等待tRP时间来完成
8 Q  F) Q, k5 h% m- {5.完成一次数据写入8 \5 ]2 X, ^& G' {
至此完成了一次数据写入操作,发送第二个激活命令,启动下一次数据传输。9 ~3 P# }8 b' A5 v& t' ?7 d+ A

2 H: I6 ?, `/ E% W- LFMC接口驱动SDRAM+ F7 F4 H% z* x2 L( Q
SDRAM相关寄存器' [4 H* u7 Q+ ^4 w( U, `5 m; x
控制寄存器FMC_SDCR1/FMC_SDCR2

: J1 U4 u$ G, l8 z7 x1 p
- }5 u& o% w" t, H  [
2f93559309a3463499ec9ecd56db248d.png

* P  m% K/ W8 o! j. ]' w* v% b( l# K8 ]3 Y3 E% @# K
该寄存器只有低15 位有效,且都需要进行配置:
( W# ?3 [( O; ?+ y) P
2 l* |) A- b# c# _$ ^
L%[JX5MR7D@@QTFPC[0BKJ6.png
- x! C4 r( p7 [6 X

2 l) F2 s) l5 w3 B9 O+ c的时序寄存器FMC_SDTR1/FMC_SDTR2
" p6 C# f. r5 _  r) ~9 G% @+ |该寄存器用于控制SDRAM的时序$ [8 ]4 o9 X' q
5 s$ p8 E* l9 z( H
cd1d697b6a32458993b938168cd870a3.png

  t/ b6 Q: u& r/ T( o' H4 G) q/ |! U6 \) ^8 h& N3 ~/ `1 h
XYHBJW[%TZ5%Q3L)4I02N13.png
' v2 w8 C+ l; A, @, k: P
' a+ M" `0 k. D

( W* E  k4 j! r6 O的命令模式寄存器 FMC_SDCMR
# h4 T0 Y  z: v

. b" `1 ~8 N7 T& L) u" S2 e  Y
90a0a2662f4d43339e26cfbed3d6168e.png
1 j. u4 z) z+ f- k; G

' m2 K9 {" a1 v! i' `' r; e
YTM_}GBLAQHF8[STBL(VBQS.png
) O. F$ v  H) i4 z- ]$ Q4 X
5 P& R8 w* E/ |( n
; y6 D! l* b" g7 n" A+ ]
刷新定时器寄存器: FMC_SDRTR
* }: z/ ?* K( ^. F# _, y
以W9825G6KH 为例, W9825G6KH 的刷新周期为 64ms ,行数为 8192行,所以刷新速率为:
  J: q# Y7 ^+ d4 L; a刷新速率=64ms/8192=7.81us2 }( ~, C7 [! K$ p$ Q2 \
而SDRAM 时钟频率 =216Mhz/2=108Mhz 9.26ns ,
1 P* h( D6 E9 x所以 COUNT 的值为:  f( M& J; d! {3 C- U: T6 a* S
COUNT=7.81us/9.26ns=844* L, Z3 x6 o7 J' Y8 `
SDRAM 在接受读请求后,出现内部刷新请求,则必须将刷新速率增加 20 个 SDRAM时钟周期,以获得充足的余量,所以,实际设计的 COUNT 值应该是: COUNT 20=824 。所以设置 FMC_SDRTR 的 COUNT=824 ,就可以完成对该寄存器的配置。5 B  m9 y4 M0 o' S
" E% t5 Y- z& Y; }% P
5fdd6f505fa6422cb0276d54268b2acb.png

" V! h0 y* {( d( v. X+ Z' k9 }- s" d2 I) m9 S9 L
附录
) a- i; b+ e1 }; a交代
# `& o1 w8 d. P/ c$ a9 J上文中的tRC 、 tMRD 和 tRSC 见 SDRAM 的芯片数据手册。
. t" i& L* ?" q5 W) k5 r% {6 ^0 R( V& S
声明
! x  o  w+ E/ s$ V* a7 A* L3 j! Q本文大部分参考于正点原子( ~. M1 f$ q* i
0 W2 u: d2 U1 o: J4 {2 k
' P, P  _2 t1 t# l+ i- N% C! V

( Z& `- C5 a) F6 `5 j& D
收藏 评论0 发布时间:2021-12-11 12:00

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版