打印

【原创】AVR单片机外部RAM访问

[复制链接]
3008|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
原野之狼|  楼主 | 2008-9-17 09:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AVR单片机外部RAM访问
作者:原野之狼 Email:hugui_bj@163.com 日期:2008-9-17
最近的一个项目中,体会了一下AVR单片机的外部RAM扩展,发文记录于此。
本文以ATMEGA64单片机为测试平台,外扩74HC573(资料上讲用AHC系列,但是我用HC系列在16M晶振下配置成最快速度访问并没有发现什么不妥,当然这是个不严谨的设计)以及62256芯片。
我采用的是GCC编译器,并且在项目中采用C++来编写程序,根据理论上来讲,只要外部存储器使能了并且配置完成,那么变量的地址分配完全可以交给编译器来做,但是前提是存储器使能及配置代码要在上电复位后最先得到执行,而采用C或者C++来编写程序,上电复位之后最先得到执行的代码是由编译器自动增加的启动代码以及构造函数代码。我不清楚如何让存储器使能及配置代码在上电复位后最先得到执行,所以就写了下面一段宏来控制外部存储器的访问。
代码如下:
//extern_ram.h
#ifndef _H_EXTERN_RAM_H_
#define _H_EXTERN_RAM_H_
#include "type.h"
#define DEF_EX_VAR(name) EX_VAR name;
#define INIT_EX_VAR(name,ele_size,ele_n) do{
name.size_ele=ele_size;
name.n_ele=ele_n;
name.addr=p;
p+=((ele_size)*(ele_n));
}while(0)
#define WR_EX_VAR(name,pos,pdat) do {
for(UINT8 iiiii=0;iiiii<name.size_ele;iiiii++)
 (name.addr+(pos)*name.size_ele)[iiiii]=*((INT8 *)pdat+iiiii);
} while(0)

#define RD_EX_VAR(name,pos,pdat) do {
for(UINT8 iiiii=0;iiiii<name.size_ele;iiiii++)
*((INT8 *)pdat+iiiii)=((INT8 *)(name.addr+(pos)*name.size_ele))[iiiii];
} while(0);
#define GET_P_EX_VAR(name,pos) (name.addr+(pos)*name.size_ele)
typedef struct _tag_ex_var
{
 UINT8 size_ele;
 UINT16 n_ele;
 INT8 *addr;
} EX_VAR;
#endif
应用示例
//main.cpp
#include "includes.h"
INT8 *p=(INT8*)0x3100;//外部RAM的地址从0X3100开始
DEF_EX_VAR(test);//定义一个外部变量
INT16 main(void)
{
UINT8 i;
INT16 tmp;
    INT16 *p_ele;
    MCUCR|=0X80;//使能XRAM,并配制成最快速度访问
    INIT_EX_VAR(test,sizeof(INT16),100);//外部变量初始化,该变量有100个元素,元素大小为sizeof(INT16)
    tmp=0xaaaa;
    for(i=0;i<100;i++)
    {    
        WR_EX_VAR(test,i,&tmp);//写示例,对变量test的所有元素都赋值为0Xaaaa
    }
    for(i=0;i<100;i++)
    {    
        RD_EX_VAR(test,i,&tmp);//读示例
    }
    p_ele=( INT16 *)GET_P_EX_VAR(test,32);//获取变量test的第32个元素的指针
    while(1);
    return 0x00;
}
后记:
1、头文件请自行修改。
2、若要用于其它编译器,请注意变量的内存布局,本文所述采用大端模式。
3、局部变量的命名请不要使用iiiii,否则在宏展开的时候会被覆盖。
4、**比较粗糙,但是为了表示对作者劳动的尊重,转帖请注明出处并保留版权信息。

PDF下载:
https://bbs.21ic.com/upfiles/img/200711/2007112101711609.pdf

相关帖子

沙发
原野之狼|  楼主 | 2008-9-17 11:34 | 只看该作者

沙发还是俺自己坐吧~

使用特权

评论回复
板凳
huhaijiang| | 2008-9-17 11:50 | 只看该作者

re,

顶下,

使用特权

评论回复
地板
原野之狼|  楼主 | 2008-9-17 17:29 | 只看该作者

眼瞅着我的帖子就要沉下去了。。。

政府不救股市,不救楼市,但是俺得自救啊~

使用特权

评论回复
5
AV693| | 2008-9-17 18:40 | 只看该作者

网上芯艺的AVR单片机教程,关于启动初始化部分描述很详细

网上芯艺的AVR单片机教程,关于启动初始化部分描述很详细。
但是WinAVR应该有编译参数能指定RAM大小的吧,这样才能由编译器自动分配管理内存。
保存贴子备用

使用特权

评论回复
6
AV693| | 2008-9-17 18:51 | 只看该作者

里面有设置选项的啊?也许不必这么复杂吧

使用特权

评论回复
7
原野之狼|  楼主 | 2008-9-19 14:14 | 只看该作者

晕,GCC原来还可以用在STUDIO上。。。

但是楼上的截图俺不是很明白啊。。。

关键是这句,在使用外部RAM前必须要得到执行。
MCUCR|=0X80;//使能XRAM,并配制成最快速度访问

如果得到执行,那就不用像我这么复杂了。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

187

主题

8547

帖子

280

粉丝