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

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

[复制链接]
STMCU小助手 发布时间:2021-12-11 12:00
SDRAM7 J6 L% V- G4 X% d$ J
SDRAM英文名是 Synchronous Dynamic Random Access Memory ,即同步动态随机存储器,相较于 SRAM(静态存储器) SDRAM 具有:容量大和价格便宜的特点。
: q3 h: G: C! I# G, k# k: V. MSTM32F767 支持 SDRAM ,我们可以外挂 SDRAM ,从而大大降低外扩内存的成本,如下SDRAM 型号为: W9825G6KH 的结构框图。$ m3 T- L# _& e, R$ q/ f) z

# {6 z/ Q' f9 U
b7a7616114e04ac29747a9552f422078.png

0 q0 y+ Z2 K5 g
  U  I  k) r) V0 y" ^6 e, Y一个SDRAM 芯片内部,一般又有4 个存储单元(BANK),所以,在SDRAM 内部寻址的时候,先指定BANK 号和行地址,然后再指定列地址,就可以查找到目标地址。
) p/ k% W- \: T6 C2 J5 F4 ESDRAM信号线% E4 [* g) \: n0 @" ?" k" G
寻址的时候,首先RAS 信号为低电平,选通行地址,地址线A0~A12 所表示的地址,会被传输并锁存到行地址译码器里面,最为行地址,同时BANK地址线上面的BS0,BS1 所表示的BANK地址,也会被锁存,选中对应的BANK,然后,CAS 信号为低电平,选通列地址,地址线A0~A12 所表示的地址,会被传输并锁存到列地址译码器里面,作为列地址,这样,就完成了一次寻址。
/ i+ t+ @% c1 @! a0 k! B2 C  @; R3 Q: i: i6 [
30af7623f2bd4ae3a598441893e1045e.png

5 ~- U) A* n1 I: ~
7 J  v3 m7 h; p存储单元
. n$ V$ E: @4 k: P
) c" u, V7 ?1 k
0ec8b254ab74423fac8de7e8629ebd6b.png
  v7 s" {+ J4 X4 j; N- O

" Y, L+ R" e: t, H2 `9 X存储结构" r. Y1 S& w9 C6 W
W9825G6KH 的存储结构为:行地址:8192 个;列地址:512 个;BANK 数:4 个;位宽:16 位;这样,整个芯片的容量为:81925124*16=32M 字节。
0 z6 x& [" {: Q, Q. X) l6 K8 [" G$ G& a3 P
587fe7f593494021b454b8057063cd44.png

, J5 {" k+ v9 o( h" l% s( Z  e% |- T+ m( l5 t0 @6 I8 m# M4 _' |. e0 f
数据传输
) @7 m0 V2 Z5 S' `* ]/ R在完成寻址以后,数据线DQ0~DQ15 上面的数据会通过数据控制逻辑写入(或读出)存储阵列。
7 y' c2 D& z7 [( t' T. N) ^特别注意:因为SDRAM 的位宽,可以达到32 位,也就是最多有32 条数据线,在实际使用的时候,我们可能会以:8 位、16 位、24 位和32 位等宽度来读写数据,这样的话,并不是每条数据线,都会被使用到,未被用到的数据线上面的数据,必须被忽略,这个时候就需要用到数据掩码DQM 线来控制了,每一个数据掩码线,对应8 个位的数据,低电平表示对应数据位有效,高电平表示对应数据位无效。* j) E6 m+ G! ~6 L# r1 t0 M
W9825G6KH中,假设以8 位数据访问,我们只需要DQ0 ~DQ7 的数据,而DQ8~DQ15的数据需要忽略,此时,我们只需要设置LDQM 为低电平,UDQM 为高电平,就可以了。
. P: \1 m' o5 A  o6 [. U控制命令
! H) u' v- j' K9 f4 p1 h
, s. ?! m& H  T- K! i  Q
36064700762043c8b4c0a864a594dba9.png
, ?: l7 B8 ?0 A+ _. v- V/ P
( `0 u  m/ C* K3 e5 V* Z4 M3 E
空操作命令

# m% ^# |) w& {NO-Operation,空操作命令,用于选中SDRAM,防止SDRAM接受错误的命令,为接下来的命令发送做准备。
5 g* e" v, K! `' \( h; e& j
( m, N0 A2 V% @/ ]1 e激活命令  D% [( i% ?3 n) \3 ?
Active,激活命令,该命令必须在读写操作之前被发送,用于设置所需要的Bank和行地址(同时设置这2个地址),Bank地址由BS0,BS1(也写作BA0,BA1,下同)指定,行地址由A0~A12指定3 [4 C) W- D- |% U
2 }& m1 z8 s1 K( c
读写命令8 Z" l- ~8 E& L% {: d
Read/Write,读/写命令,在发送完激活命令后,再发送列地址就可以完成对SDRAM的寻址,并进行读写操作了,读/写命令和列地址的发送,是通过一次传输完成的。列地址由 A0~A9 指定, WE 信号控制读 写命令,高电平表示读命令,低电平表示写命令。" w/ q7 z6 }9 G  E: W( x& s
: y; k5 k6 k% f
预充电命令
) H9 C  D2 C% M0 K: NPrecharge,预充电指令,用于关闭Bank中所打开的行地址。由于SDRAM的寻址具体独占性,所以在进行完读写操作后,如果要对同一Bank的另一行进行寻址,就要将原来有效(打开)的行关闭,重新发送行/列地址。Bank关闭现有行,准备打开新行的操作就叫做预充电(Precharge)。( Y6 y4 Q" B1 S% I1 q8 u( `
预充电命令可以通过独立的命令发送,也可以在每次发送读 写命令的时候,使用地址线A10 ,来设置自动预充电。在发送读 写命令的时候,当 A10=1 ,则使能所有 Bank 的预充电,在读 写操作完成后,自动进行预充电。这样,下次读 写操作之前,就不需要再发预充电命令了,从而提高读 写速度。: [$ E' Q8 B% S

! J: [" c# y% W0 _- q刷新命令
/ P5 O0 X% \' H. pRefresh,刷新命令,用于刷新一行数据。SDRAM里面存储的数据,需要不断的进行刷新操作才能保留住,因此刷新命令对于SDRAM来说,尤为重要。预充电命令和刷新命令,都可以实现对 SDRAM 数据的刷新,不过预充电仅对当前打开的行有效(仅刷新当前行),而刷新命令,则可以依次对所有的行进行刷新操作。
" O! s+ F. U6 w总共有两种刷新操作:自动刷新(Auto Refresh )和自我刷新 (Self Refresh ),在发送 Refresh
1 ^4 M. U: E1 M; m: g5 b命令时,如果 CKE 有效(高电平),则使用自动刷新模式,否则使用自我刷新模式。不论是何& U" Q4 F. F8 p" n; y
种刷新方式,都不需要外部提供行地址信息,因为这是一个内部的自动操作。0 z5 a9 ?- v4 ^6 }/ t( o& D
自动刷新:SDRAM 内部有一个行地址生成器(也称刷新计数器)用来自动 的依次生成要
5 s9 R- p: M6 }' z  |刷新的行地址。由于刷新是针对一行中的所有存储体进行,所以无需列寻址。刷新涉及到所有! z0 E/ @) Y) o9 {5 @$ W
Bank ,因此在刷新过程中,所有 Bank 都停止工作,而每次刷新所占用的时间为 9 个时钟周期# e( h) l* v. \, g
PC133 标准),之后就可进入正常的工作状态,也就是说在这 9 个时钟期间内,所有工作指. z# n, f. j7 L: U+ f
令只能等待而无法执行。刷新操作必须不停的执行,完成一次所有行的刷新所需要的时间,称# D- Y8 t3 A: M6 Y+ B( {
为刷新周期,一般为 64ms 。显然,刷新操作肯定会对 SDRAM 的性能造成影响,但这是没办法
/ E$ M4 r! a9 i; }的事情,也是 DRAM 相对于 SRAM (静态内存,无需刷新仍能保留数据)取得 成本优势的同8 J, o# E- o, T. d
时所付出的代价。
$ a7 Z9 s+ N4 P: z自我刷新:主要用于休眠模式低功耗状态下的数据保存,在发出自动刷新命令时,将CKE置于无效状态(低电平),就进入了自我刷新模式,此时不再依靠系统时钟工作,而是根据内部的时钟进行刷新操作。在自我刷新期间除了CKE 之外的所有外部信号都是无效的(无需外部提供刷新指令),只有重新使 CKE 有效(高电平)才能退出自刷新模式并进入正常操作状态。7 l3 P; M! p% m& R; N$ d

# Y! Z: w# ]+ U# m' W设置模式寄存器命令" i  M0 X' o" n7 l' n4 }5 H1 }
Mode Register Set,设置模式寄存器命令。SDRAM芯片内部有一个逻辑控制单元,控制单元的相关参数由模式寄存器提供,我们通过设置模式寄存器命令,来完成对模式寄存器的设置,这个命令在每次对SDRAM进行初始化的时候,都需要用到。( G2 v; B0 d6 I' {
. R1 C/ |( M! f+ y% H% j
9b14ac69923344648bdcd7cb20f3941e.png

2 v' V2 j" ^9 A) F3 W% o" G7 B' i- |9 G1 e3 b
Burst Length突发长度模式(简称 BL ),通过 A0~A2 设置, 是指在同一行中相邻的存储单元连 续进行数据传输的方式,连续传输所涉及到存储单元(列)的数量就是突发长度。
0 s, }0 \$ Q4 S4 ]* Q/ W; y" Q: H  G前面我们说的读写操作,都是一次对一个存储单元进行寻址,如果要连续读 写就还要对当前存储单元的下一个单元进行寻址,也就是要不断的发送列地址与读 写命令(行地址不变,所以不用再对行寻址)。虽然由于读 写延迟相同可以让数据的传输在 I/O 端是连续的,但它占用了大量的内存控制资源,在数据进行连续传输时无法输入新的命令,效率很低 。
$ s% u) O+ B% l4 ]为此,人们开发了突发传输技术,只要指定起始列地址与突发长度,内存就会依次地自动对后面相应数量的存储单元进行读 写操作而不再需要控制器连续地提供列地址。 这样,除了第一个数据的传输需要若干个周期外,其后每个数据只需一个周期的即可获得。6 ]$ d6 ?8 j; X( ~7 x9 B
非突发连续读取模式:不采用突发传输而是依次单独寻址,此时可等效于BL=1 。虽然可以让数据是连续的传输,但每次都要发送列地址与命令信息,控制资源占用极大。
0 Q( L+ M% s2 N' O突发连续读取模式:只要指定起始列地址与突发长度,寻址与数据的读取自动进行,而只要控制好两段突发读取命令的间隔周期(与 BL 相同)即可做到连续的突发传输。 至于 BL 的数值,也是不能随便设或在数据进行传输前临时决定,而是在初始化的时候,通过模式 寄存器设置命令,进行设置。9 X4 z' |3 x+ t7 G  e
目前可用的选项是 1 、 2 、 4 、 8 、全页( Full Page ),常见的设定是 4 和 8 。 若传输长度小于突发长度,则需要发送 Burst Stop(停止突发)命令,结束突发传输。
6 ?% ]# y3 f6 n1 O4 sAddressing Mode,突发访问的地址模式,通过 A3 设置,可以设置为: Sequential (顺序6 J4 c' E7 b; E) A- g; H
或 Interleave (交错)。顺序方式,地址连续访问,而交错模式则地址是乱序的,一般选择连续模式。$ l' O8 c2 B/ `9 x
CAS Latency列地址选通延迟(简称 CL )。在读命令(同时发送列地址)发送完之后需要等待几个时钟周期, DQ 数据线上的数据,才会有效,这个延迟时间,就叫 CL ,一般设置为 2/3 个时钟周期。
1 x, X. [- k) n& s* J, b  g; H特别注意:列地址选通延迟(CL ),仅在读命令的时候有效果,在写命令的时候,并不需要这个延迟。& Z& }* a: X& M! _) S2 w
Write Mode即写模式,用于设置单次写的模式,可以选择突发写入或者单次写入。( d! w7 I) A8 e9 ]1 i, L( V
' A- \+ y0 O7 e" K$ U$ o0 f
初始化
: v* Y1 P7 |7 Z* b, v初始化分为五个步骤
" P' \% C! u3 ]/ {; f, l. V" Y1.上电
. N  s- E. ~0 J9 U' [给SDRAM供电,是能CLK,并发送NOP(No Operation命令),上电后至少要等待200us,再发送其他命令。
8 t! w0 v$ F/ O7 Y+ w: B0 I2.发送预充电命令; D; `( E/ t% c6 o2 l/ Z
发送预充电命令,给所用BANK预充电
5 c0 d  S+ E) Z3.发送自动刷新命令
; R: @# z: c: X- _# x. t至少要放松8次自动刷新命令,每一次自动刷新命令之间的时间间隔为tRC
( M/ U. ~/ z2 v9 u2 I4.设置寄存器模式% _0 B( t0 o- R
发送模式寄存器的值,配置SDRAM的工作参数,配置完成后,需要等待tMRD(也叫tRSC),使模式寄存器的配置生效,才能发送其他命令
) C+ c/ M$ s" K8 w$ I+ ~5.完成
8 U6 i) a2 Q, K$ y1 p5 J, q经过前面四个步骤,SDRAM的初始化就完成了,接下来就可以发送激活命令和读写命令进行数据的读写了。& {% r  v8 ?* a- f
: ]$ ~, `! v6 @8 ]' g6 r/ [4 n
写操作
* C/ q# b1 S0 K8 L: X9 n- Y/ g1.发送激活命令
7 V5 [) }4 ?  c4 C1 O. ]$ u6 b7 r此命令同时设置行地址和BANK地址,发送该命令后,需要等待tRCD时间,才可以发送写命令; R) z9 Q3 @7 I+ [
2.发送写命令
! A( s3 l1 p: J! j3 o在发送完激活命令,并等待tRCD后,发送写命令,该命令同时设置列地址,完成对SDRAM的寻址。同时,将数据通过DQ数据线,存入SDRAM
# K" J! i8 S- E$ M. p% u3.使能自动预充电
* h; Y$ q8 R0 w+ ^: f在发送写命令的同时,拉高A10地址线,使能自动预充电,以提高读写效率
" }0 @& s5 `) k& w5 u) Q, S$ q4.执行预充电
6 C4 e) q' c4 h3 o' L预充电在发送激活命令的tRAS时间后启动,并且需要等待tRP时间1 H* [, v) V$ X: u
5.完成一次数据写入- y& p) F) p! k. a' c6 a0 C
至此完成了一次数据写入操作,发送第二个激活命令,启动下一次数据传输。9 q/ f0 ?- h- Q9 B9 ]8 d
9 E- G1 Q' G. |9 m* [
读操作

3 ]+ j8 N" y$ |/ l1.发送激活命令' K# `4 ?( I- R! j& Q& F3 H
此命令同时设置行地址和BANK地址,发送该命令后,需要等待tRCD时间,才可以发送写命令
# s/ D# V  }- N2 N- g3 n+ n! \8 y% @2.发送读命令2 N$ n3 G3 p# [3 F( O, N( d/ P
在发送完激活命令,并等待tRCD 后,发送读命令,该命令同时设置列地址,完成对 SDRAM的寻址。读操作还有一个 CL 延迟( CAS Latency ),所以需要等待给定的 CL 延迟( 2 个或 3 个CLK )后,再从 DQ 数据线上读取数据。
1 t2 G, u; v7 O, Y- ~. B3 H9 i5 t1 t3 u3.使能自动预充电
2 y4 G# ?; w+ F2 d' W& }# \在发送写命令的同时,拉高A10地址线,使能自动预充电,以提高读写效率" c& w0 n, T7 t$ o
4.执行预充电
( B8 o$ ?1 h& k  p" [- P+ f预充电在发送激活命令的tRAS时间后启动,并且需要等待tRP时间来完成
1 k& }- s( f& y  v/ G+ D, `5.完成一次数据写入( C/ z8 u' F( H0 ^/ T. l; U4 s8 {$ w
至此完成了一次数据写入操作,发送第二个激活命令,启动下一次数据传输。8 J  y) F' v9 E6 B+ K9 L; y
3 c1 o8 U! z$ @2 ?. Z
FMC接口驱动SDRAM4 s, Y' z3 x8 a- C, @
SDRAM相关寄存器' \5 p4 q" h* N4 H6 ~7 Y; }7 C# y
控制寄存器FMC_SDCR1/FMC_SDCR2

: S  }# G/ E; C" T# {5 B) i5 n1 ~' o4 C5 c2 W) ?0 c
2f93559309a3463499ec9ecd56db248d.png

* C; q6 ]/ B) u5 W& T& a+ Z, w) g- f' I4 e2 L
该寄存器只有低15 位有效,且都需要进行配置:
% R) N: @6 `1 F! H0 ^1 K1 q
3 v; X  D' X7 n& h: T( l6 Y% g
L%[JX5MR7D@@QTFPC[0BKJ6.png
+ [: Y1 C) c* o! R5 p. l
7 w  u! S; \/ S. E
的时序寄存器FMC_SDTR1/FMC_SDTR2
5 F6 C1 s9 l, v4 ~该寄存器用于控制SDRAM的时序  e% Q( @2 ^" ^" [
5 }3 E- |' y! s. b' Q
cd1d697b6a32458993b938168cd870a3.png
6 O7 h  u% r4 G3 g  X8 x
& Q4 u) a) a0 q( h! k7 _
XYHBJW[%TZ5%Q3L)4I02N13.png

0 {0 u' j" e" H/ t+ q* x) Y+ R, b7 R' s

0 R: C0 i' m- {的命令模式寄存器 FMC_SDCMR

# k- {7 O7 |$ H" f2 Q; d4 Z5 |% O8 E' B9 b( [
90a0a2662f4d43339e26cfbed3d6168e.png
8 X1 K- u+ I+ }  E# t  `$ {
( [9 r9 [! q+ ]( P1 x+ o
YTM_}GBLAQHF8[STBL(VBQS.png
+ _$ r0 s& R# P( b. ^( h6 F) z& e$ V  B
8 W% w: c7 s9 i" v0 Z; ?# B

" f' x; M8 b2 @. K7 z- e7 k刷新定时器寄存器: FMC_SDRTR

& C. |( D$ [' d9 [# F0 ^% l以W9825G6KH 为例, W9825G6KH 的刷新周期为 64ms ,行数为 8192行,所以刷新速率为:! c/ O& ^; E5 ]; W
刷新速率=64ms/8192=7.81us) W, W* z. L/ C! K
而SDRAM 时钟频率 =216Mhz/2=108Mhz 9.26ns ,
( U* h2 }1 g' t7 B" R所以 COUNT 的值为:1 s# n  G$ h% V, m$ D
COUNT=7.81us/9.26ns=844' E# h0 V1 `# l1 l0 ^6 z0 c" G
SDRAM 在接受读请求后,出现内部刷新请求,则必须将刷新速率增加 20 个 SDRAM时钟周期,以获得充足的余量,所以,实际设计的 COUNT 值应该是: COUNT 20=824 。所以设置 FMC_SDRTR 的 COUNT=824 ,就可以完成对该寄存器的配置。
2 w8 O4 E! H  x
5 u/ T* i5 a( R4 G
5fdd6f505fa6422cb0276d54268b2acb.png

# S( j$ ]; i( W. b
: P$ z2 p  x; J6 i附录
6 a" m5 b! [9 t  z" E+ Y# |' Y交代
% Y) f$ M. Y9 y上文中的tRC 、 tMRD 和 tRSC 见 SDRAM 的芯片数据手册。* W0 V# U* U: Y* v
; w# e3 x6 ~) }. ~( W
声明; `* O$ A  N# ^& I% l9 f$ m4 P
本文大部分参考于正点原子6 v% p$ p3 }+ t  j1 X
! Z: t) m* i. p1 Y
' |6 B4 W2 s( K

) l: n/ `0 |2 u
收藏 评论0 发布时间:2021-12-11 12:00

举报

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