1 C8051F060单片机的存储器结构
图1 是C8051F060单片机的存储器结构图。显然,该单片机采用了标准8051的程序和数据存储器独立编址的结构,程序存储器为64KB的Flash结构,外加128字节Flash;数据RAM除包含标准51单片机256字节,还有4KB片上XRAM和可外扩64KB数据存储器的接口。 图1 C8051F060单片机的存储器结构图
2 数据存储器及其编程
数据存储器分为内部存储器和外部存储器。内部RAM包含256字节,其高端128字节为双映射结构,即间接寻址访问128字节通用RAM,直接寻址访问128字节的特殊功能寄存器SFR地址空间,这个空间又分为256个SFR页,由特殊功能寄存器SFRPAGE来切换。这样,单片机就有足够的SFR来设定和配制各种接口资源,并为以后扩展预留了足够的空间,见例程1;低端的128字节RAM可通过直接或间接寻址来访问,这和8051单片机的RAM完全一样。其中前32个字节是4个通用工作寄存器区,接下来的16字节机可以按字节寻址,也可以按位寻址。
C8051F060单片机还有一个4KB的片内XRAM,其寻址范围以4KB为边界覆盖整个64KB的外部数据存储器地址空间。另外,该单片机还有一个外部存储器接口EMIF,用于访问片外数据存储器。外部数据存储器寻址范围可以只映射为片内存储器、片外存储器或二者的组合,即4KB以内指向片内,4KB以上指向外部存储器接口EMIF,该EMIF可以配置为复用和非复用地址线/数据线两种方式。编程步骤是:①EMIF端口的选择和配置;②确定地址形成非复用/复用和地址/数据复用方式;③存储器方式为片内方式,不带地址选择的分片方式,有地址选择的分片方式,片外工作方式;④确定接口定时参数。
例程1:高端128字节的寻址
;直接寻址于SFR
MOV 0F0H,#5AH
;间接寻址于高端RAM
MOV R0,#0F0H
MOV @R0,#0A5H
在复位缺省状态下,MOVX指令访问4KB片内XRAM,可用16位间址,也可用8位间址指令来寻址,这时高端地址放在EMI0CN寄存器中,如例程2。
例程2:4K XRAM 8/16位读写
4K XRAM 16位读写
MOV A,#36H
MOV DPTR,#0000H
MOVX @DPTR,A
MOV DPTR,#0000H
MOVX A,@DPTR
MOV R6,A
4K XRAM 8 位读写
MOV EMI0CN,#00H
MOV R0,#01H
MOV A,#37H
MOVX @R0,A
MOV EMI0CN,#00H
MOV R0,#01H
MOVX A,@R0
MOV R7,A
例程3为非复用方式XRAM写,是分片无块选方式。注意分片方式有两种,分为有块选择和无块选择两种,对16位间址是一样的,对8位间址有区别。例程4是非复用分片方式读,为有块选方式,要特别注意特殊功能寄存器EMI0CF的赋值。
例程3:片外XRAM写
MOV SFRPAGE,#0FH
MOV P4MDOUT,#0FFH
MOV P5MDOUT,#0FFH
MOV P6MDOUT,#0FFH
MOV P7MDOUT,#0FFH
CLR P4.5
NOP
MOV SFRPAGE,#00H
MOV PSCTL,#00H
MOV EMI0TC,#45H
MOV EMI0CF,#34H
CLR EA
NOP
MOV DPTR,#4000H
MOV A,#39H
MOVX @DPTR,A
NOP
SETB EA
MOV SFRPAGE,#0FH
SETB P4.5
例程4: 片外XRAM读
MOV SFRPAGE,#0FH
CLR P4.5
MOV SFRPAGE,#00H
MOV EMI0TC,#45H
MOV EMI0CF,#38H
CLR EA
NOP
MOV DPTR,#4000H
MOVX A,@DPTR
NOP
SETB EA
MOV SFRPAGE,#0FH
SETB P4.5
注意,在对片外XRAM进行读写时,指令寻址时序并不产生片选信号,所以要先置CS片选端为低,本例中为P4.5端,具体电路图略。而WR和RD信号由接口参数确定时序,但P4.5在0F页,一定要注意页切换。
3 程序存储器及其编程
C8051F060单片机的程序存储器为64KB的Flash存储器,它能以512字节为扇区实现在系统编程,无需提供片外专用编程电压,其中从0xFC00~0xFFFF的1024字节为保留区。另外,从0x10000~0x1007F的128字节Flash存储器,可以作为非易失存储器,由软件来访问,它最适合用于存放系统参数等,参见例程5。64KB的Flash存储器区除了可以存放程序代码外,也可以用来存放非易失数据。既可以在开发系统中,通过JTAG接口编程,也可以用MOV指令来实现软件编程,参见例程6。注意,在对Flash存储器操作时,读操作用MOVC指令,写操作用MOVX指令,若用MOVX读操作时,只能读到XRAM区。另外,要特别搞清楚程序存储读/写控制寄存器PSCTL和Flash存储器控制寄存器FLSCL的各个位的确切含义。
例程5:128 Flash读写
;128 Flash 读
MOV SFRPAGE,#00H
MOV PSCTL,#04H
MOV FLSCL,#40H
MOV DPTR,#0020H
CLR A
MOVC A,@A+DPTR
MOV PSCTL,#00H
MOV R7,A
;128 Flash 写
MOV FLSCL,#01H
MOV PSCTL,#07H
CLR A
MOV DPTR,#0020H
MOVX @DPTR,A
MOV PSCTL,#05H
MOV A,#35H
MOV DPTR,#0020H
MOVX @DPTR,A
MOV PSCTL,#00H
MOV FLSCL,#00H
例程6:64K程序Flash读写
;64K Flash 读
MOV SFRPAGE,#00H
MOV PSCTL,#00H
MOV FLSCL,#40H
MOV DPTR,#2020H
CLR A
MOVC A,@A+DPTR
MOV R6,A
;64K Flash写
MOV FLSCL,#01H
MOV PSCTL,#03H
CLR A
MOV DPTR,#2020H
MOVX @DPTR,A
MOV PSCTL,#01H
MOV A,#33H
MOV DPTR,#2020H
MOVX @DPTR,A
MOV PSCTL,#00H
MOV FLSCL,#00H
由于Flash存储器只能写0不能写1,只能通过对其写数据前擦除来实现写1,所以每次写Flash存储器前,都要进行擦除操作。由于64KB的Flash是以512字节为一页组织的,擦除写操作对整个页进行了写0FFH操作,为提高速度,不必逐字节操作,只要对其中的任一字节进行操作即可。