新闻中心

EEPW首页>嵌入式系统>设计应用> C51,RAM 用C51操作片内扩展RAM

C51,RAM 用C51操作片内扩展RAM

作者: 时间:2016-11-25 来源:网络 收藏
很多工程师都遇到过的“怪现象”
标准80 C51、52内核的 单片机片内最多只有256字节的 RAM,少得可怜,很多情况下会出现不够用的问题。如果在片外扩展RAM,则会增加成本,并可能减少多达18条I/O口线。现在许多新型8051内核的单片机为了解决上述问题,会在片内另外扩展有一定容量的RAM,一般安排在XDATA地址空间。Philips 半导体的P89C668更是在 片内扩展有8KB的XRAM,与其它型号相比,堪称“海量”。为了保持与标准80C51的兼容性,一般这些扩展的片内RAM在复位时默认是无效的,如果要使用,则需要先修改相关SFR寄存器里的使能位(但也有少数型号的规定与此恰恰相反,复位时默认是有效的,如果片外已经扩展有XRAM,则地址重叠的部分会被自动屏蔽掉)。
如果使用汇编语言编程,在程序一开始,可以立即使能片内扩展RAM,以后用MOVX指令就能方便地访问。如果用C51编程,许多用户很自然地也在main()函数的一开始就使能片内扩展RAM。然而在调试程序时总是出现意外情况,仔细排查后,“确认”是片内外部RAM有问题,通常表现为数据没有被初始化。部分客户还会去找供应商算帐,称芯片质量存在严重问题,等等。可以说,这是我们许多单片机工程师都曾经遇到过的问题。
总之,你用C51编程并打算使用片内扩展的RAM,那么就很容易出现上述怪现象。是芯片有问题吗?不是!同样功能的程序如果换作汇编来写,就跑通了,这就证明芯片还是好的——找供应商算帐无理!是C51编译器有问题吗?更不是!C51编译器是经过多年千锤百炼才发展到今天“完善”的程度,想找出并证实一个bug还真不容易。“是我的程序错了吗?程序很小,仅10几行,专门测试片内扩展RAM用的,已经过反复核查,怎么会出错呢?”——很多工程师对我这样讲,但我还是要告诉他:确实是程序有问题!
我们先不提程序错在何处,因为部分工程师性子太急,我先给出解决方案,行不行,先试试看:请删除main()函数里使能片内扩展RAM的语句;重新建立工程,选择器件后,Keil C51会提示是否复制并添加sta rtup code到工程里,此时一定要选择“是”;将你的相关C源程序添加进工程;打开刚才添加的Startup.A51文件,找到标号“STARTUP1:”,紧接其后添加使能片内扩展RAM的 汇编指令;重新编译工程并调试。OK,问题解决了吗?
咦——这是为什么?原因是这样的:如果你用到了片内扩展RAM,定义有xdata属性的 全局变量(或在main()函数的开头定义有),而且定义的同时赋有初值,那么变量的初始化操作实际上在进入main()函数之前(或刚进入main函数时,不可控)就已经完成了。因此在main()函数里,第一条可执行语句就安排为使能片内扩展RAM的操作已是来不及!这就是C51编译器的特性,同时也是其它C编译器所共有的、ANSI C所要求的。文件Startup.A51是启动代码部分,里面包含有初始化全局变量的操作。新建工程时,如果不添加此文件,则在编译时系统也会自动插入安装目录中的那个Startup.A51文件。如果在main()函数里的开头定义有xdata属性的变量并赋初值,则执行时刚一进入main()该变量就被初始化,然后才轮到正常的可执行语句。现在知道在main()中添加使能片内扩展RAM的操作语句为什么不行了吗?
答 1:
一句话概括:在使能片内扩展RAM之前对XRAM进行的任何操作都无效因此,相关使能片内扩展RAM的指令必须位于全局变量初始化操作之前。
关于STC单片机内部扩展ram的使用
高128字节(地址:80H~FFH),只可间接寻址;
STC89系列单片机另外增加了768字节的片内扩展RAM,以解决众多技术人员在编程时的RAM资源严重缺乏的问题。
768字节的片内扩展RAM(地址:000H~2FFH)与外部扩展RAM地址重叠,单片机可通过软件设置AUXR.1,决定是否使用片内扩展RAM,以防止可
能的与外部扩展RAM的冲突,默认为使用片内扩展RAM。
片内扩展RAM的访问采用间接寻址,可通过
①、MOVX A,@DPTR 或 MOVX @DPTR ,A 指令访问片内扩展RAM(00H~2FFH,共768字节);
②、MOVX A,@Ri 或 MOVX @Ri,A 指令访问片内扩展RAM(00H~FFH,共256字节)。
当DPTR≥300H时,系统访问外部扩展RAM。
注意:在使用第二种指令时,特别要注意是使用MOV还是MOVX,MOV访问的是片内RAM,MOVX访问的是片内扩展RAM,刚刚接触此类单片机的技
术人员最容易在这里犯错误。


关键词:C51RAM片内扩

评论


技术专区

关闭