许多工程师都遇到过的“怪现象”
问
规范80C51、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会提示是否仿制并增加startup 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,刚刚触摸此类单片机的技
术人员最简单在这里犯错误。
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/chuanganqi/258950.html