关于AVR外部扩展RAM(包括 >64KB)的问题 点击:839 | 回复:0



通讯网

    
  • 精华:11帖
  • 求助:1帖
  • 帖子:431帖 | 10265回
  • 年度积分:0
  • 历史总积分:24711
  • 注册:2004年7月09日
发表于:2008-08-01 11:21:48
楼主
最近几天,发现很多人使用M128、M8515等带有外部并行扩展口的AVR芯片,设计外部扩展RAM的系统。估计这些人不是初次学习单片机,可能具备一些使用51设计系统的经验。需要注意的是,AVR不是51,另外AVR也还是8位的单片机,不能完全满足那些需要大量计算和复杂数据处理的应用。

一、正常方式外部扩展RAM
所有带有外部并行扩展口的AVR芯片,其数据存储器空间容量为64k(地址线16根),也就是说整个系统的可直接操作的数据空间为64K。但与51有区别的是,这64K的空间不是全部应用于外部扩展,因为AVR的32个寄存器、I/O寄存器和内部RAM已经占掉了一部分。所以实际上外部扩展RAM仅占60K左右(M128为例)。在我的《M128》一书的第5章中有对正常方式外部扩展RAM的设计和应用的详细介绍,请大家参考。

二、非正常方式外部扩展RAM
这里的非正常是指外部扩展大于64KRAM的应用,如128K、256K等。很明显,这样的扩展方案需要使用其它I/O线作为页选信号才能使用,本人在以前使用51的时候,也做过这样的系统。但对于使用AVR,则由于其内部占用了4K左右的地址,使得每页的RAM前端都实际是内部的RAM地址,所以整个RAM中间出现了“空洞”,所以在使用和处理上比51要复杂。
现在很多低端的32位ARM价格也比较便宜了,个人觉得这样的应用最好选择ARM。如果一定要使用AVR的话,以下几点需要认真的考虑。

1。硬件上地址锁存、译码电路当然是少不了,一定要使用HC系列的,因为AVR的速度比较快。
2。由于所有的C平台是不支持大于64K扩展的,它们只是把数组分配在64K空间内,因此数据定义非常重要。在实际使用中,应该将系统使用的其它各种变量定义在0页中,而把大型的数组定义在其它的页中,还要注意数组最大不能超过60K字节(对于M128,M256则不能超过56K)。
3。在变量定义的时候当然只能是按64K空间处理,在具体操作时用户需要做大量的转换处理,要精心设计,否则肯定会出现问题。

下面用一些简单的例子说明:
假定系统使用M128,需要2个48K字节的数组,那么64KRAM是不够的,扩展成128K,分成0、1页,用PD0控制。

定义变量:

char temp1;
char arr_temp【2048】;
.......

char temp2;
union arr{
char a0【49152】;
char a1【49152】;
} data;

说明:定义只能在64K空间。
temp1、arr_temp【2048】必须先定义,最后查看,应该定位在M128内部的4KRAM中。作为交换使用。
a0【】,a1【】为共同体,占用同一地址空间。但PD0=0是,操作a0【】,在0页;PD0=1时,操作a1【】,在1页。
只要变量定位在内部4K的RAM中,那么不管PD0是何值,都可以直接对其操作。!!!!

下面是对数据的典型操作方式:
1。如果只对a0【】操作,那么将PD0置0,一切采用正常操作。
2。从a1【】中读一个数据到temp2:

如果temp2定位在内部RAM:
PD0 = 1;
temp2 = data.a1【i】;

如果temp2定位在外部RAM,且在第0页(只能用户自己确定了)
PD0 = 1;
temp1 = data.a1【i】;
PD0 = 0;
temp2 = temp1; // temp1必须是定位在内部RAM中的变量

3。将a1【】数据导入到a0【】中:两者在不同的页,只能通过定位在内部RAM的arr_temp【】间接处理实现

for // 24次
{
PD0 = 1;
for
{
arr_temp【i】 = a1【i】; // 2048个
}

PD0 = 0;
for
{
a0【i】 = arr_temp【i】 // 2048个
}
}



热门招聘
相关主题

官方公众号

智造工程师