|
发表于 2007-11-13 12:03:48
|
显示全部楼层
《AVR单片机嵌入式系统原理与应用实践》刚出来,你可到书店看看,或在本站的邮购部购买。17章中有扩展RAM的介绍和电路。另外,这本书相信对你学AVR会有很大帮助的。
下面是根据M128数据手册中介绍的方法请参考:
2.3.4 外部扩展存储器全部空间的利用
由于在芯片内部占用了4352个RAM地址(32+64+160+4096),外部扩展存储器的寻址空间地址是从0X1100开始的(见图2.7)。在对0X0000-0X10FF范围的RAM地址空间操作时,实际是对芯片内部的SRAM或寄存器操作,而对相应的处在这段地址范围的外部扩展存储器没有影响。因此在实际应用中,可以把这段地址范围的外部扩展存储器“移”到RAM地址空间的高端,或通过程序简单的调整,而将外部扩展存储器全部空间充分利用。下面给出两个典型应用实例。
1.外部扩展32K SRAM
在外部扩展一片32K容量的SRAM芯片,此时不需要连接使用最高位地址线A15,可以将Portc口的PC7释放,作为通用I/O使用。尽管15根地址线的寻址范围为32K(0X0000-0X7FFF),但用户程序可以对0X8000-0X90FF寻址操作,此时实际是对外部存储器RAM芯片的0X0000-0X10FF操作(见图2.15)。即将外部RAM芯片的前4352个单元“移”到32K地址空间后面了,因此系统总的有效RAM地址为线形连续的36.25KB(32K+4352)。
2.外部扩展64K SRAM
外部扩展64K容量的SRAM芯片时,由于AVR寻址能力为64K,而且内部又占用4352个,因此外部的RAM只使用了高端的61184字节(0X1100-0XFFFF),低端的4352字节(0X0000-0X10FF)没有使用。但在必要时,可以通过在程序中做相应的处理,把外部存储器低4352个字节(0X0000-0X10FF)利用起来。
具体方法是通过设置寄存器XMCRB中的XMM1和XMM0,释放Portc的PC7:PC5三根高位地址线,将其作为I/O并输出为“0”,此时可以使用低13位的地址线(AD0:AD12),将外部存储器0X0000-0X10FF一段映射到RAM空间的0X2000-0X30FF使用(由于PC7:PC5已作为I/O使用,并输出为“0”,因此实际是对0X0000-0X10FF 进行读写操作)。这样,系统共有69887字节的RAM,其中0X0000-0XFFFF为常规64KB的连续线性空间,加上映射到0X2000-0X30FF空间的外部存储器低4352字节的RAM。以下是使用映射RAM的程序实例。
汇编代码:
;OFFSET 定义为影射空间起始地址0X2000
; 释放Port C高三位地址线
ldi r16, 0xFF
out DDRC, r16 ;Porc C 为输出
ldi r16, 0x00
out PORTC, r16 ;Port C输出为“0”
ldi r16, (1<<XMM1)|(1<<XMM0) ; 释放Port C高三位地址线
sts XMCRB, r16
; 将0xAA写入外部RAM的0x0000单元中,映射地址为0x2000
ldi r16, 0xAA
sts 0x0000+offset, r16
ldi r16, (0<<XMM1)|(0<<XMM0) ; 重新恢复Port C的高三位地址线
sts XMCRB, r16
; 将0x55写入外部RAM的0x2000单元中
ldi r16, 0x55
sts 0x0000+offset, r16
C语言代码:
#difine offset 0x2000
void XRAM_example(void)
{
unsigned char *p = (unsigned char *)(offset);
DDRC = 0xFF;
PORTC = 0x00;
XMCBR = (1<<XMM1)|(1<<XMM0);
*p = 0xAA;
XMCRB = 0x00;
*p = 0x55;
}
===================================================
另外,关于外扩大于64KRAM的讨论,我在专栏中有专门的介绍,只能采用分页方式,使用不方便。最好选择使用ARM。 |
|