|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
: W/ b; A, Q$ o' ^2 A3 u0 |& r9 N/ O ]' I% W
一、硬件参数
2 W( T0 s8 s: ]' O+ w* S& h" ? W$ U/ F e' k, A) L5 o5 S
1、CPU:s3c44b0x
6 V7 X/ M+ l7 h) b
7 ~) H Q0 k- W& R- K/ I4 o字长32位;以字节为单位编址;数据处理支持三种数据类型:字节(8位)、半字(16位)、字(32位);存储方式有大小端之分;25根地址线。
/ ?# \! @* @6 H- \# A3 W" g
" d) O& f. B' B6 W$ _7 K
8 R. K B" Z. Y) C4 {" ?/ h" i% r: J
6 A6 _* H* P6 l- H6 n
2、存储器
" l5 ^4 K6 b3 H- g; l& ~7 t, u
3 E8 a; u: F7 Z/ q* W I. s& B2 b( ZⅠ Flash ROM: SST39VF1601' U) z6 s7 `6 n( Z4 u
* ]6 @6 l7 A/ I) }
数据位宽为16位(16根数据线);20根地址线;2M(1M*16bit)。; D/ O5 y) ?9 x* @& X! _- R
4 k4 J2 [0 O0 `; k& ^6 i" o
+ Q$ [- }, U9 L7 [% P
6 k$ R J+ Z Q; {9 Q3 e& {, hⅡ SDRAM: HY57V641620HG
, i" @( c O7 ?! e% S
1 A. m. z% O: `. \5 p9 X) l数据位宽为16位(16根数据线);12根地址线(行地址选择线有12根,列地址选择线有8根(12根的低8根)),2根bank选择线,总共有22根有效地址线;8M(4bank*1M*16bit)。7 l) l8 W- T4 M3 \4 o9 k. m
7 F. |/ E" r. D; f- X9 @% L1 g9 m& y! y; P5 \
7 h! s- g8 B& L7 j$ q
% q# n; j% I0 a- G- M- l* f: {* |
1 ?( ~ ?" _( H) V5 l! V
3、$ z3 P7 Q6 F& D( y) Z# i
; w3 I: u0 n3 k! fCPU编址:以字节(8bit)为单位 M8 S% p. y1 J
2 m' s8 ^; H( Q( P0 M |6 E0 y# i存储器编址:以其位宽为单位,也就是说每个存储器地址下的数据位数为位宽。如6 `3 g$ a$ M1 z4 d5 Q3 G4 j- ?. G
2 y0 l+ w% _. V- M" |" q8K*12bit的存储器中的12就是存储器的位宽,指每个存储器地址下数据的位数。" l4 w% G: h! Q9 z' f+ K3 u
$ M5 n+ F( j" _这个12与地址线的多少无关,8K就是指有8K个不同的地址8K=8*1024=2^? 2的多少次方等于8*1024就有多少根地址线,8=2^3, 1024=2^10, 那么8K=2^13 ,存储器地址线就为13根。1 S6 F' b; n) T3 Z
) Y/ [9 l+ @5 @) s, R- a, u
/ U- c* f3 i0 g. f" [! {+ ], t% a1 c0 `( r9 j' G
2 t$ H0 d$ b4 F: H
+ D# w2 n& s1 h% l/ S
: [' J5 R, O y1 ?+ v m( k* d( v& [8 v# h, v5 E# q
二、存储器容量、位宽及其地址线根数三者之间的关系
, p, J3 ^; `$ `( N; @& Q T+ a& T" g, a. u0 ?
1、存储容量计量单位的换算6 D a2 w- g9 Z6 |& N; t; L
" |* ]" [' z6 O/ ?! t9 B1 `1M(MB,mbyte)=2^10K(KB,kbyte)=2^20B(byte);
( W, `" |4 g6 s }$ _( l; B8 a# R
4 Q# O3 s h2 F. ?3 ?* `1Mb(Mbit)=2^10Kb(kbit)=2^20b(bit);
) G/ P$ G) \2 t5 B+ o6 {( d9 J+ y x" c- [
1字(Word)=2半字(half word)=4字节(B,byte)=4×8位(b,bit)。
# | r" P t* \6 K# b
4 ~# X* _! ^5 k- F, M9 ]# p8 }6 F5 l T
; l% e; E5 f9 [
0 ]5 l2 ?5 ?% K( [) L4 ?, W+ j+ E! P% m( G) W
2、关系的确立0 j/ ?( X6 u5 l' Q* u* D. {' k/ q
" [( z+ E/ e: c5 s2 n/ W: G以上面的SST39VF1601为例,
0 l1 L: w `3 ]1 L1 r
6 |: Z* P1 |' V" d存储容量2M=16Mbit=16*2^20bit,
/ r4 n& D$ ]! J3 X7 H
5 a/ S$ a9 k- x0 m0 `. o地址线寻址范围:2^20*16bit(地址线根数20,位宽16)。) E& ]4 o* ]2 K/ e/ ^8 p
2 |2 o4 q0 K0 d7 Y2 q
3 e7 r7 ?& U6 {" c# R1 x8 e/ ^" t0 i" S
s! A0 }5 U' g$ F2 V
+ S& {/ h/ N' |2 e, S8 \7 c以上面的HY57V641620HG为例,
$ x4 a% |( x1 z7 g
% z% H) t5 k1 x! e存储容量8M=8*8Mbit=64*2^20bit,- ?% j& I8 c$ {5 |1 Z8 ?
9 s1 @* p/ [4 q5 L5 D地址线寻址范围:2^22*16bit=64*2^20bit(地址线根数22,位宽16)。
: E' m. r H1 b9 \( A
* Q2 v5 v2 f* d* B; [# N5 i* _& r s
6 A) Q {3 F) U) U+ D. N9 {4 A) u* Z
5 h: g0 f* m* ]" H6 f9 D总结:
( A! h2 v4 f2 S; M; j* h$ q) c! b5 H1 l! r
存储器位宽表示每个地址下有多少位数据,与它的数据线根数相等;! {2 n( d9 `4 b! k
/ P' |' F8 k8 f- q/ O
存储器的地址线根数(N)决定了它的地址编号范围(2^N);: e; S9 H- i( p# i1 ~) G) p
* M3 [6 M7 t0 M& a2 z
存储器的位宽与它的地址线根数是没有联系的;+ c6 Q1 V( \ v# ~
6 i. X& a! u% c' d4 D2 Z2 t G+ Z5 U
而存储器容量是位宽与2^N的乘积,此处单位为bit。4 l4 K, c, ]4 {! A& j8 N
, t9 b- f% D. i8 I; Z) ~5 I
. g' ~; F5 p& l) I2 I
) A6 o2 U7 F2 p. t6 K6 X' ]
/ _" j" L! _! m* y. y' ^, V; e
6 K) K5 H4 y' y' ~) _0 [6 ]" ]6 g4 h+ h( K0 A4 E4 p6 R
+ y T' |% ~) D3 h% h+ D6 E6 o
三、CPU的寻址
9 c% h4 r) R: z, g4 k
7 }: f. Q" c3 N$ j w; H, g4 B( SCPU编址:每个cpu地址编码中存放一个8位数据; G* K8 I' o, {, c& t
& `" i- `+ [- G4 d+ t+ WCPU的字长为N: f$ g8 v+ Y5 e3 E% s
# |) J: e: i8 W2 r$ X h. u7 T
最大寻址范围为2^N
7 {- A6 l/ {; i/ A0 e9 }" |9 o x& P* \
; p# n, o8 A P6 R. \2 e4 e
% U2 l6 j+ ~9 t. y
$ f9 T4 b/ B, F$ U% Z
/ R3 j9 p; \( V+ }, f' K: H
四、存储器位宽与CPU和存储器地址线连接方式之间的联系/ o+ p3 ~% a& {7 i% E- A
! W% Z1 L/ H' Y
1、详情可参见文章《外设位宽为8、16、32时,CPU与外设之间地址线的连接方法》。
9 {2 R0 L1 Q. ]* X4 W+ k5 K$ U& q" ]! w1 h n4 ]: n; s+ S
CPU地址编号(每个地址存放8位数据)
1 q, p2 e0 V1 Z; Q" G; b4 N$ q! h5 ~, A: K @4 p' A
存储器地址编号(每个地址存放16位数据)
7 d- m/ y' ?2 Y* t6 a9 k; f
6 u a; f, H7 c5 L3 I, t& d00000(8位数据)
! _4 M" s8 O+ C1 E# G
' J/ u9 q+ ^7 L! @. ^- h00001(8位数据), S! m$ {8 |& E5 }* G; u# A
( J8 f3 N( ?) h
00000(16位数据)
6 ]: D0 p8 ?* E$ i. ^0 T0 O3 w3 I5 B* G2 _% t
00010. c* M4 {: F3 o2 @. G. t+ A0 w
$ J# c) [4 h- Q3 T/ B3 S1 P5 F
00011: S7 _: e8 {9 p: I! I1 J# Y. g" w. Z
# F) I; f' S) q$ L000017 [8 |0 c1 U2 b ^1 H2 O
! r0 H$ q% w& P/ F2 y9 W
00100
" D5 R. v) Q `" d% {
0 S- W/ ]4 l* c' e001015 _3 l8 V0 q) o4 [
, ]4 t `1 |% A8 w
000109 ]6 K$ X5 Q: P* x3 p9 _6 I+ P/ w- z
+ u2 h8 L$ I) U& f, W$ O00110
0 f. I( y4 v% E" e( ?7 A1 _5 }+ y/ i7 Y P1 I
00111
+ E1 A' E( l4 c( Z& l
( N8 R& l0 C2 O* ~- I% k c& o% p00011
6 w4 n+ Q0 V) P5 M1 Z) r& w1 t
' i! M6 F y- s# C$ D- l010008 u2 C% E% C6 R/ K+ [& G+ a9 ]5 | O( V
9 m) b4 [# d+ W7 K G5 t01001+ G. |) L# w- z3 s9 V6 S3 r& M. z
3 G( r- _" n Z00100
1 }% ^7 {0 X; j" R3 W0 X1 p: C
0 p7 }) D( ^: k2 v, u1 U6 s/ X上表是CPU地址与存储器地址对应关系。
& V3 B. g% r5 t% |7 b* }# A! S" a' Y+ M/ m( h0 Y9 }6 ]
2、此步是在硬件层面实现的,软件层面不必再做考虑。
" b& f' l4 E* q5 [, x' k$ P
5 a5 h, @. {7 c1 x
& Y- `) {1 x; d! n
/ c" o5 x& _$ R+ W5 X" ^# d8 q+ o3 e% ^" F9 q
% M |5 b7 E4 z6 J
2 u+ Q0 P/ f, S8 P; Y7 q7 h) a9 L z& i% n* h1 ^2 q
五、数据类型及其在内存中的存储形式
2 q" m- _+ S3 {, u3 P8 O$ J9 l
/ Q3 P+ q# ] o" f6 k; ~/ l1、整型数据
) ^: |0 _& Z* y* O
7 H1 `0 f+ z- \+ x' J- x. i类型" k8 @* C. B* G+ `3 a% q
4 c, [/ q( ~! l' T8 o- S符号表示
; A" u+ c. @6 V) S# P4 B% |' ^6 r+ i. [1 [+ b3 u- t% C3 p
内存中占用的位数0 n8 a' V) s$ Z3 w) D5 f
7 v! Y" ~+ ]& V- e数值范围
7 t- J; f# i, h2 A0 j+ j8 J3 D
# `; k3 _7 T3 h' o5 ]& y+ m/ v无符号 基本整型
$ u& C& m6 [( { }. Z! I. `( o/ K8 M, y) q( I# C. I) ?& _
unsigned [int]
& E9 r& H9 _$ y8 f' S* l( o; e/ \2 R! U3 M, m
16(2字节)# T5 w5 R( t% w6 j7 Q' n$ j
- b, W% ?1 V# N @3 h7 M/ g0 S
-2^15 – (2^15-1) z+ ^0 z$ {7 l. ?# l
( K0 _! x: y& \4 m) g0 D* q
有符号 基本整型- \! s5 t) @0 X: x3 Q' x
; \% z. q9 B: |5 d2 O4 o& V' Q
[signed] int
! V% Q$ c8 b- Y$ s% t+ @" H( d' X6 z* i5 N+ p
16(2字节)7 d7 d) v( [8 [7 U& j& |- }
3 v1 J( i1 J" s6 n0 – (2^16-1)% N+ t4 A) I0 W
2 \8 `7 a$ r; M9 G% u, g
无符号 短整型
3 w; e$ k' a3 w2 B/ R. M( ^6 E9 w- y# w
unsigned short [int]( ?& k. Z# u7 H) ^* \9 p
. d6 {& k# E. _& p0 }! b p3 w
16(2字节). D4 O9 \8 J& o5 @4 y9 R2 k; B4 I
3 R; ?# f( i, }# L- ?8 ~-2^15 – (2^15-1)
4 n/ d6 m; J1 b' _; f! U$ I
7 d1 h% [& R! x有符号 短整型
" Q& N# k/ A' P6 v2 B) ^+ x u+ m& C$ D- C. T7 D4 S
[signed] short [int]9 ]- \. ^) Z: y6 j" I. g- k& ?/ ~
J" b" x. x) b+ B9 `
16(2字节): Y8 X+ t$ s/ T# R7 Y
3 T9 a9 ]4 }. D* H e3 V0 – (2^16-1)
9 X* r+ `# z0 {* _. H: @
6 {$ D8 Z _/ |无符号 长整型5 J# Q7 E! m+ s; L: |* w( a
1 `8 @+ I* f) V0 K% U
unsigned long [int]6 L7 f0 ]* I' `* M
8 }, d/ M% C8 N d" n* @
32(4字节)
* s& q0 z0 W1 E( z- \% Q
. j" M; q; C8 F-2^31 – (2^31-1)
0 W: y4 w, w' X3 ^8 A) o
1 c1 H% E) q n% `$ x3 I; m有符号 长整型& z! z: D G4 S3 V! o! S
' G3 e. R5 Y% B6 b5 F( ~[signed] long [int]
# w7 r2 a* Z ^1 \3 M: `) x7 O0 A9 t- F1 {6 V3 @8 h
32(4字节)8 o4 v& N8 _2 U2 j" U e
. v2 t3 ?9 b$ ]* C0 T( A: M7 t
0 – (2^32-1)' m0 m! _" Z9 Y' q
) a7 ?0 M J( @注:有符号整型数据的最高位为符号位。[]内的是可要可不要的
1 g9 X' m8 X# z6 J* C! f& c
6 ?$ Y: \4 L- `3 [7 q! I7 x7 P: Q) T/ v- i- s+ ]4 J
. n3 X3 Z/ a" ^/ [) y
2、实型数据
' _3 p Y6 A, q* f" E9 e4 z. m. Q d9 T+ [& M) d
类型
1 c1 V; H( b3 j2 Y1 T" O* M
% m1 J/ u! T3 w/ f! m符号表示
+ R% p" t; f4 X: F
% s' I7 Q1 m) f, N$ \# f内存中占用位数) K0 F7 L8 g/ y. D& m2 L5 E, m
6 w3 y/ ~* A( f2 _" w) F有效位数
; E. A; ~& o8 K
+ u5 g3 ]1 D2 c0 R+ j0 q& Q4 o0 |数值范围: H/ F' `5 S! C. f- g
; O& M% z" Z- f z
单精度型
; }( o8 E2 r+ s ]$ c% _' |3 s3 C* w- X k9 \$ R
float
5 J8 j- C6 z/ A; _
3 r2 _8 T: F+ x2 c32(4字节)0 Y& @. h% g1 i
. \; @+ X" ^/ ~) c8 ]6-7' Q9 _7 T2 F7 w; E( {
, f2 i3 I. p9 p5 m. n- o-3.4*10^(-38)-3.4*10^382 ~" U4 _' k5 i* f% H1 d
5 G6 `: C2 z. t
双精度型
: k, Q& L* J8 Y+ g+ G) p6 X2 C' f2 O( s+ u7 ?! [8 u% U- J3 I
double% l; N) e; V- H) S; J0 G* z5 i5 B |
- V1 S; }! M- e# w' c- i' @
64(8字节); U! o6 z' z+ {& N
0 x) R9 ?8 D( N4 m& L
15-161 F0 v* d: z" r( d
8 G4 d% b/ u' U
-1.7*10^(-308)-1.7*10^308" N8 U* j6 U+ S F0 @' M
# R6 M; c2 y) B( Q: h% F5 t
长双精度型
) N6 f% [8 ?3 k3 X7 h: o6 K3 T( B) i2 o1 _ \. P, }
long double/ ?. [" J N/ d
5 a' l( u8 u6 |6 S* |& y& h64(8字节)
, E: ~+ W& J, Q/ B4 W: U/ y4 U0 u) S* a
18-19! J2 r. Q* ?+ n) H+ l
8 _. }' m2 d- `! Q y
-1.2*10^(-4932)-1.2*10^49328 c5 Z' @# I3 H. a; Z& I# u
# c% V5 X$ z$ C; M
3、字符型数据- F% n6 m# e! Z4 e
1 b5 Y3 g# a' i3 E类型
. S Y, E8 R/ `9 h
2 ]3 V6 y0 d5 K0 O符号表示
3 O2 ]* D8 Q* l$ T- ~' [8 l- f# z5 w, J
内存中占用位数0 T$ R5 W" h/ i$ |# V1 S
4 S0 ~+ `" ]9 V; _数值范围1 N2 y+ B2 K4 U( a
7 C$ C3 j/ ?* d无符号字符型2 _8 p* l/ U, B! ?
$ j( V4 R+ U+ p9 W0 s
unsigned char
+ l- S O# s' m2 h) V8 T( R4 D/ x) Q# q ~. T/ e8 f+ o! b
8(1字节)) ~' p" M0 S6 x. Q( c/ ^
& e; r1 D' I N1 q$ t0 h1 Y. a0 w
0 - 2558 z/ X' u n/ h; V' Z; n4 G9 T# y
& G. _. o) h: d3 @- \有符号字符型
! m0 N! s# J* B3 M8 C/ {- Z5 M% `% A9 a5 l1 u6 P
signed char
; o& g- v; m# {) v5 `& E% |% t( p% T3 J& J. ]
8(1字节)8 M- }2 C1 t5 W( W
7 @6 N" g+ G4 K-128 - 127
+ h9 B/ U$ M! d6 d4 L3 q( o! `
% t; b- Q" ]( h5 O, \6 `注:字符型数据和整型数据是通用的,但是应注意字符型数据只占用一个字节,它只能存放0 – 255范围内的整型数据。
; V$ J C! a6 G; G* t
8 R5 f E0 A( q2 Q) x
% B n, i: l( M, q$ i4 f& `) |/ J) I3 ~: Y$ o" ~
六、底层编程实现CPU对存储器进行不同类型数据的读写操作. _( u/ z& s$ s$ ~5 a) @) x
9 i+ M' F7 A- l# V7 m) {
8 X( P* @. n1 o+ P: W
' S$ [" j b* {, N: S! `#define INT32U unsigned int // 16位无符号基本整型
, c) i% y8 [' v7 y( A: X1 c% A. O, I5 U& A$ z4 D9 Y2 A! b7 k
#define INT16U unsigned short //16位无符号短整型
1 h- O) [7 y, h$ U1 `0 a; _, {
% r2 U3 Q" R7 U#define S32 int // 16位有符号基本整型
+ y K$ Q3 j: w4 E8 W% Z& n& V' [# T% g$ p2 N3 ]0 s7 V
#define S16 short int // 16位无符号短整型
* H$ P9 s# Z& {! I" Z- ^, g& Z& t+ ?" m/ p1 E/ W# _; `
#define U8 unsigned char //8位无符号字符型0 K6 u% b0 K, v; h2 p
4 a3 L9 q+ J* b# B: s# T% V6 d
#define S8 char //8位有符号字符型,; j# w# ^* o3 y% |- H
H; ]$ Y+ k; \
; T* j7 ] d V
0 {2 H2 }1 z1 i, e1、接下来的这两个宏是对SST39VF1601 进行16位无符号短整型读写操作:
! ]; s4 ~1 B5 O
2 u% ]) \8 ?" T, b* W
5 D0 ~1 K! K! B7 y+ |+ c9 f2 ?, w( L* P/ R1 Y# T
#define Writeflash(addr,dat) *((volatile INT16U *)(addr<<1))=(INT16U)dat X) |7 i/ |% s! h5 H( K" o
+ S' @, Y6 X9 ]0 a' m#define Readflash(addr) (*((volatile INT16U *)(addr<<1)))1 m. L- _5 T& t! F
+ n0 n* s/ b: I; X5 a: F& P8 @! M6 @: q2 j7 v; h/ k' ^% H0 u0 n: C
6 @( S0 R$ K$ p0 y解析:
- y9 Z7 |6 Z4 m% C
9 k% q+ D+ S/ t X3 j7 Xaddr<<1的主要目的就是使cpu的地址编号变化能跟上每存储一个单元数据地址编号的变化的步伐。这里的addr是CPU的地址编号,与存储器的地址编号无关。
! p9 c: H: h- K1 \: q2 [
, A6 R: M2 } m' }6 o4 Q/ o: \第一个16位数据占据了CPU的两个地址编号00000和00001,因为CPU的每个地址编号只能存放8位的数据。第二个16位数据占据00010和00011两个CPU地址编号。; q. a7 Z( _5 d# c/ q, E
2 x# b1 X- A9 W4 |8 G% h! J* HCPU地址编号左移1位目的是同步每存储一个单元数据所引起的CPU地址编号变化和CPU地址编号实际的变化,使CPU地址编号跨越1个编号正常进入下一个16位数据。
0 p. s c$ ]. ]# Y% U" Q* G7 w8 J1 I. S" b- k4 E
若不左移1位,当addr是00001时将取出00001和00010这两个CPU地址编号处的16位数据,这与前面数据所占得CPU的地址编号是不一致的。3 V9 r: Q, k4 {' D3 o
$ I! Y8 F" w, ?! y' ?
. M+ H5 H9 p' ?! `
. t& T% ~3 z- L3 g6 n& j
7 N1 ?; W# v0 t1 H
/ _# O8 S9 l# N! O2、接下来这两个宏是对HY57V641620HG进行8位字符型数据的读写操作:$ a5 Y- `) ^4 I0 @- L' F/ j
, R V/ Z2 r7 b: U% u( d0 J
! }# \0 t7 ~# Z; G% p
/ {. g1 R5 ~( S5 B2 v) h#define WritESDram(address,data) *((volatile U8 *)(address))=(U8)data4 t0 P, d3 ]- |, ~# K5 A
! A$ H8 ]. F# }1 ]4 c2 E
#define ReadSdram(address) *((volatile U8 *)(address))0 `+ C ^7 }& A6 n& H! x) j
3 M0 S% f7 @0 r! A, V/ [ I6 R
3 R1 E, F3 M0 _0 S
& q5 Q" l2 J6 F3 a4 D/ z& Y3 ^解析:0 y U" O# Y% L
1 o1 c/ \9 \* u第一个8位数据占据了CPU地址编号00000, 第二个8位数据占据了CPU地址编号00001。因此这里每8位数据占据的地址编号只有一个,CPU地址编号就不必如前面读写操作对address左移1位以适应每存储一个单元数据地址编号变化的步伐。& W d: K8 h# W+ S- n- P
4 H! O K, P0 s" [0 N3 z
/ O" M) Y4 [3 n, C0 a+ x% i9 P: s# U6 B* t& e# B- G
3、总结:" W2 r+ K2 K) U# v, y! j4 w
4 U* ^: S& s% \这里的左移与存储器和CPU地址线的错开一位接法方式是没有联系的,千万不要将两者混淆了。前者是在软件层面上实现的,后者是在硬件层面地址自动实现转换的。左移操作的起因:CPU每个地址编号只能存放8位数据,而对存储器存取数据类型占用字节数超过一个字节(8位数据)。
$ z( c8 `' K( o2 b
- M" f3 R- u) p- e' h- W0 a. L8 e! Q$ j0 }
" }9 B$ @3 o- V3 z
关键字:存储器 位宽 C 9 G9 M# N9 {# A- g, c7 m+ [
+ V( F& K! F$ K2 t# v/ |0 ~) j |
|