STC32G12K128单片机提供24位寻址空间,最多能够访问16MB的存储器(8MB数据存储器+8MB程序存储器),其程序存储器和数据存储器是统一编址的,如图3.8所示。由于没有访问外部程序存储器的总线,所以单片机的所有程序存储器都是片上Flash存储器,不能访问外部程序存储器。
STC32G12K128单片机内部集成了大容量的数据存储器,数据存储器在物理和逻辑上都分为两个地址空间:内部RAM(edata)和内部扩展RAM(xdata)。
图3.8 STC32G12K128单片机的存储系统结构
STC32G12K128单片机存储系统的编址如表3.18所示。
表3.18 STC32G12K128单片机存储系统的编址
程序存储器用于存放用户程序、固定不变的数据及表格等信息。STC32G12K128单片机的程序存储空间有128KB,地址范围为FE:0000H~FF:FFFFH。其中,FF:0000H~FF:FFFFH的64KB程序空间与传统8051单片机的0000H~FFFFH空间兼容,称为code区域;FE:0000H~FE:FFFFH的64KB程序空间为扩展程序空间,称为ecode区域。
1.系统复位程序起始地址与中断向量地址
单片机复位后,程序计数器(PC)的内容为FF:0000H,从FF:0000H单元开始执行程序。
中断服务程序的入口地址(又称中断向量)也位于程序存储器。在程序存储器中,每个中断都对应一个固定的中断服务程序入口地址。当中断发生并得到响应后,单片机就会自动跳转到相应的入口地址去执行中断服务程序。
外部中断0(INT0)的中断服务程序入口地址是FF:0003H,定时/计数器T0(TIMER0)的中断服务程序入口地址是FF:000BH,外部中断1(INT1)的中断服务程序入口地址是FF:0013H,定时/计数器T1(TIMER1)的中断服务程序入口地址是FF:001BH等。中断服务程序的入口地址(中断向量)详见第6章相关内容。
由于相邻入口地址的间隔区间仅仅有8B,一般情况下无法保存完整的中断服务程序,因此在中断响应的地址区域存放一条无条件转移指令,指向真正存放中断服务程序的空间。
2.程序读取等待时间的控制
程序读取等待时间的选择由程序读取等待控制寄存器(WTST)实现,如表3.19所示为WTST与程序读取等待时间的关系。
表3.19 WTST与程序读取等待时间的关系
每条指令实际的执行时钟数为指令时钟数加上程序存储器的等待时钟数。
注意: WTST的上电默认值为7,当用户的工作频率在35MHz以下时,建议将此数值修改为0,这样可加快CPU运行程序的速度。
3.Keil C251中对程序存储器的设置
当程序代码的大小在64KB内时,选择Large模式;当程序代码的大小超64KB时,选择Huge模式,并需要保证单个函数、单个文件的代码大小,以及单个表格的数据量也在64KB以内,同时还需要设置External Memory。
STC32G12K128单片机的edata区域可对32bit/16bit/8bit的数据进行单时钟读写访问,其xdata区域可对16bit/8bit的数据进行读写访问。edata区域的SRAM最大存储深度为64KB;xdata区域的SRAM最大存储深度为8MB。
STC32G12K128单片机的SRAM总共有12KB(4KB edata+8KB xdata)。edata的地址范围是00:0000H~00:0FFFH,单时钟周期存取,访问速度快,可作为堆栈使用,成本高;xdata的地址范围是01:0000H~01:1FFFH,存取需要2~3个时钟周期,访问速度慢,成本低。
1.edata(00:0000H~00:0FFFH)
STC32G12K128单片机的edata共4KB,其中低端的256B与传统8051的DATA区域(256B)完全兼容,可分为2个部分:低128B的RAM(可直接寻址也可间接寻址,00H~1FH为工作寄存器组,20H~7FH为位寻址区,每个存储位都可以直接访问)和高128B的RAM(只能间接寻址)。特殊功能寄存器SFR分布在80H~FFH区域,只可直接寻址。
工作寄存器组有4个,分别称为0组、1组、2组和3组,每组有8个地址单元,当前工作寄存器的8个地址单元可分别用R0~R7来表示。通过PSW或PSW1中的RS1、RS0来选择当前工作寄存器组,详见后文对PSW或PSW1的说明。
在C语言代码中将变量声明在edata区域,即可实现单时钟周期进行32bit/16bit/8bit的读写操作:
2.xdata(01:0000H~01:1FFFH)
访问STC32G12K128单片机的xdata(内部扩展RAM)的方法与访问传统8051单片机外部扩展RAM的方法相同,但是此行为不影响P0、P2、RD、WR和ALE等端口的信号。
在C语言中,要想使用xdata,在定义变量时采用xdata关键字声明存储类型即可,如:
在C语言代码中将变量声明在xdata区域,即可实现8bit/16bit的读写操作:
是否可以访问xdata,由辅助寄存器AUXR中的B1(EXTRAM)位控制。当EXTRAM=0时,禁止访问外部扩展RAM,即允许访问内部扩展RAM(xdata);当EXTRAM=1时,允许访问外部扩展RAM,即禁止访问内部扩展RAM(xdata)。
需要根据系统时钟的数值对xdata进行访问,访问速度由CKCON中的CKCON.2~CKCON.0(CKCON[2:0])控制,默认值为7。
注意: STC32G12K128单片机具有扩展64KB外部数据存储器的能力。访问外部数据存储器期间,WR、RD、ALE信号要有效。访问外部数据存储器时,需要根据系统时钟的数值及外部数据存储器的存取速度设置外部xdata访问速度控制寄存器BUS_SPEED。但实际应用时,不建议扩展外部数据存储器。
STC32G12K128单片机的特殊功能寄存器分布在两个区域:一个是位于与传统8051单片机兼容的edata区域,称为特殊功能寄存器(SFR),地址范围是80H~FFH,特殊功能寄存器列表详见附表C.1;另一个是分布在xdata区域,称为扩展特殊功能寄存器(XFR),地址范围是7EFE00H~7EFEFFH,具体的扩展特殊功能寄存器分解到在各个端口电路中学习,扩展特殊功能寄存器列表详见附表C.2。XFR的访问受P_SW2.7(EAXFR)控制,当EAXFR=0时,禁止访问XFR;当EAXFR=1时,允许访问XFR。
所有的特殊功能寄存器既可以通过字节寻址,又可以通过位寻址。
1.程序状态寄存器(PSW)与程序状态寄存器1(PSW1)
PSW与PSW1的格式如表3.20所示。
表3.20 PSW与PSW1的格式
PSW.7、PSW1.7(CY):进位标志位。加法运算中,当最高位有进位时,CY为1;减法运算中,当最高位有借位时,CY为1。
PSW.6、PSW1.6(AC):半进位标志位。BCD码运算中,当低位向高位有进位或借位时,AC为1。
PSW.5(F0):通用标志位,用户自定义。
PSW1.5(N):计算结果负标志位。运算结果的最高位为1时该位为1,否则为0。
PSW.4、PSW1.4(RS1)/PSW.3、PSW1.3(RS0):工作寄存器选择位。当RS1/RS0=0/0时,选择第0组工作寄存器(00H~07H);当RS1/RS0=0/1时,选择第1组工作寄存器(08H~0FH);当RS1/RS0=1/0时,选择第2组工作寄存器(10H~17H);当RS1/RS0=1/1时,选择第3组工作寄存器(18H~1FH)。
PSW.2、PSW1.2(OV):溢出标志位。有符号运算中,运算结果有溢出时,OV为1。当运算中最高位与次高位的进位或借位情况不一致时,表示有溢出,OV为1。
PSW1.1(Z):计算结果零标志位。运算结果为0时该位为1,否则该位为0。
PSW.0(P):ACC的奇偶校验标志位。当ACC中“1”的个数为奇数时,该位为1,否则该位为0。
2.只读特殊功能寄存器(CHIPID)中存储的重要参数
STC32G12K128单片机内部的CHIPID中保存有与单片机相关的一些特殊参数,包括全球唯一ID号、32kHz掉电唤醒专用定时器的频率值、内部1.19V参考信号源值及IRC参数,如表3.21所示,有关存储数据的解读详见STC32单片机技术手册。在用户程序中只能读取CHIPID中的内容,不可修改。
表3.21 CHIPID中保存的特殊参数
续表
STC32G12K128单片机内部集成了大容量的EEPROM。利用ISP/IAP技术可将内部Data Flash当作EEPROM使用,擦写次数在10万次以上。EEPROM可分为若干个扇区,每个扇区为512B。
EEPROM的写操作只能将1写为0,当需要将0写为1时,则必须执行扇区擦除操作。EEPROM的读/写操作是以1B为单位进行的,而EEPROM擦除操作是以1扇区(512B)为单位进行的,在执行擦除操作时,如果目标扇区中有需要保留的数据,则必须预先将这些数据读取到RAM中暂存,待擦除完成后再将保存的数据和需要更新的数据一起写回EEPROM/Data Flash。所以,在使用EEPROM时,建议同一次修改的数据放在同一个扇区,不是同一次修改的数据放在不同的扇区,不一定要把扇区用满。
EEPROM可用于保存一些需要在应用过程中修改并且掉电不丢失的数据。在用户程序中,可以对EEPROM进行字节读/字节编程/扇区擦除操作。在工作电压偏低时,建议不要进行EEPROM操作,以免数据丢失。
1.EEPROM的大小及地址
EEPROM的起始地址固定为FE:0000H。
EEPROM的大小需要在进行ISP下载时设置,如图3.9所示,若要设置用户EEPROM的大小为64KB,即从“设置用户EEPROM大小”的下拉选项中选择“64K”。
图3.9 EEPROM大小的设置
2.EEPROM的操作
访问EEPROM的方式有两种:IAP方式和MOV方式。IAP方式可对EEPROM执行读、写、擦除操作,但MOV方式只能对EEPROM进行读操作,而不能进行写和擦除操作。
无论是使用IAP方式还是使用MOV方式访问EEPROM,首先都需要设置正确的目标地址。使用IAP方式时,地址数据为EEPROM的目标地址,地址从000000H开始;若使用MOV指令读取EEPROM数据,则地址数据为基地址(FE:0000H)加上EEPROM的目标地址。与IAP操作相关的特殊功能寄存器如表3.22所示。
表3.22 与IAP操作相关的特殊功能寄存器
(1)IAP数据寄存器:IAP_DATA。
在进行EEPROM的读操作时,命令执行完成后读出的EEPROM数据保存在IAP_DATA中。在进行EEPROM的写操作时,在执行写命令前,必须将待写入的数据存放在IAP_DATA中,再发送写命令。擦除EEPROM 命令与IAP_DATA寄存器无关。
(2)IAP地址寄存器:IAP_ADDRE、IAP_ADDRH、IAP_ADDRL。
EEPROM地址有24位,IAP_ADDRE存放其高8位,IAP_ADDRH存放其中间8位,IAP_ADDRL存放其低8位。
(3)IAP命令寄存器:IAP_CMD。
CMD[2:0]用于发送EEPROM操作命令。
000:空操作。
001:读EEPROM字节命令。读取目标地址ADDR[23:0]所在的1字节。
010:写EEPROM字节命令。写目标地址ADDR[23:0]所在的1字节。
011:擦除EEPROM扇区。擦除目标地址ADDR[23:9]所在的1扇区(512B)。
(4)IAP控制寄存器:IAP_CONTR。
IAPEN:EEPROM操作使能控制位。当IAPEN=0时,禁止EEPROM操作;当IAPEN=1时,使能EEPROM操作。
SWBS、SWRST:软件复位控制位,其具体用法详见本书软件复位相关内容。
CMD_FAIL:EEPROM操作失败状态位,需要通过软件清零。当CMD_FAIL=0时,说明EEPROM操作正确;当CMD_FAIL=1时,说明EEPROM操作失败。
(5)IAP触发寄存器:IAP_TRIG。
设置完EEPROM读、写、擦除的命令寄存器、地址寄存器、数据寄存器及控制寄存器后,需要向触发寄存器IAP_TRIG依次写入5AH、A5H(顺序不能交换)两个触发命令来触发相应的读、写、擦除操作。
(6)IAP等待时间控制寄存器:IAP_TPS。
根据不同的工作频率来设置IAP_TPS。
以IAP方式访问EEPROM时,不同操作的操作时间是不一样的:读取1个字节需要4个系统时钟周期,写1个字节需要30~40μs,擦除1个扇区(512B)需要4~6ms。
EEPROM操作所需的时间是硬件自动控制的,用户只需要正确设置IAP_TPS寄存器即可。
IAP_TPS=系统工作频率/1000000(小数部分四舍五入进行取整)。例如系统工作频率为12MHz,则IAP_TPS设置为12;系统工作频率为22.1184MHz,则IAP_TPS设置为22;系统工作频率为5.5296MHz,则IAP_TPS设置为6。