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

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

[复制链接]
STMCU小助手 发布时间:2021-12-11 12:00
SDRAM
- P( a0 q2 z# p+ q/ DSDRAM英文名是 Synchronous Dynamic Random Access Memory ,即同步动态随机存储器,相较于 SRAM(静态存储器) SDRAM 具有:容量大和价格便宜的特点。2 h4 p' P! {8 h% ~0 M5 D
STM32F767 支持 SDRAM ,我们可以外挂 SDRAM ,从而大大降低外扩内存的成本,如下SDRAM 型号为: W9825G6KH 的结构框图。
4 F& A9 Y( p) t) \+ f
! B/ M# u. y  H' I4 Z% T! {
b7a7616114e04ac29747a9552f422078.png
$ T  k4 L: L5 ]
+ G; H0 Y  ~2 s/ s% R
一个SDRAM 芯片内部,一般又有4 个存储单元(BANK),所以,在SDRAM 内部寻址的时候,先指定BANK 号和行地址,然后再指定列地址,就可以查找到目标地址。
" ]; ?, M* i* Q$ eSDRAM信号线- D3 a( d& E7 K9 I+ Z
寻址的时候,首先RAS 信号为低电平,选通行地址,地址线A0~A12 所表示的地址,会被传输并锁存到行地址译码器里面,最为行地址,同时BANK地址线上面的BS0,BS1 所表示的BANK地址,也会被锁存,选中对应的BANK,然后,CAS 信号为低电平,选通列地址,地址线A0~A12 所表示的地址,会被传输并锁存到列地址译码器里面,作为列地址,这样,就完成了一次寻址。
$ w% M$ w, H. V7 G; m4 }
' b4 |/ h; h3 k+ M
30af7623f2bd4ae3a598441893e1045e.png

3 H) l, \+ O; V$ `  J# ~, d2 m4 [1 V+ `, S! b
存储单元
. |1 D1 a- u% ?4 p- A5 u2 V0 t$ u' \; t1 [
0ec8b254ab74423fac8de7e8629ebd6b.png
( m" L+ l6 F9 {9 _
, |* L  N: p% C3 Y+ H. A: @
存储结构
6 }4 D# h  y2 s: R9 F) }: wW9825G6KH 的存储结构为:行地址:8192 个;列地址:512 个;BANK 数:4 个;位宽:16 位;这样,整个芯片的容量为:81925124*16=32M 字节。' R" p) R3 H8 A2 H2 u

% J2 p# n1 G$ e" k1 t/ V! _
587fe7f593494021b454b8057063cd44.png
( A! w9 C/ F+ _, F% V9 V1 U
8 @" L) ^* t* L* K
数据传输
* j; |+ Q! Z: D: V: }& |! x0 G0 F在完成寻址以后,数据线DQ0~DQ15 上面的数据会通过数据控制逻辑写入(或读出)存储阵列。
8 s9 u. u5 f. s2 P" [! Y$ {特别注意:因为SDRAM 的位宽,可以达到32 位,也就是最多有32 条数据线,在实际使用的时候,我们可能会以:8 位、16 位、24 位和32 位等宽度来读写数据,这样的话,并不是每条数据线,都会被使用到,未被用到的数据线上面的数据,必须被忽略,这个时候就需要用到数据掩码DQM 线来控制了,每一个数据掩码线,对应8 个位的数据,低电平表示对应数据位有效,高电平表示对应数据位无效。
5 D$ ?( q8 I3 G5 K) a& MW9825G6KH中,假设以8 位数据访问,我们只需要DQ0 ~DQ7 的数据,而DQ8~DQ15的数据需要忽略,此时,我们只需要设置LDQM 为低电平,UDQM 为高电平,就可以了。
# z/ E% p% \" w4 b' @! t. D( n控制命令/ t& U$ i5 V$ E2 _
; a( b7 ^7 c# X5 c# V. N
36064700762043c8b4c0a864a594dba9.png
$ M- z9 k; }3 p
6 Z$ d- o- }) E3 J
空操作命令
9 p7 y. ?- @& ?8 a$ P- ^
NO-Operation,空操作命令,用于选中SDRAM,防止SDRAM接受错误的命令,为接下来的命令发送做准备。
% n; x; Y+ q/ a! M$ u
3 r# u+ J+ u$ n; W% ?/ [激活命令* j+ G) Z5 X+ I
Active,激活命令,该命令必须在读写操作之前被发送,用于设置所需要的Bank和行地址(同时设置这2个地址),Bank地址由BS0,BS1(也写作BA0,BA1,下同)指定,行地址由A0~A12指定
( K0 K5 N. y! j
7 y% {- h7 R0 \1 H4 P读写命令) E* z+ j* @1 L! ^+ A  k
Read/Write,读/写命令,在发送完激活命令后,再发送列地址就可以完成对SDRAM的寻址,并进行读写操作了,读/写命令和列地址的发送,是通过一次传输完成的。列地址由 A0~A9 指定, WE 信号控制读 写命令,高电平表示读命令,低电平表示写命令。4 }( T- u6 C1 P$ K0 f
' x1 W) p( Y( f6 k3 a
预充电命令, m' _7 u- A1 Y6 F! {: e/ x
Precharge,预充电指令,用于关闭Bank中所打开的行地址。由于SDRAM的寻址具体独占性,所以在进行完读写操作后,如果要对同一Bank的另一行进行寻址,就要将原来有效(打开)的行关闭,重新发送行/列地址。Bank关闭现有行,准备打开新行的操作就叫做预充电(Precharge)。2 d: o* c: |. h; ?. {2 s
预充电命令可以通过独立的命令发送,也可以在每次发送读 写命令的时候,使用地址线A10 ,来设置自动预充电。在发送读 写命令的时候,当 A10=1 ,则使能所有 Bank 的预充电,在读 写操作完成后,自动进行预充电。这样,下次读 写操作之前,就不需要再发预充电命令了,从而提高读 写速度。5 Y' t& r8 `- o/ Y# z
3 {3 W/ J7 T8 v0 Q% S' U
刷新命令
0 P7 p% f1 X' n, W4 z+ H$ E  {. Y% nRefresh,刷新命令,用于刷新一行数据。SDRAM里面存储的数据,需要不断的进行刷新操作才能保留住,因此刷新命令对于SDRAM来说,尤为重要。预充电命令和刷新命令,都可以实现对 SDRAM 数据的刷新,不过预充电仅对当前打开的行有效(仅刷新当前行),而刷新命令,则可以依次对所有的行进行刷新操作。4 Y( t9 _. r; _- W% y  l8 V- S
总共有两种刷新操作:自动刷新(Auto Refresh )和自我刷新 (Self Refresh ),在发送 Refresh
, S0 h" Q; h; Y! g命令时,如果 CKE 有效(高电平),则使用自动刷新模式,否则使用自我刷新模式。不论是何
* J4 ^& z$ ]4 M" l" u  A种刷新方式,都不需要外部提供行地址信息,因为这是一个内部的自动操作。- b1 o: ~( q- z( [: Q! y
自动刷新:SDRAM 内部有一个行地址生成器(也称刷新计数器)用来自动 的依次生成要
, n- [" G* x$ Z8 F9 H, }# g刷新的行地址。由于刷新是针对一行中的所有存储体进行,所以无需列寻址。刷新涉及到所有( e; ~  g6 _9 {- T
Bank ,因此在刷新过程中,所有 Bank 都停止工作,而每次刷新所占用的时间为 9 个时钟周期
! z5 `7 m1 ^) mPC133 标准),之后就可进入正常的工作状态,也就是说在这 9 个时钟期间内,所有工作指: L3 `7 |6 p2 f& t7 c* w/ @
令只能等待而无法执行。刷新操作必须不停的执行,完成一次所有行的刷新所需要的时间,称( ?3 g6 K0 T. i) Q! x8 {' T* [
为刷新周期,一般为 64ms 。显然,刷新操作肯定会对 SDRAM 的性能造成影响,但这是没办法
7 D2 ~8 {+ Y. d的事情,也是 DRAM 相对于 SRAM (静态内存,无需刷新仍能保留数据)取得 成本优势的同& s2 W1 \' o" ]7 G
时所付出的代价。
5 E  W, v, M$ V+ V* J+ G自我刷新:主要用于休眠模式低功耗状态下的数据保存,在发出自动刷新命令时,将CKE置于无效状态(低电平),就进入了自我刷新模式,此时不再依靠系统时钟工作,而是根据内部的时钟进行刷新操作。在自我刷新期间除了CKE 之外的所有外部信号都是无效的(无需外部提供刷新指令),只有重新使 CKE 有效(高电平)才能退出自刷新模式并进入正常操作状态。
- J, c' y0 l5 y4 a  Q4 E9 X
# b; ]* n" N& l# g* T设置模式寄存器命令: j% y& K! `) N
Mode Register Set,设置模式寄存器命令。SDRAM芯片内部有一个逻辑控制单元,控制单元的相关参数由模式寄存器提供,我们通过设置模式寄存器命令,来完成对模式寄存器的设置,这个命令在每次对SDRAM进行初始化的时候,都需要用到。  G7 ]- C" ]. _5 u$ R1 J
5 w0 {8 z) a' K
9b14ac69923344648bdcd7cb20f3941e.png
7 l: L" o* J0 }& u; e" [7 M" z5 t

2 m# O% b% }1 _( [+ w! GBurst Length突发长度模式(简称 BL ),通过 A0~A2 设置, 是指在同一行中相邻的存储单元连 续进行数据传输的方式,连续传输所涉及到存储单元(列)的数量就是突发长度。1 m' H7 z7 O% d
前面我们说的读写操作,都是一次对一个存储单元进行寻址,如果要连续读 写就还要对当前存储单元的下一个单元进行寻址,也就是要不断的发送列地址与读 写命令(行地址不变,所以不用再对行寻址)。虽然由于读 写延迟相同可以让数据的传输在 I/O 端是连续的,但它占用了大量的内存控制资源,在数据进行连续传输时无法输入新的命令,效率很低 。
( j0 o) R3 Y3 B+ `! Z& k为此,人们开发了突发传输技术,只要指定起始列地址与突发长度,内存就会依次地自动对后面相应数量的存储单元进行读 写操作而不再需要控制器连续地提供列地址。 这样,除了第一个数据的传输需要若干个周期外,其后每个数据只需一个周期的即可获得。
/ D! Q6 P# [! a- K3 `5 w6 Q! j非突发连续读取模式:不采用突发传输而是依次单独寻址,此时可等效于BL=1 。虽然可以让数据是连续的传输,但每次都要发送列地址与命令信息,控制资源占用极大。" c6 a3 i( Z7 V( m
突发连续读取模式:只要指定起始列地址与突发长度,寻址与数据的读取自动进行,而只要控制好两段突发读取命令的间隔周期(与 BL 相同)即可做到连续的突发传输。 至于 BL 的数值,也是不能随便设或在数据进行传输前临时决定,而是在初始化的时候,通过模式 寄存器设置命令,进行设置。1 e3 g# x, A* o6 Z$ S; m  d
目前可用的选项是 1 、 2 、 4 、 8 、全页( Full Page ),常见的设定是 4 和 8 。 若传输长度小于突发长度,则需要发送 Burst Stop(停止突发)命令,结束突发传输。- Q3 H9 Y, L6 [
Addressing Mode,突发访问的地址模式,通过 A3 设置,可以设置为: Sequential (顺序9 V% m0 ~, Y  D5 I9 W
或 Interleave (交错)。顺序方式,地址连续访问,而交错模式则地址是乱序的,一般选择连续模式。
2 O7 H+ M$ M1 {CAS Latency列地址选通延迟(简称 CL )。在读命令(同时发送列地址)发送完之后需要等待几个时钟周期, DQ 数据线上的数据,才会有效,这个延迟时间,就叫 CL ,一般设置为 2/3 个时钟周期。
3 z( p0 g/ _0 P7 |2 y2 O( s* [特别注意:列地址选通延迟(CL ),仅在读命令的时候有效果,在写命令的时候,并不需要这个延迟。
7 U5 {- [0 g2 y$ K7 L( o$ U0 |1 P! VWrite Mode即写模式,用于设置单次写的模式,可以选择突发写入或者单次写入。
7 Z  _8 v2 m1 g6 l% C( k8 y1 W4 L
初始化
1 D! u  r/ a; k' c3 |# Q% q初始化分为五个步骤
9 Y2 h9 U" G- l/ l  E1.上电
/ s+ Q; ]! x3 W6 w' ^4 `: L* H8 P给SDRAM供电,是能CLK,并发送NOP(No Operation命令),上电后至少要等待200us,再发送其他命令。5 S, \2 p2 j8 j! N# u( f: Q
2.发送预充电命令
5 i5 M' ?5 C- E4 R% v  h1 K+ g发送预充电命令,给所用BANK预充电
/ T9 Q! e1 U" k1 m3.发送自动刷新命令& U- T8 N; H9 {4 x( h& E9 z
至少要放松8次自动刷新命令,每一次自动刷新命令之间的时间间隔为tRC% t% o/ ?" A: `  R. Q0 b% u  ^
4.设置寄存器模式- t, W# w5 n, o( J- I4 l, Y; e. G
发送模式寄存器的值,配置SDRAM的工作参数,配置完成后,需要等待tMRD(也叫tRSC),使模式寄存器的配置生效,才能发送其他命令2 R- b; M) \( {; q0 g
5.完成3 n2 s0 a+ r/ ]6 K8 a
经过前面四个步骤,SDRAM的初始化就完成了,接下来就可以发送激活命令和读写命令进行数据的读写了。5 W1 C4 Q; [+ _# M& |0 a! }, S

  G/ G# c/ `5 [8 Z$ q0 r写操作6 o; F1 r& a  ]% v" Y! z
1.发送激活命令: R. [1 {7 z& X* r
此命令同时设置行地址和BANK地址,发送该命令后,需要等待tRCD时间,才可以发送写命令
+ m4 q, d+ q9 f& ?+ A1 _2.发送写命令7 U: A, m7 A  j# G% x
在发送完激活命令,并等待tRCD后,发送写命令,该命令同时设置列地址,完成对SDRAM的寻址。同时,将数据通过DQ数据线,存入SDRAM* t8 d; H* a4 V7 H# \
3.使能自动预充电7 q9 [- n' i# }! X& Z7 F
在发送写命令的同时,拉高A10地址线,使能自动预充电,以提高读写效率* u; k0 M* @3 Q' x" ?! |3 Z
4.执行预充电
; B( ~2 M5 }. ?. u预充电在发送激活命令的tRAS时间后启动,并且需要等待tRP时间
: U8 C" |5 A9 H' \! T1 T# `/ C5.完成一次数据写入
' V! M% M1 `( x* K7 y至此完成了一次数据写入操作,发送第二个激活命令,启动下一次数据传输。
3 S( z" }" G# i( X3 [3 O2 ~- b- Q
: B) g8 K2 ]! \* U读操作
1 T9 h: e2 p8 X
1.发送激活命令! a+ _" p& D5 W  x
此命令同时设置行地址和BANK地址,发送该命令后,需要等待tRCD时间,才可以发送写命令% ^9 ?+ u; d1 B
2.发送读命令
4 _2 o3 N9 ^! J, a0 N7 Q在发送完激活命令,并等待tRCD 后,发送读命令,该命令同时设置列地址,完成对 SDRAM的寻址。读操作还有一个 CL 延迟( CAS Latency ),所以需要等待给定的 CL 延迟( 2 个或 3 个CLK )后,再从 DQ 数据线上读取数据。5 j$ t2 h: P( _  z
3.使能自动预充电1 ]. T3 d% f* `% X; i% n! _
在发送写命令的同时,拉高A10地址线,使能自动预充电,以提高读写效率0 \" t/ M3 o$ {6 b& Y- E" @' g6 n
4.执行预充电
' ]0 [, N6 o8 I% E预充电在发送激活命令的tRAS时间后启动,并且需要等待tRP时间来完成( R% t( z  Q# A
5.完成一次数据写入% _. n+ o4 |5 |* P: A/ L
至此完成了一次数据写入操作,发送第二个激活命令,启动下一次数据传输。& k: I# ^+ T: n! O0 P+ t: A8 I
& ~7 Y* c  [$ u8 \; @  r: D( n
FMC接口驱动SDRAM6 n; ^8 x' D5 D
SDRAM相关寄存器
% E0 `7 q7 `: e3 v' W# \8 I9 M+ w控制寄存器FMC_SDCR1/FMC_SDCR2

$ D0 i6 k4 s" V$ k7 c  _) o, z7 @, l2 U+ k5 a  x1 B
2f93559309a3463499ec9ecd56db248d.png

4 @. C8 F  |2 e, q. r6 `; d- w( w1 }1 w- X0 i; g8 e
该寄存器只有低15 位有效,且都需要进行配置:
- W* K. m" G0 r* g6 @
$ }1 u. d% {6 n( T2 ]; S
L%[JX5MR7D@@QTFPC[0BKJ6.png

) C* {( e! Q! l2 U  k, W: q* b/ L
. p+ ]$ A( ~" b2 a的时序寄存器FMC_SDTR1/FMC_SDTR22 `6 k7 x+ W# b4 e
该寄存器用于控制SDRAM的时序, v5 ?) r1 b# Q# O( o
) P' A" q: j, t, G3 i5 l; @
cd1d697b6a32458993b938168cd870a3.png

( j$ `1 N, G3 f9 ?7 R' B. p! i  }7 k4 D; Q9 _0 l: f
XYHBJW[%TZ5%Q3L)4I02N13.png
  J7 i! B$ T! _: R

" A1 p4 J) q" S7 h, Y% `& V/ c, L4 L; _7 B
的命令模式寄存器 FMC_SDCMR
- t; ]6 _6 y! Y! ]+ X; e
0 R, X9 E, C8 X0 J. M; r0 }
90a0a2662f4d43339e26cfbed3d6168e.png
, Y" V7 h3 I7 o3 e7 l* P

5 u1 B0 N/ B8 S! R* U8 \* @6 L) G
YTM_}GBLAQHF8[STBL(VBQS.png
) k2 I0 A* O8 Q. o4 P5 d5 _

- M" Q* N3 C' u9 q" D& [9 h. ?- P
2 ~/ x6 s5 b! y刷新定时器寄存器: FMC_SDRTR
' M" _- J. O# A% A6 h* ~
以W9825G6KH 为例, W9825G6KH 的刷新周期为 64ms ,行数为 8192行,所以刷新速率为:
  s& j# W/ `+ ~: Q) n刷新速率=64ms/8192=7.81us
& j' H. U* b% w& J* g$ h而SDRAM 时钟频率 =216Mhz/2=108Mhz 9.26ns ,+ O, A7 s" o, \' O: m. Y
所以 COUNT 的值为:3 s* `) t: S! q, E7 h
COUNT=7.81us/9.26ns=844
# r5 m4 D# o7 T! oSDRAM 在接受读请求后,出现内部刷新请求,则必须将刷新速率增加 20 个 SDRAM时钟周期,以获得充足的余量,所以,实际设计的 COUNT 值应该是: COUNT 20=824 。所以设置 FMC_SDRTR 的 COUNT=824 ,就可以完成对该寄存器的配置。
' t7 m9 F1 B. L4 Q1 [1 D  ?9 q; P4 N: _5 A* H* M7 E
5fdd6f505fa6422cb0276d54268b2acb.png

0 |, }$ A# r; h5 b
# o1 C" R  M1 u& G+ m" g附录8 N9 N: y$ }" ~) J; z
交代
1 J' @8 ~+ e5 ?4 y. k上文中的tRC 、 tMRD 和 tRSC 见 SDRAM 的芯片数据手册。# G' n8 ~: g9 }& ?' G. {- T
& v; y: R& C, Y* }2 K% i
声明
1 n0 O% ^  i5 T: ~5 B* B$ G% g本文大部分参考于正点原子$ A6 L+ m/ T; z$ d- r) h  [8 t3 L+ T
5 E9 v+ X# z. f8 K" I

0 S  I5 h' f' d: d4 Z' X( y
9 r. n: r2 t% v' Q9 t  S1 k
收藏 评论0 发布时间:2021-12-11 12:00

举报

0个回答

所属标签

相似技术帖

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