电子说
程序存储器:
① 用于存放程序(可执行的二进制代码映像文件,包括程序中的数据信息),还包括初始化代码等固件。
② 为只读存储器。注意,这里的“只读”,是指单片机(CPU)在正常工作时对其的访问方式是只读的;而现在大多数单片机的程序存储器(不管是内部还是外部)都采用了FLASH ROM,来取代以前所用的ROM、E2PROM等,可方便地进行在线编程(ISP)。
③ 标准8051的内部程序存储器大小为4KB(0x0000 ~ 0x0FFF);而具体的51核的兼容单片机的内部ROM大小需要参考其Datasheet,例如P89C51RA2xx的内部程序存储器是8K的Flash。
④ 内部、外部存储器统一编址,在软件设计上(指令系统中)没有差别;是否使用外部程序存储器是通过引脚EA在硬件电路上控制的:不使用外部程序存储器时,EA=0(接地);如果扩展了外部程序存储器,则使EA=1,当寻址到内部存储空间以外时,会自动转向外部程序存储器空间(与扩展外部程序存储器有关的还有PSEN和ALE的时序配合,以及P0和P2口用于地址线)。
[注] 一般直接选用内部程序存储器满足代码大小要求的单片机型号,避免扩展外部存储器,造成系统软硬件设计上的复杂和额外开销。
数据存储器:
为RAM。首先必须要强调的是,不管是物理上还是逻辑上,51单片机的内部、外部数据存储器都在不同的地址空间。两者不是一回事,用途也不一样,访问的指令也不同(内部RAM为MOV指令,外部为MOVX)。
1、内部数据存储器(内部RAM)
相当于内存,为程序(进程)中的变量和常量分配存储空间,掉电后内容消失。
标准8051的内部RAM为256B(0x00 ~ 0xFF):其中可供用户自由使用的是低128B(0x00 ~ 0x7F)区域,高128B中定义了26B的特殊功能寄存器(SFR),其余没有定义,因而没有意义。
P89C51RA2xx的片内RAM是512B(片内RAM不等于内部RAM,见释疑2)。
[说明] 关于内部RAM中的SFR,其中不但定义了一些控制字段,还包括累加器(ACC)、程序状态字(PSW)、数据指针(DPTR)、堆栈指针(SP)等,值得注意的是,片上I/O口P0 ~ P3的地址也在这里定义(即有3个特殊功能寄存器的地址实际上是P口的地址)——这是因为51单片机的I/O口与存储器是统一编址的*。
2、外部数据存储器(外部RAM)
上面谈到“I/O口与存储器统一编址”的问题,因此,这里称作外部RAM空间更为合适。在这个64KB地址空间中(0x0000 ~ 0xFFFF),除了可以扩展外部RAM外,还可以扩展外部I/O设备。
外部RAM主要用于存储程序运行时产生的重要数据(如数据采集结果、数据处理结果、系统日志等),这时一般需要外加电源进行掉电保护,以在系统掉电时保存其中的数据信息;也可用于数据的暂时存储,供CPU正常读写操作使用。因此外部RAM主要是使用其“可随机访问、读写方便且高速”的特性。
* 所谓I/O口与存储器统一编址,是指I/O口与主存在同一地址空间,将处理器的可寻址存储空间中专门划出一部分地址空间分配给I/O口使用。这与PC机的x86处理器不同,x86体系结构为I/O口专门定义了独立于存储空间之外的地址空间(事实上,除X86外,其他体系结构的处理器都对I/O口与存储器统一编址,可参考《Linux Device Drivers》)。
释疑1:51只有16根地址线,为什么能同时将程序存储器和外部数据存储器都扩展到64KB呢?即外部即有ROM,又有RAM,如何知道访问的是哪个?
在体系结构上,程序存储器和数据存储器是不同的地址空间,两者的访问是不会相互干扰的,这主要是通过在硬件和指令集设计上来实现的。
在硬件上,访问外部ROM是通过EA和PSEN引脚来控制的;访问外部RAM则是通过WR和RD信号来控制的;
在指令集上,访问外部ROM不需要使用显示指令,是通过PC(指令计数器)来控制取指地址的(跳转指令也可能引起PC跳转);而访问外部RAM则需要在程序设计上使用指令MOVX来执行。另外,访问内部RAM则使用了指令MOV,以区分外部RAM的访问。
释疑2:P89C51RA2xx的片内RAM是512B,是如何组织的?
P89C51RA2xx的片内RAM是512B:其中内部RAM为256B(使用MOV指令访问,定义与标准51相同);另外的256B为XRAM(片内的外部数据存储器),属于外部存储器的范畴,因此用途也同外部RAM,使用MOVX指令访问,当程序中的全局变量或单个局部变量需占较大存储空间时,可以定义为xdata型,保存到XRAM区。注意这个片内的XRAM掉电后其数据也会丢失;另外,如果要扩展外部RAM,则一般是设置XRAM为禁用态。
全部0条评论
快来发表一下你的评论吧 !