STC89C52单片机的内外的RAM,ROM的讨论
关于STC89C52:
1、STC89C52只有512字节的的RAM,包括2部份,一是256字节的内部RAM,二是256字节的外部RAM;STC89C54以上的芯片才有1K的RAM(内256+外1024)。
2、1K的EEPROM(应为2K)出厂时内置有支持串行下载功能的代码,配合官方下载软件完成代码的串口下载。这个区域在实际应用当中也可用于可保存断电后不能丢失的数据,但实际操作上不能像RAM那样直接读写,需要通过专门的寄存器操作来完成读写。
3、EEPROM不是ROM,也不是RAM,EEPROM也没有用作RAM--你先这样记,这个问题说起来内容比较多,后面细谈。
4、Flash程序存储器8K就是当ROM用(这句话严格的讲应该说成“Flash程序存储器8K就是当程序存储器用”):基本上是这样。关于ROM、FALSH后面细说。 是否需要1K的RAM:可在编译完成后观察编译结果,如果能编译成功,应该有类似下面的信息:“program size:data=9.0,xdata=1,code =2345”,其中data的整数部份就是你实际需要的内部RAM字节数,xdata是你实际需要的外部RAM字节数,code是代码长度。你可以根据这个信息选择最合适的STC单片机型号。具体到STC89C52:data<256,xdata<256,code<8192就行对上述的一些概念补充说明(包括_at_)
1、51单片机的C语言中有个需要关注的概念就是变量或数据的存储模式(PC机是否有类似的情况我不了解)。在C51中的存储模式是data、bdata、idata、pdata、xdata、code共6种:
data、bdata、idata:就是说变量或数据位于单片机的内部RAM中(ST89C52有256字节),访问速度最快。
pdata、xdata:就是说变量或数据位于扩展的外部RAM中(ST89C52内集成了256字节),相对内部RAM访问速度要慢。
code:就是程序代码,位于单片机的程序存储其中(ST89C52内含8192字节)
KEIL C编译时在有个选项叫数据存储模式(Memory Model),如果选择小模式,则程序中的变量一般会放在内部RAM(data)中,选择其它模式则会放在外部RAM(xdata或pdata,采用这两种存储模式的变量在物理上都放在外部RAM中,只是寻址方式有所不同,整体上pdata更快些);当然,如果在定义变量时就声明了存储模式,编译时会根据声明决定该变量在哪个区。比如:char data flag就是指定将flag放在内部RAM中;char xdata flag _at_0x0000则指定放在外部RAM中,而且地址是0x0000。 "_at_" 用于指定变量在内存中的地址。指定地址的方法优点在于调试方便,比如仿真单步运行时可以直接到该地址去更直观的观察变量的实际变化情况,若不指定则编译器会自己决定放在什么地方,只能通过.M51文件去获取该变量的地址了。其缺点则是容易出错,由于人为的因素,可能会成各变量的地址重叠。所以实际应用中一般都不指定地址,编译器会自动安排的,除非是特殊要求。 这里针对内部RAM和外部RAM再说几句:早先的单片机(8031、8032)外部RAM和程序存储器都需要通过P0口P2口来扩展的,51单片机本身没有哪怕是1个字节的外部RAM,扩展起来很麻烦。后来随着发展才演变到现在几乎所有的单片机都或多或少的集成了RAM和程序存储器,这样大多数应用只需要设计功能电路就可以了,不需要再去扩展,这就降低了不少成本。2、关于FLASH、ROM、PROM、EPROM、EEPROM、RAM 我们现在一般都会把单片机的程序存储器叫ROM,早先的硬件程序代码确实是放在ROM型的器件中(包括电脑的BIOS),所以ROM就是程序、程序就是ROM,大家都理解,就成习惯了。其实这是不对的,真正的ROM现在很少用了。
下面就这几个名词解释一下:
RAM:一般都叫内存,特点是读写速度快,但断电后数据丢失(后5种断电后数据不丢失)
ROM:只读存储器。特点是只能读,其内容在芯片出厂时就已经固化,如果有错只能扔掉
PROM:可编程只读存储器。特点是实际应用中只能读,但应用产品生产环节可由用户来完成对芯片的编程,只能写1次,有错的话下场同ROM。
EPROM:可重复擦写的只读存储器。特点是实际应用中只能读,但可以通过紫外线擦除(也有电擦除的),从而实现再编程,只是编程时一般需要将芯片取下来在专用设备上擦除、编程(电擦除的虽然可以在用户系统上实现擦除及编程,但必须设计专门的擦除编程电路)。上世纪90年代基本上都采用的是这种模式,如果你看到某个芯片上有个小玻璃窗,一般就是这种工艺的芯片。紫外线擦除需要15分钟的时间,也很麻烦,而且映像中编程次数只有1000次。
EEPROM:可重复擦写的非易失性存储器。特点是可读可写,且断电后数据不丢失。采取这种工艺的芯片大多数都是通过IIC总线模式来访问的。但其容量一般都不大,适合于数据不多的应用。
FLASH:可重复擦写的非易失性存储器。特点是可读可写,且断电后数据不丢失。与EEPROM的主要区别在于口线更多、存储容量更大、速度更快,还有就是擦写方式不同:EEPROM可按字节擦写,而FLASH是块擦写模式,所以速度上FALSH的读写更快。 STC单片机为什么要采取EEPROM的模式而不采用FLASH我不知道,可能是因为EEPROM相对成本较低,而且可以直接用作非易失性存储,不需要用户外扩EEPROM了
在STC89C52非常感谢你,我说下我的理解:在Memory Model下设置compact,程序中就可以直接char i;默认的就是用的xram?不设置Memory Model,默认small,不过我在程序里面用pdata,编译后,也会使用xram?Program Size: data=159.1 xdata=0 code=5628这个data=159.1是不是编译时候检测到的变量定义使用ram情况,不包含程序处理中堆栈和局部变量的使用?我要使用xram用idata还是pdata?data不够我要存储数组怎么用?1、在Memory Model下设置compact,程序中就可以直接char i;默认的就是用的xram? 对。就是在外部RAM,不过应该是pdata,只是访问方式和xdata不一样,这点可以不用关心。2、不设置Memory Model,默认small,不过我在程序里面用pdata,编译后,也会使用xram? 没错!3、Program Size: data=159.1 xdata=0 code=5628这个data=159.1是不是编译时候检测到的变量定义使用ram情况,不包含程序处理中堆栈和局部变量的使用? 局部变量肯定包含在里面,堆栈我说不大好,没有在如此的极限状态下用过。不过如果编译能通过说明堆栈、局部变量等都够用。所以在建立工程前应选择好芯片。4、我要使用xram用idata还是pdata? 用xram应使用pdata或xdata。idata和data都属于内部RAM,只是idata采用的是间接访问模式,data是直接访问模式,效率上后者更高。 5、data不够我要存储数组怎么用 编译时可以选择small模式,然后声明数组是用比如:uchar xdata xx[100],就行了,这样的话其它的变量都会使用内部RAM,只有数组由于声明了xdata会放到外部RAM中。其实这也是常规做法,只有内部变量不够的时候才会选用中模式或大模式,然后相提高代码效率时,再将那些局部变量什么的去声明为data、idata等,倒过来做。如果嫌麻烦直接使用大模式也行。