打印

求教,keilC里RAM的设置

[复制链接]
7491|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
中航_夏工|  楼主 | 2009-8-25 08:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的芯片是STC12系列,RAM为1028,可是KEIL库里没这款芯片,所以用AT89S53代替,但是AT得RAM为256,所有BULID的时候老是说溢出,创建不了,请问有什么办法可以改芯片的RAM特性啊

Program Size: data=126.1 xdata=0 code=2721 这是代码大小,各位大侠帮帮忙,小弟在此谢过了!

相关帖子

沙发
etz2009| | 2009-8-25 08:51 | 只看该作者
你去看看那个KEIL提供的说明书
好像那上面有很多的预编译等东西
我想可能会对你有用

使用特权

评论回复
板凳
LYXQ| | 2009-8-25 09:13 | 只看该作者
0-128字节直接寻址,属内部RAM;128-256间接寻址,属内部RAM;256-1280间接寻址,属外部RAM;要想用外部RAM必须定义成xdata

使用特权

评论回复
地板
中航_夏工|  楼主 | 2009-8-25 09:17 | 只看该作者
谢谢楼上,怎么定义成XDATA呢? 把Memory model改变一下就可以了吗?

使用特权

评论回复
5
中航_夏工|  楼主 | 2009-8-25 09:21 | 只看该作者
顺便说下,我用的DB的KEIL。。

使用特权

评论回复
6
LYXQ| | 2009-8-25 09:58 | 只看该作者
#define uchar unsigned char
xdata uchar t1; 此变量定义在xdata区,256 --- 1280之间
idata  uchar t2; 此变量定义在idata区, 128 --- 256 之间
uchar t3;          此变量定义在data区,     0 --- 128 之间

使用特权

评论回复
7
LYXQ| | 2009-8-25 09:59 | 只看该作者
#define uchar unsigned char
xdata uchar t1; 此变量定义在xdata区,256 --- 1280之间
idata  uchar t2; 此变量定义在idata区, 128 --- 255 之间
uchar t3;          此变量定义在data区,     0 --- 127 之间

使用特权

评论回复
8
冷漠| | 2009-8-25 12:46 | 只看该作者
楼上还是没说清楚。我也有此问题。
按照楼上:xdata uchar t1; 此变量定义在xdata区,256 --- 1280之间
是片外xdata  了,编译出来的机器码是MOVX  @DPTR, ...

芯片产生外部读写信号RD/WR,还是没有用到片内xdata。

中航夏工解决问题后,教教咱们大家。芯片内有一个设置位,设置0/1 指向片内xdata 还是片外xdata。

使用特权

评论回复
9
LYXQ| | 2009-8-25 14:13 | 只看该作者
STC单片机上电后的情况下是使用内部扩展RAM的。这时的指令MOVX  @DPTR,a在1K范围内是不会影响P0,P2,RD的。数据手册68页已经说得很清楚了。是不是如楼上说的那样试验过后再说了,不要猜测。

使用特权

评论回复
10
中航_夏工|  楼主 | 2009-8-25 14:43 | 只看该作者
还在试验中,不过我把一个原有的一个数组定义到idata 中后,就没有提示内存不够了,能够直接编译和创建,具体到哪个地址我还没看。

使用特权

评论回复
11
mohanwei| | 2009-8-25 15:05 | 只看该作者
MCU选择为8031,8051都可以;
编译模式建议使用大模式,即变量默认放到xdata;局部对速度要求很苛刻的地方手工指定变量到data或者idata……
至于xdata如何用,PWM如何用……建议多看看手册,那个姚工估计是资深单片机开发人士,手册里写的小笔记和小例程都说到点上了,一点即明。其它的基础部分,参考8051相关书籍即可,毕竟走得是兼容路线。

使用特权

评论回复
12
冷漠| | 2009-8-25 17:06 | 只看该作者
本帖最后由 冷漠 于 2009-8-25 17:16 编辑

选8031、8051不行吧,它们没有内部xdata呀。即使可以设置DME0位,...我选的是89C51RD2代用,附加1K内部 XRAM。

还是FDLock 说的是正解:DMEO位“使能/禁能”设置的问题:实验一下:改写PMR寄存器的DME0位看看现象:

“这个1KB的SRAM是XDATA存储区 。
如果内部1KB的SRAM使能(由PMR寄存器的DME0位控制),则用MOVX访问0000H--03FFH地址就是访问内部SRAM,大于03FFH地址就是访问P0、P2口外扩的SRAM。
如果内部1KB的SRAM禁能,则用MOVX访问0000H--FFFFH地址都是访问P0、P2口外扩的SRAM。”

使用特权

评论回复
13
wkatt1002| | 2009-8-25 17:38 | 只看该作者
能说下PMR能不能位寻址呢??

使用特权

评论回复
14
mohanwei| | 2009-8-26 08:36 | 只看该作者
内部的xdata和外部总线扩展的64K xdata有什么区别呢?通过AUXR的EXTRAM位来切换而已。
我的项目里不管设8031 8051 8958……都没问题。手册上推荐的华邦型号只是为了使Flash大小一样而已,防止你程序写大了而不自知到烧写才发现。

使用特权

评论回复
15
xwj| | 2009-8-26 08:50 | 只看该作者
内部的xdata和外扩的xdata软件上没什么区别的,记得设置下寄存器就可以了

当然,外面的信号肯定是有区别的,访问内部的xdata时总线上思没有信号的,P0和P2口、WR、WD电平不受影响;
而访问外部的xdata时,这些端口的电平都会有瞬间变化,所以就不能用坐IO使用了。

使用特权

评论回复
16
中航_夏工|  楼主 | 2009-8-26 09:41 | 只看该作者
看了各位的论述,好像明白了点,可是为什么要用DEMO位来屏蔽内部XDATA呢?
XWJ说软件上没区别,那我认为硬件就该有区别哦,比如2款MUC,第一款的RAM256,第2款的RAM512,2款RAM都不够用,都外接同一款RAM,那硬件电路的接法是不是不一样?
我还想问下,只要RAM达到64K,不管外接还是内接,那XDATA的范围是不是256-64K?

使用特权

评论回复
17
huchengxtu| | 2009-8-26 11:13 | 只看该作者
测试完毕
AUXR=0x00;
Program Size: data=41.1 xdata=1024 code=1380

使用特权

评论回复
18
LYXQ| | 2009-8-26 11:15 | 只看该作者
STC的单片机干嘛要扯上华邦的东西?它们根本就是2个东西,难怪调不出来。建议在wave环境下,CPU选STC8958。

使用特权

评论回复
19
a305566| | 2011-3-31 13:28 | 只看该作者
MARK

使用特权

评论回复
20
cxdy_lee| | 2011-3-31 14:23 | 只看该作者
可以去STC的官网去下载它的库。然后用这个文件替换KEIL里面的单片机库就可以啦!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

23

帖子

0

粉丝