新闻  |   论坛  |   博客  |   在线研讨会
ADUC845存储器组织结构
cyq1245 | 2015-11-29 21:43:19    阅读:1475   发布文章


ADUC845存储器组织结构

在ADUC845内部的基本结构中,有两块存储器:RAM和快闪存储器(FLASH),每个存储空间都具有连续的字节地址空间,其地址都是从0开始至最大存储范围的字节地址,即它们的地址是全部重叠的。利用不同的指令寻址方式来访问。

ADUC存储器组织结构如下图所示:

ADUC845的程序存储器区

只在片内,ADUC845的片内存储器区(ICODE)是快闪存储器(FLASH),可以多次擦写,程序的写入通常称为烧录,采用专用的软件与工具实现,把程序写入到片内存储区的哪个位置通常会有地址映射决定。ADUC845可以从程序存储器中读取常数或查表。例如下列指令都是从程序存储器中得到常数的例子。

MOV    A,    #1          ;把立即数“#1”送到累加器A

ANL    01H, #0F3H     ;把立即数“#0F3H”与内部RAM单元01H进行逻辑与操作

(注:指令MOV  A,#1包含了立即数,该指令最终存储在程序存储器中,当CPU执行这条指令时,就从程序存储器中获得了立即数“#1”,至于立即数存储在程序存储器中哪个位置,CPU并不关心。事实上,编译软件在生成程序烧录代码的时候,会给MOV A,#1;指令映射一个片内程序存储器地址,然后程序代码通过烧录器写入到片内程序存储器中,即立即数就存储在片内程序存储器中了)。

常数与常数表格通常放在程序存储器中。常用“DB”伪指令表示以一个字节的形式存储在程序存储器中的常数与常数表格。例如:

CHANGSHU: DB  0,1,2,3,4,5,6,7

                 DB 8,9,0AH,0BH,0CH,0DH,0EH,0FH

常数放在从“CHANGSHU”开始的地址中,由编译器自动分配?看下面的例子,把R7中的十进制转换成相应的七段数码管0~9数字的共阴显示代码。

CAXIANSHIMA: MOV A,R7   ;把待转换的数送到A中

MOV DPTR,#QIDUANMA  ;把表格的起始地址送到DPTR中,注意

                                         ;表格标号前要加“#”前缀

MOVC A,@A+DPTR ;查表,得到7段显示码

QIDUANMA: DB 0CFH,03H,5DH,5BH,93H;七段显示码

DB 0DAH,0DEH,43H,0DFH,0DBH

8051单片机内的指令集中没有向程序存储器写入数据的命令。把单个数据或者数据块存入程序存储器,通过编译器实现,提供一个存储地址助记符号,告知CPU存储位置,CPU通过这个位置访问存储的数据。

数据存储器(DATA)区

ADUC845的数据存储器(DATA)区包括片内前128B的内部RAM、2KB片内XRAM和外部16MB的RAM(XDATA)三部分。

片内前128B主要用作数据段,称为DATA区,可以采用直接寻址方式访问,也可以通过R0和R1采用间接寻址方式。直接寻址方式访问速度最快。间接寻址访问时R0和R1被作为数据区的指针,将要读或写的字节地址放入R0或R1中,根据源操作数和目的操作数的不同执行指令需要1~2个周期。

例如:

直接寻址方式:

MOV 07H, #3AH ;送把立即数3AH到07H数据段中

间接寻址方式:

MOV R7,#3AH  ;送立即数3AH到R7中,即送立即数3AH到07H数据段中

片内前128B的DATA区又可以分为几个区域。其中:

(1)工作寄存器组:地址为00H~1FH,每8个单元为1组,共有4组。00H~07H为第零组(0组),08H~0FH为第一组(1组),10H~17H为第二组(2组),18H~1FH为第三组(3组)。单片机复位时默认第零组为当前工作寄存器组,即读/写R0时是从00H单元进行读/写操作的,读/写R1是从01H单元进行读/写操作的,……,读/写R7是从07H单元进行读/写操作的。通过PSW(程序状态寄存器)中的RS0、RS1位可以设置当前工作寄存器组。

例如,执行了以下两条指令:

SETB RS0   ;置位RS0

SETB RS1   ;置位RS1

则把第三组设置为当前工作寄存器组。如果这时执行下面指令,则把立即数3AH写入到1FH单元中。

MOV R7,#3AH  ;送立即数3AH到R7中

当前工作寄存器组与RS1、RS0的关系

当前工作寄存器组

RS1

RS0

0组(00H~07H)

0

0

1组(08H~0FH)

0

1

2组(10H~17H)

1

0

3组(18H~1FH)

1

1


(2)可位寻址区:地址从20H~2FH共16个单元中的每一位都可以直接寻址,即可以对这些单元中的某一位进行读/写操作而不会影响该单元中的其他位。例如

SETB 00H  ;置位20H单元的第0位,片内数据存储器下面的地址

;不可以位寻址,位寻址地址为20H为起始地址。

CLR 77H     ;清除2EH单元的第7位,对应是77H那一位。

外部数据存储器XDATA

ADUC845可以访问最大数据存储空间为16MB的外部数据存储器,采用24位地址寻址,该地址总线使用P0、P2口。该外部数据存储器即称为XDATA区。这个区通常包括一些RAM、如SRAM,或一些需要通过总线接口的外围器件。对XDATA的读/写操作至少两个指令周期,只能使用DPTR、R0或R1间接寻址。

例如:                               

MOV DPTR,#Addr  ;写入地址立即数#Addr到DPTR

MOV DPTR,A  ;把累加器A中的数据写入DPTR所指向的XDATA单元

片内非易失性数据存储区XRAM

ADUC845的片内有一个非易失性数据存储空间,大小为2KB,为FLASH/EEPROM存储器,称为内部非易失性数据区,简称XRAM区。对XRAM的读/写也只能使用DPTR。XDATA空间中的低2KB的地址根据设置可以归片内XRAM使用。

IDATA区

8052有附加的128B的内部RAM,位于从80H开始的地址空间,称为IDATA。IDATA区的地址和SFR的地址是重叠的,通过区分所访问的存储区来解决地址重叠问题。SFR只能通过直接寻址来访问,IDATA区只能通过间接寻址来访问。例如:

MOV 82H,#0FH ; 写立即数#0FH到DPL  (SFR)

与MOV DPL,#0FH ; 写立即数#0FH到DPL  (SFR)作用一样,而写立即数到IDATA需要先写地址,再写数据。

MOV R0,#82H    ;写立即数#82H到R0

MOV @R0,#0FH;写立即数#0FH到82H(IDATA)


特殊功能寄存器(SFR

中断系统和外部功能控制寄存器位于从地址80H~FFH的内部RAM中。这些寄存器称为专用寄存器或特殊功能寄存器(Special Function Register,SFR)。各个特殊功能寄存器在内存的位置见下图右半部分,采用直接寻址访问方式(字节访问)。

其中地址可被8整除的特殊功能寄存器能够位寻址,采用直接寻址方式。位寻址时,地址按位映射到80H~FFH,内存与地址为一一映射,所以最大可位寻址空间为128个。访问这些地址除了可以按字节访问整个寄存器外,还可以按位访问直接地址。例如,要对中断使能寄存器中的EA位进行寻址,可使用EA、IE.7或0AFH来访问。EA为助记符,IE.7即访问IE寄存器的第7位,0AFH为位地址(注意位地址与字节地址的区别)。




*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客