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

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

[复制链接]
STMCU小助手 发布时间:2021-12-11 12:00
SDRAM
6 Y4 c- V+ P' X* wSDRAM英文名是 Synchronous Dynamic Random Access Memory ,即同步动态随机存储器,相较于 SRAM(静态存储器) SDRAM 具有:容量大和价格便宜的特点。
+ i4 c2 Z5 u! W* L) q% R$ hSTM32F767 支持 SDRAM ,我们可以外挂 SDRAM ,从而大大降低外扩内存的成本,如下SDRAM 型号为: W9825G6KH 的结构框图。# O" e4 P8 Q5 _1 M7 i

/ S1 ~( p& Q2 |3 m
b7a7616114e04ac29747a9552f422078.png
: r* b7 F" V7 k, `' `
6 l- B, I' Z# j
一个SDRAM 芯片内部,一般又有4 个存储单元(BANK),所以,在SDRAM 内部寻址的时候,先指定BANK 号和行地址,然后再指定列地址,就可以查找到目标地址。2 |/ C: [# R0 z5 |/ o3 Z
SDRAM信号线; m! e0 |" {7 Y3 s
寻址的时候,首先RAS 信号为低电平,选通行地址,地址线A0~A12 所表示的地址,会被传输并锁存到行地址译码器里面,最为行地址,同时BANK地址线上面的BS0,BS1 所表示的BANK地址,也会被锁存,选中对应的BANK,然后,CAS 信号为低电平,选通列地址,地址线A0~A12 所表示的地址,会被传输并锁存到列地址译码器里面,作为列地址,这样,就完成了一次寻址。, f/ t- F$ c2 s! f

/ L; ~7 |3 i6 @, \# C# _1 y
30af7623f2bd4ae3a598441893e1045e.png

; Y9 Z. w' o9 e; k% y: b2 @4 p$ _5 X: ^0 w
存储单元' ^* V# ~' s0 i8 ?) _

! q+ J& E" W  l
0ec8b254ab74423fac8de7e8629ebd6b.png
; D( o, i9 V) x  W
% ^7 m0 }/ u1 s, p3 V: l
存储结构
: X% ^$ N, x: a' BW9825G6KH 的存储结构为:行地址:8192 个;列地址:512 个;BANK 数:4 个;位宽:16 位;这样,整个芯片的容量为:81925124*16=32M 字节。3 E" ~1 h7 `! O. K
' U: m3 z; I4 ?8 T/ M; U: ]
587fe7f593494021b454b8057063cd44.png

# g8 y1 ~  X0 h- n6 J3 Q- y" c3 J6 |( ?, `1 o4 a7 G
数据传输! I' f  ~3 `" L! l0 E
在完成寻址以后,数据线DQ0~DQ15 上面的数据会通过数据控制逻辑写入(或读出)存储阵列。
6 O) ]6 c- _( `特别注意:因为SDRAM 的位宽,可以达到32 位,也就是最多有32 条数据线,在实际使用的时候,我们可能会以:8 位、16 位、24 位和32 位等宽度来读写数据,这样的话,并不是每条数据线,都会被使用到,未被用到的数据线上面的数据,必须被忽略,这个时候就需要用到数据掩码DQM 线来控制了,每一个数据掩码线,对应8 个位的数据,低电平表示对应数据位有效,高电平表示对应数据位无效。
3 }  o( y6 i0 L9 zW9825G6KH中,假设以8 位数据访问,我们只需要DQ0 ~DQ7 的数据,而DQ8~DQ15的数据需要忽略,此时,我们只需要设置LDQM 为低电平,UDQM 为高电平,就可以了。
3 g& f/ W8 q. k8 v! H0 G4 p) ^控制命令
  f3 S4 e6 D4 E" d- j/ q3 R
  N$ G* P" ?2 t2 z
36064700762043c8b4c0a864a594dba9.png
- M/ R- q( _* N3 S

8 I: K- i4 t6 }3 t7 Y0 X; y空操作命令

. W; x/ E$ C0 I0 X# m" \. h# DNO-Operation,空操作命令,用于选中SDRAM,防止SDRAM接受错误的命令,为接下来的命令发送做准备。! d! d" s+ `9 F3 r+ \% W

7 U5 z! G. N9 F3 q  y: Z激活命令% W; v, l3 y9 o% Q2 G( T; k
Active,激活命令,该命令必须在读写操作之前被发送,用于设置所需要的Bank和行地址(同时设置这2个地址),Bank地址由BS0,BS1(也写作BA0,BA1,下同)指定,行地址由A0~A12指定
- Q# O- X1 N! s# C
; {* P9 k# x  i读写命令: I5 u) y! {3 q1 d) P/ x
Read/Write,读/写命令,在发送完激活命令后,再发送列地址就可以完成对SDRAM的寻址,并进行读写操作了,读/写命令和列地址的发送,是通过一次传输完成的。列地址由 A0~A9 指定, WE 信号控制读 写命令,高电平表示读命令,低电平表示写命令。6 b. W4 `4 S0 W$ v
6 L! C, W3 P3 p: P! I5 ?
预充电命令
5 u- n- r4 Z  R" E& GPrecharge,预充电指令,用于关闭Bank中所打开的行地址。由于SDRAM的寻址具体独占性,所以在进行完读写操作后,如果要对同一Bank的另一行进行寻址,就要将原来有效(打开)的行关闭,重新发送行/列地址。Bank关闭现有行,准备打开新行的操作就叫做预充电(Precharge)。
3 t8 K7 I1 P4 y4 T" G+ ^/ g预充电命令可以通过独立的命令发送,也可以在每次发送读 写命令的时候,使用地址线A10 ,来设置自动预充电。在发送读 写命令的时候,当 A10=1 ,则使能所有 Bank 的预充电,在读 写操作完成后,自动进行预充电。这样,下次读 写操作之前,就不需要再发预充电命令了,从而提高读 写速度。  C' C0 V1 ~, ~2 `/ w
' q( p6 g- L6 Q$ {
刷新命令
2 |* x* S* v+ H4 Z0 iRefresh,刷新命令,用于刷新一行数据。SDRAM里面存储的数据,需要不断的进行刷新操作才能保留住,因此刷新命令对于SDRAM来说,尤为重要。预充电命令和刷新命令,都可以实现对 SDRAM 数据的刷新,不过预充电仅对当前打开的行有效(仅刷新当前行),而刷新命令,则可以依次对所有的行进行刷新操作。4 M$ H5 ?4 U8 K* o5 l3 L- ?
总共有两种刷新操作:自动刷新(Auto Refresh )和自我刷新 (Self Refresh ),在发送 Refresh3 G1 R  t, T" W7 J  u
命令时,如果 CKE 有效(高电平),则使用自动刷新模式,否则使用自我刷新模式。不论是何0 d- k2 Q# z; Y3 F5 Z
种刷新方式,都不需要外部提供行地址信息,因为这是一个内部的自动操作。
7 o6 ?: B: U& u$ j% k1 j  w自动刷新:SDRAM 内部有一个行地址生成器(也称刷新计数器)用来自动 的依次生成要
, [, q5 q( e2 Q( T. Y0 G- J刷新的行地址。由于刷新是针对一行中的所有存储体进行,所以无需列寻址。刷新涉及到所有
' M/ K- k0 Q. _9 t7 R1 i; PBank ,因此在刷新过程中,所有 Bank 都停止工作,而每次刷新所占用的时间为 9 个时钟周期/ w, w3 L: {; A4 b* E; i
PC133 标准),之后就可进入正常的工作状态,也就是说在这 9 个时钟期间内,所有工作指: p  K0 b0 U; S2 {- c
令只能等待而无法执行。刷新操作必须不停的执行,完成一次所有行的刷新所需要的时间,称
# s8 M& Y" ]* h. e为刷新周期,一般为 64ms 。显然,刷新操作肯定会对 SDRAM 的性能造成影响,但这是没办法
5 c0 p3 k% d  ]4 `" K$ E的事情,也是 DRAM 相对于 SRAM (静态内存,无需刷新仍能保留数据)取得 成本优势的同
. o7 g2 A3 [: y时所付出的代价。7 g- b' ^; S0 w( A" u, k
自我刷新:主要用于休眠模式低功耗状态下的数据保存,在发出自动刷新命令时,将CKE置于无效状态(低电平),就进入了自我刷新模式,此时不再依靠系统时钟工作,而是根据内部的时钟进行刷新操作。在自我刷新期间除了CKE 之外的所有外部信号都是无效的(无需外部提供刷新指令),只有重新使 CKE 有效(高电平)才能退出自刷新模式并进入正常操作状态。
$ z: I; s+ E0 n) F" q! Q( K8 d4 A" [& X' S" {
设置模式寄存器命令# h( L& E+ O/ P% Q- u1 z
Mode Register Set,设置模式寄存器命令。SDRAM芯片内部有一个逻辑控制单元,控制单元的相关参数由模式寄存器提供,我们通过设置模式寄存器命令,来完成对模式寄存器的设置,这个命令在每次对SDRAM进行初始化的时候,都需要用到。8 y; \% v, P$ E2 x. U$ @" G

1 m7 t! e/ H# j1 L7 Y3 g, C, d  d# z
9b14ac69923344648bdcd7cb20f3941e.png

9 s& o; v  I3 k: m% `
( G( F9 u' Z4 B: P9 o/ wBurst Length突发长度模式(简称 BL ),通过 A0~A2 设置, 是指在同一行中相邻的存储单元连 续进行数据传输的方式,连续传输所涉及到存储单元(列)的数量就是突发长度。
8 Y& P. Y7 n6 a% E- ?5 o. E前面我们说的读写操作,都是一次对一个存储单元进行寻址,如果要连续读 写就还要对当前存储单元的下一个单元进行寻址,也就是要不断的发送列地址与读 写命令(行地址不变,所以不用再对行寻址)。虽然由于读 写延迟相同可以让数据的传输在 I/O 端是连续的,但它占用了大量的内存控制资源,在数据进行连续传输时无法输入新的命令,效率很低 。( ?( l: L. ^" w; U  C
为此,人们开发了突发传输技术,只要指定起始列地址与突发长度,内存就会依次地自动对后面相应数量的存储单元进行读 写操作而不再需要控制器连续地提供列地址。 这样,除了第一个数据的传输需要若干个周期外,其后每个数据只需一个周期的即可获得。
; ~: z$ C5 H- C4 u  ]: U  B非突发连续读取模式:不采用突发传输而是依次单独寻址,此时可等效于BL=1 。虽然可以让数据是连续的传输,但每次都要发送列地址与命令信息,控制资源占用极大。
& {; l6 [# S1 T4 }  N, A( m0 u% P突发连续读取模式:只要指定起始列地址与突发长度,寻址与数据的读取自动进行,而只要控制好两段突发读取命令的间隔周期(与 BL 相同)即可做到连续的突发传输。 至于 BL 的数值,也是不能随便设或在数据进行传输前临时决定,而是在初始化的时候,通过模式 寄存器设置命令,进行设置。
/ U6 q- i0 }! q目前可用的选项是 1 、 2 、 4 、 8 、全页( Full Page ),常见的设定是 4 和 8 。 若传输长度小于突发长度,则需要发送 Burst Stop(停止突发)命令,结束突发传输。$ g; g( k- O6 J6 l- }: T1 M( w
Addressing Mode,突发访问的地址模式,通过 A3 设置,可以设置为: Sequential (顺序
! h, @  H8 f& A) U1 ]或 Interleave (交错)。顺序方式,地址连续访问,而交错模式则地址是乱序的,一般选择连续模式。# H1 O* B  f! e& L
CAS Latency列地址选通延迟(简称 CL )。在读命令(同时发送列地址)发送完之后需要等待几个时钟周期, DQ 数据线上的数据,才会有效,这个延迟时间,就叫 CL ,一般设置为 2/3 个时钟周期。% {% C3 T" X5 O7 w4 n4 u. ^( M, |. `
特别注意:列地址选通延迟(CL ),仅在读命令的时候有效果,在写命令的时候,并不需要这个延迟。: x! T$ C  i' a- e' t
Write Mode即写模式,用于设置单次写的模式,可以选择突发写入或者单次写入。$ F5 @" \, D9 Z; y+ v3 r2 v/ i& m' D
2 {" E7 U1 i' z
初始化- z" }& r% w2 {+ i
初始化分为五个步骤, ~# k0 ]( [8 T! h
1.上电
% D, o: u  w- o3 \) @/ b& m给SDRAM供电,是能CLK,并发送NOP(No Operation命令),上电后至少要等待200us,再发送其他命令。
, K1 h9 L1 G; A2.发送预充电命令
# V4 Q: C& |" b7 \发送预充电命令,给所用BANK预充电. o1 Z1 D, a  g* Q( o! a
3.发送自动刷新命令' C9 Y) p" ^$ O4 _/ R
至少要放松8次自动刷新命令,每一次自动刷新命令之间的时间间隔为tRC
6 D* }1 t/ g2 D! W  L5 `& |& J! Z4.设置寄存器模式
) N& B) f: f/ S发送模式寄存器的值,配置SDRAM的工作参数,配置完成后,需要等待tMRD(也叫tRSC),使模式寄存器的配置生效,才能发送其他命令
7 w$ w3 P# j$ ~1 d) I5.完成
& ?! J( H% K  Y! M经过前面四个步骤,SDRAM的初始化就完成了,接下来就可以发送激活命令和读写命令进行数据的读写了。
# ?0 h% D/ R9 |+ d% s5 d+ p+ q
) @- ]3 O) l4 Y% o1 _8 P6 S" q写操作8 D  z; R6 O' T3 h# v0 m
1.发送激活命令
) Z; E: F1 T% w- j: K此命令同时设置行地址和BANK地址,发送该命令后,需要等待tRCD时间,才可以发送写命令- V% J8 R, C* f9 r
2.发送写命令, r6 G; u/ S9 P0 P( g+ e
在发送完激活命令,并等待tRCD后,发送写命令,该命令同时设置列地址,完成对SDRAM的寻址。同时,将数据通过DQ数据线,存入SDRAM* z) Y. X1 H: p( O0 [' H
3.使能自动预充电; K; A( m/ l" L
在发送写命令的同时,拉高A10地址线,使能自动预充电,以提高读写效率
$ J# U/ g4 s3 F! J/ L( I# Z. A4.执行预充电
2 r; B7 ]% x: D" d$ g预充电在发送激活命令的tRAS时间后启动,并且需要等待tRP时间
1 b; h4 ]2 M6 W7 q% y5.完成一次数据写入
$ O2 Q0 E: `0 Y- r至此完成了一次数据写入操作,发送第二个激活命令,启动下一次数据传输。, z" A" a; A/ v- E( n; z6 Z

) T7 h; C, `1 w+ I1 x读操作
! ]$ t9 |2 m5 y$ r$ y2 G
1.发送激活命令* N. a. f* `0 t
此命令同时设置行地址和BANK地址,发送该命令后,需要等待tRCD时间,才可以发送写命令  k; D  n8 ]$ @: m
2.发送读命令7 F* A+ m+ ~# p* B
在发送完激活命令,并等待tRCD 后,发送读命令,该命令同时设置列地址,完成对 SDRAM的寻址。读操作还有一个 CL 延迟( CAS Latency ),所以需要等待给定的 CL 延迟( 2 个或 3 个CLK )后,再从 DQ 数据线上读取数据。
! D' }& t+ q7 }) c/ N3.使能自动预充电
  M' Z- M" {3 ^4 U! F/ z在发送写命令的同时,拉高A10地址线,使能自动预充电,以提高读写效率
8 H2 t- ~% Q0 N7 \; m3 z9 T4.执行预充电2 q; R. p, ~7 C
预充电在发送激活命令的tRAS时间后启动,并且需要等待tRP时间来完成, O& Z% E+ H0 {0 _% t! n9 q/ X
5.完成一次数据写入4 t8 R- j% M1 `, @# S6 E
至此完成了一次数据写入操作,发送第二个激活命令,启动下一次数据传输。$ n& R7 Z! `  j

0 I( N2 [! }: r4 jFMC接口驱动SDRAM3 D+ n" h' E2 e7 c- u. T( [7 z
SDRAM相关寄存器9 g* G, L1 R' f/ T7 g
控制寄存器FMC_SDCR1/FMC_SDCR2
& {3 o& x, ?( B9 Y& }! M
0 g9 k, V( Y6 a* Z; f
2f93559309a3463499ec9ecd56db248d.png
( T9 b' a* U$ D8 V9 ~# E
2 e, B" M% r  A! c, Z
该寄存器只有低15 位有效,且都需要进行配置:
% d) G( r, Y# m  W" s$ \% Q, ^( m( b, Y+ l
L%[JX5MR7D@@QTFPC[0BKJ6.png

- ]+ n$ I. O5 M; x! A7 k! g2 J2 n+ s7 ?* ?8 c2 a9 I
的时序寄存器FMC_SDTR1/FMC_SDTR2
) Y% ^8 `& m' M% |! I该寄存器用于控制SDRAM的时序
4 z$ h2 I* D0 q- ?
5 U& z" N/ `! d. y+ m) \; P* N
cd1d697b6a32458993b938168cd870a3.png

7 q6 n6 c! Z: Y. D5 a0 n; S. A3 g- ]1 b! _+ H; u4 N) `
XYHBJW[%TZ5%Q3L)4I02N13.png

, ~3 E  z4 s' S! ^6 f- W) r6 f0 s- t: z* H9 i  N; [5 |; k1 q

- Q( V" q( j6 w+ E的命令模式寄存器 FMC_SDCMR

" q" M0 M1 y8 {7 h- B# b, J% k/ x% k' \; H0 B* U7 S
90a0a2662f4d43339e26cfbed3d6168e.png

- {  k; {8 n$ ~6 I% V7 }+ r9 b( s; T! u( ]
YTM_}GBLAQHF8[STBL(VBQS.png
9 I! v! {" P' k8 f. j( j

1 t, {$ V' W. e. E. K( }# y' U) M8 b9 f3 m
刷新定时器寄存器: FMC_SDRTR

3 j4 }. M" f7 H8 T2 r8 e以W9825G6KH 为例, W9825G6KH 的刷新周期为 64ms ,行数为 8192行,所以刷新速率为:' P! b2 x2 |: d( e
刷新速率=64ms/8192=7.81us
" ]2 F' y: s" ~3 L) H5 P. A% Z而SDRAM 时钟频率 =216Mhz/2=108Mhz 9.26ns ,+ ~# ]3 @2 k8 X% u# E: ^2 m
所以 COUNT 的值为:
$ ?9 p4 D: D  a2 LCOUNT=7.81us/9.26ns=844
) r7 M$ c5 Y* R' S, RSDRAM 在接受读请求后,出现内部刷新请求,则必须将刷新速率增加 20 个 SDRAM时钟周期,以获得充足的余量,所以,实际设计的 COUNT 值应该是: COUNT 20=824 。所以设置 FMC_SDRTR 的 COUNT=824 ,就可以完成对该寄存器的配置。# X" C$ }* n; t! L( l
6 d9 `0 L5 {7 V
5fdd6f505fa6422cb0276d54268b2acb.png
! `& O; [( C: b& L) Q: m

! S. ^% \+ f0 J( r6 C附录* F, u- G9 R! e$ Q3 z
交代
0 t2 a; K# _6 K6 i/ R上文中的tRC 、 tMRD 和 tRSC 见 SDRAM 的芯片数据手册。
1 q* H1 [+ }( s& t: U3 r! q  u. {3 B! U8 |# ]6 }3 X( [
声明
/ G6 \' i5 E+ \  h1 q本文大部分参考于正点原子
& p9 {+ I2 J( K$ K8 g/ [
6 _/ I2 i4 s: E* J, O! }
/ ~* [/ J( y0 ^' F+ |. y; R3 ]# ]
3 F6 B6 I7 X$ {: t
收藏 评论0 发布时间:2021-12-11 12:00

举报

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