前期教程
前言
??在写了两篇关于51单片机的博客后,我自以为对51单片机已经非常了解了,但没想到最近在看一个代码的时候还是遇到了问题。于是再补上一个关于存储的知识点。【这一部分知识点建议查看官方手册,多看几个系列的】
RAM
??从上面两篇链接我们知道,51单片机内部有256B的RAM,从0x00到0xFF,其中,低128B为通用RAM,高128B与特殊功能寄存器(SFR)地址重合,注意哦!只是地址重合,但在物理上仍然是两块区域。毕竟,特殊功能寄存器是寄存器,访问速度要高于RAM很多。其结构如下图所示。
??那这高128B的RAM怎么区分呢?答案是通过访问方式区分,据说二者的汇编代码是不一样的,但是对于C语言编程来说,最主要的区别大概就是特殊功能寄存器一般用sfr 声明,而RAM则是根据定义的变量由编译器自动分配,不会特别声明使用。
??但是51单片机中使用最广泛的STC单片机却没这么简单,它除了含有256B的内部RAM外,还含有 1024B的内部扩展RAM,这一部分在官方手册中有详细说明: 所以如果编程的时候遇到RAM大小不够用的时候,就可以考虑使用内部扩展RAM,只需要在声明变量时加上前缀xdata (因为默认是idata )。 ??同时这部分手册似乎也说明了这个内部扩展RAM的来历:本来传统的51单片机就有考虑到数据存储器不够用的问题,于是想到了使用外部扩展RAM,利用其16位地址线,可以扩展64KB的外部RAM。但是访问外部RAM就会导致芯片引脚电平发生变化,于是STC的单片机就将外部的RAM“移到”内部了,这样就解决了这个问题。但是这个内部扩展RAM只有1K(根据型号不同有所差别),所以STC的单片机部分引脚数多的型号除内部扩展RAM,还可以访问外部扩展RAM,直到访问上限达到64KB。 通过控制内部寄存器的位可以决定是只访问外部扩展RAM还是内部加外部扩展RAM。
??此外,在使用内部扩展RAM时,下载的时候记得勾选相关选项,这个在官方手册中也有说明:
??另外,值得一提的是,对于某些STC单片机型号,部分扩展的特殊功能寄存器的地址和内部扩展RAM地址重合,就像是高128B的内部RAM一样,只是重合,物理上是两个区域。但是,这部分寄存器访问时需要注意将 P_SW2(BAH)寄存器的最高位(EAXFR)置 1。
ROM
??说完了RAM,再来说说ROM。通过前面两篇博客,我们知道传统的51单片机,其内部ROM是4K,但是支持外部扩展,最大扩展64K,和上面提到的外部扩展RAM一样。因此,51单片机的ROM最大为内部ROM+64KB外部ROM。 ??那怎么区分这几块存储区域呢?答案是利用EA引脚来确定是访问片内程序存储器还是访问片外程序存储器。当EA引脚接高电平时,STC单片机首先访问片内程序存储器,当PC的内容超过片内程序存储器的地址范围时,系统会自动转到片外程序存储器。 ??但是STC的单片机根据型号不同,它的内部ROM大小也存在差别,举两个例子:
可见最大的ROM可以达到61KB,可以说基本满足大部分需求了,也不再需要外扩。
EEPROM
??EEPROM算是51单片机的一个特殊之处了,这个是传统51单片机没有的。这里的EEPROM和FLASH不是一个区域,不算在FLASH SIZE里面,这个可以通过官方的选型表看出。 二者是单列的,而且官方手册里面也给出了读写内部EEPROM的方法,这块区域主要用于存储一些不需要修改且数量较多的变量。
|