最近的一个项目中,体会了一下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、文章比较粗糙,但是为了表示对作者劳动的尊重,转帖请注明出处并保留版权信息

AVR单片机外部RAM访问相关推荐

  1. AVR单片机Atmega128外扩RAM

      由于AVR系列单片机采用的是内部外部RAM统一编址,ATmega128工作在非ATmega 103模式时具有4k+256B的包括寄存器文件(通用工作寄存器).I/O寄存器.扩展I/O寄存器和内部S ...

  2. 51单片机C语言访问外ram,C51中访问外部RAM的方法

    C51的P0,P2口做外部扩展时使用,其中XBYTE [0x0002],P2口对应于地址高位,P0口对应于地址低位.一般P2口用于控制信号,P0口作为数据通道. XBYTE定义的是外部地址,这样才能和 ...

  3. 单片机c语言访问片外存储器,教你给51单片机扩展片外RAM

    原标题:教你给51单片机扩展片外RAM 上一文中扩展了单片机的程序存储器,4KB存储空间提升到64KB.其实,4K的代码空间还凑合,但是51自带的256B数据存储空间使用起来还真紧张,其中留给用户的连 ...

  4. stm32h743外部RAM非字节对齐访问,引起的hard fault

    我遇到的情况非常相似,我先说说我遇到的情况:由于公司的STM32F437买不来了,价格500+, 但是STM32H743却只有200+,于是我收到了一个任务,用STM32H743替换之前的F437: ...

  5. 单片机内部RAM(片上RAM) 外部RAM(片外RAM)

    上图中的no chip就是指的片上RAM,一般我们都是适用的片上RAM,在出现片上RAM不够用的情况下,可以通过扩展片外RAM来解决RAM不够用的情况. 实例 我用#CSDN#这个app发现了有技术含 ...

  6. AVR 单片机与GCC 编程之存储器操作

    AVR 系列单片机内部有三种类型的被独立编址的存储器,它们分别为:Flash 程序存储器.内部SRAM 数据存储器和EEPROM 数据存储器. Flash 存储器为1K-128K 字节,支持并行编程和 ...

  7. avr-gcc与avr单片机c语言开发 pdf,AVR 单片机与GCC 编程使用方法

    原标题:AVR 单片机与GCC 编程使用方法 WIN 是一个ATMEL AVR 系列 的开发工具集,它包含GNU C 和C++编译器 . 1.1 一个简单的例子 为了先有一个感性的认识,我们首先看一下 ...

  8. 关于AVR单片机熔丝位的设置和拯救方法大全 AVR单片机熔丝位的设置和详细的拯救方法...

    熔丝位是ATMEL公司AVR单片机比较独到的特征.在每一种型号的AVR单片机内部都有一些特定含义的熔丝位,其特性表现为多次擦写的E²PROM.用户通过配置(编程)这些熔丝位,可以固定地设置AVR的一些 ...

  9. 利用PROGISP实现ARDUINO IDE编写的程序的下载以及如何把AVR单片机做成ARDUINO板

    首先讲讲题目的由来吧.我做的东西原本是利用ARDUINO MEGA2560及各种模块搭建起来的,程序自然也是用ARDUINO IDE写的.但这种东拼西凑的产品自然不够好,更主要的是,之前ARDUINO ...

最新文章

  1. 劫持选举 EOJ 3535(随机)
  2. Jenkins Pipeline动态使用Git分支名称的技巧
  3. 不恰当使用read会造成服务器阻塞
  4. 【Python】100行Python代码轻松开发个人博客
  5. ​从熵不变性看Attention的Scale操作
  6. Spring容器中导入组件方式
  7. redis学习之——redis.conf配置(基本)文件学习
  8. 邮票的孔怎么做出来的_金银花茶是怎么做出来的呢
  9. android中Stub Proxy答疑
  10. compile函数 java_正则表达式--关于Java中Pattern.compile函数的相关解释
  11. JavaScriptjQuery.HTML5事件
  12. ACL2016最佳论文:通过交互学习语言游戏
  13. VGA线材说明与鉴别详解
  14. android shape大小,Android中shape属性详解
  15. IntelliJ IDEA 如何配置MySQL数据库
  16. 企业信息安全————1、什么是企业信息安全
  17. 支付宝小程序模板开发,一整套流程
  18. 关于H5播放视频文件的问题
  19. AE 枪口火焰的五毛特效
  20. Halcon视觉检测——PCB板处理:获取焊点及线路端点

热门文章

  1. nextcloud如何填写数据库_NextCloud安装使用心得记录
  2. android 代码功能测试,Android触屏测试实例代码
  3. 使用php简单网页抓取和内容分析,使用PHP简单网页抓取和内容分析_php
  4. MongoDB Project Fields
  5. opencv fast角检测
  6. 两个jqgrid 直接互相数据_MySQL数据库锁应该这样用
  7. 面试题系列:网络篇夺命连环12问
  8. vCenter HA (至少VCSA6.5及以上)
  9. Dubbo学习总结(10)——里程碑式 Dubbo 2.7.5 版本发布,性能提升30%,支持 HTTP/2、TLS、Protobuf等特性。
  10. Spring学习总结(28)——Spring获取request对象的几种方法及线程安全性总结