首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ms9s12xdt256外扩存储器

ms9s12xdt256外扩存储器

我用s12xdt256外扩256K的RAM,占用的是GLOBAL地址的External Space空间的0x20_0000到0x24_ffff,片选为/CS1。请问怎样才能将一个数据写到外部RAM里。
急呀,几天了没有进展!!!!!!!!!!!!!!!!
吗都不知道
这个论坛里有不少有关S12扩展RAM使用的帖子,搜索一下吧。
海纳百川  有容乃大
我看过那些帖子,都不行,我在外扩的地址定义变量时,编译器就死在了start.c里根本就跳不到main.c里。
吗都不知道
斑竹,给您看看我的操作;我的片选/CS1。外扩地址范围20_0000到24_FFFF。
SEGMENTS
。。。。。。
extern_ram = READ_WRITE 0x200000'G TO 0x24FFFF'G ;
END
PLACEMENT
。。。。。。
MY_RAM INTO exter_ram ;
END

main.c
#pragma DATA_SEG __GPAGE_SEG MY_RAM

unsigned char buffer[100]; /* this variable will be allocated in segment GLOBAL_RAM through the GPAGE register */

#pragma DATA_SEG DEFAULT
这样操作有问题吗?
吗都不知道
extern_ram = READ_WRITE 0x200000'G TO 0x24FFFF'G ;中的G是什么意思,你在哪里看到的这个格式?
海纳百川  有容乃大
这是S12X系列单片机的全局地址编写格式,4.5版本的CODEWARRIOR说明书里面有这语法。加'G代表定义的是全局地址。
还有DATA_SEG __GPAGE_SEG 。。。也是指向全局地址。
我不明白我在外扩里定义的数组,是在什么时候初始化的。每次都是死在START.C里面回不到MAIN.C里。我看好像是在START.C里就装载全局变量到内存里了。但是这时我的MCU还没有初始化让它运行在外扩模式,而且还外扩的几个控制寄存器也还没有写,这时怎样初始化我定义在外扩里的全局数组变量?
吗都不知道
CodeWarrior缺省对RAM空间初始化为0,在start.c中进行。由于尚未对扩展硬件初始化,所以会有问题。
解决的方法有以下几种途径,可分别试试:
1] 在*.prm文件中采用NO_INIT修饰字来指明您的extern_ram不用初始化;
2] 将复位向量指到您的硬件初始化模块,硬件初始化完后在跳转到start.c中的_startup函数;
3] 不用数组的方式来访问,用指针的方式访问。这样硬件初始化部分可以在start.c之后,在指针应用之前。
建议用方法2]。
另外请确保复位时引脚的模式设置正确。
祝好运!
谢谢TristoneGao,用第一种方法已经可以解决了。不知道您说的第二种方法怎样操作?谢谢请您说得仔细些。现在我还有一种方法是,用标准C定义一个指针*P,指向外扩地址P=(int*)0x20_0000,只要在MCU对外扩初始化之后对调用指针就可以
吗都不知道
CodeWarrior自建的project中,复位向量直接指向start.c中的_startup函数。你可以在prm文件中将vector 0的地址改为你的初始化程序,然后在初始化程序的最后在跳转至_startup函数。
海纳百川  有容乃大
明白了,谢谢strongchen!我试试看。
吗都不知道
还有strongchen在S12X外扩说明里有make sure to specify the option -D__FAR_DATA on the compiler command line。我不清楚这个操作-D__FAR_DATA 而且codewarrior的帮助文件里没有讲到。
吗都不知道
这应该就是在定义变量或指针时要加上 __FAR_SEG 说明。
海纳百川  有容乃大
返回列表