历史上的今天
今天是:2025年01月16日(星期四)
2020年01月16日 | AVR单片机对外部RAM的扩展
2020-01-16 来源:eefocus
我采用的是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;
}
史海拾趣
|
史上最强动物机CES登场 Marvell Plug Computer 3.0 完全无风扇,内置硬盘,5W功耗(一代指标,含硬盘也不会超过10W),千兆以太+WiFi,Kernel-2.6支持,动物机的绝配啊。 由于目前spec尚未发布,因此仅知道是基于 2 GHz Marvell ARMADA 300处理器,内置硬盘 WiFi 蓝牙 USB2.0 及千兆以太。内存大小 ...… 查看全部问答> |
|
下载 (86.56 KB) 2010-4-16 21:49 “作者强调大局观和直觉,从实际出发,这对于我们这些专业人员有着不可估量的重要性。强烈推荐本书” ——Rick Nelson,Test&Measurement World杂志主编 “本书弥补了学校教育的缺陷。 ...… 查看全部问答> |
|
现因个人转行原因出06年购合众达DSP2812+XDS510一套。。价格一套共:600元 有意请加QQ:350563705 或致电:13828499087… 查看全部问答> |
|
刚买了块at89lv51,可是在stc的开发板上烧写总是出错,请问可能是什么原因?是电压问题?还是烧写驱动,烧写工具的问题,怎么解决?因为要用到低电压驱动的单片机,谁知道的麻烦告诉一声,谢谢了。… 查看全部问答> |
|
我想在642外只采用扩展一个32位的SDRAM,一般的开发板都是扩展两片SDRAM,这样数据宽度为64位,很多例程也是基于此的?我现在想问如何在bios中设置数据宽度,将外扩SDRAM扩展为32位?… 查看全部问答> |




