A3 |
0x0003 |
B7 |
|
|
B6 |
A2 |
0x0002 |
B5 |
|
|
B4 |
A1 |
0x0001 |
B3 |
|
|
B2 |
A0 |
0x0000 |
B1 |
|
|
B0 |
本想早点睡觉,却遇到一个很久以前看过的问题,因为当初没有深入了解更多,现在花点时间整理一下。
ARM 外接 16BIT外部存储器时,采用A[21..1]接存储器的A[20..0]。分析原因如下:
An--------------------------An-1
. .
. .
A7--------------------------A6
A6--------------------------A5
A5--------------------------A4
A4--------------------------A3
A3--------------------------A2
A2--------------------------A1
A1--------------------------A0
A0 接地
对于16位的存储器是这样的,ADDR每加1,就指向下两个字节。而在ARM中,如果配置外部存储器是16位,则
发送的地址A0无效,比如0x00fffff,相当于0x00ffffe,如果跟存储器的连接是一一对应的花,只能访问
存储器的偶地址空间(因为A0始终无效,为0为1没试过),采用如上接法就行了。访问存储器时,因为存储器
是16位,所以地址增量是2,即ADDR = ADDR + 2;我的程序中设 pB0SIZE = sizeof(U16)。这样每次访
问送出一个地址,就能读出两个字节,然后地址增加2,在读取……。
比如要开辟1024字节的空间,寻址范围是10位,00,0000,0000-11,1111,1111,如果采用一一对应的
方法,那么存储器的奇地址空间就没有被使用;如果采用错位的接法,实际上仅仅使用ARM地址线的A[9..1],
即使用的是上述范围中的偶地址,9根地址线寻址范围只有512,但是因为存储器是16位的双字节,
实际上寻址为1024字节。即ARM的偶地址寻址存储器的字地址。
我们可以这样认为:16位存储器的设计者将低位A[0]省掉了,我们只要读取一次就可以得到两个字节,读取的
这个地址对应于ARM发出的地址的A[21..1],即实际上是存储器需要的偶地址(偶地址是针对ARM发出的地址
而言的)。
如果想寻址存储器的0X5555,那么实际寻得的是0X2AAA,这种情况,必需把0X5555左移1位送送出。
阅读(2221) | 评论(0) | 转发(0) |