AVR单片机对外部RAM的扩展

控制/MCU

1877人已加入

描述

我采用的是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.addr+(pos)*name.size_ele)[iiiii]=*((INT8 *)pdat+iiiii);\

} while(0)

#define RD_EX_VAR(name,pos,pdat) do {\

for(UINT8 iiiii=“0”;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;

}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分