完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
最近的一个项目中,体会了一下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 iiii;iiiii (name.addr+(pos)*name.size_ele)[iiiii]=*((INT8 *)pdat+iiiii); } while(0) #define RD_EX_VAR(name,pos,pdat) do { for(UINT8 iiii;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) tm; 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、文章比较粗糙,但是为了表示对作者劳动的尊重,转帖请注明出处并保留版权信息 |
|
|
|
只有小组成员才能发言,加入小组>>
2510 浏览 0 评论
1079浏览 2评论
694浏览 1评论
450浏览 0评论
189浏览 0评论
321浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 11:17 , Processed in 1.352900 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号