- 打卡等级:以坛为家III
- 打卡总天数:686
- 最近打卡:2025-10-16 00:04:51
论坛元老
- 积分
- 6321
|
发表于 2025-10-8 19:01:06
|
显示全部楼层

STC32G系列单片机兼容MCS—251 ISA,因此支持用于程序和数据的多个物理分离的存储区域或存储器空间
每个存储区域都有一定的优点和缺点
这些存储空间可能是读取但不写入、读取或写入、比其他存储空间更快地读取或写入
STC32G系列单片机上可用的各种存储空间与大多数大型计算机、小型寄存器和微型计算机架构有很大的不同
在这些架构中,程序、数据和常数都加载到计算机内的同一物理存储空间
存储器区域 - Flash -FF:xxxx
--程序存储器
程序(CODE)存储器为只读。在STC32G系列单片机中程序存储器位于单片机的内部
该单片机支持高达64KB的程序存储器。然而,可以使用代码库来扩展程序空间
一些单片机提供了更大的代码空间
程序代码,包含所有函数和库例程,保存在程序存储器中□
常数变量也可以保存在程序存储器中
STC32G系列仅执行保存在程序存储器中的程序
通过使用存储器类型标识符code,C语言程序可以访问程序存储器区域
-程序存储器
声明code对象的用法如下:
unsigned char code code_constant;
注:存储器类型code是为了与C51编译器兼容而实现的。应该使用const near或const far代替代码。这通常会生成更好的代码,应该在新的STC32G系列单片机中使用,而不是存储器类型code
存储器区域 - 00:xxxx
-内部数据存储器
内部数据存储器位于STC32G系列单片机的内部,并且是读/写的
data和idata存储区域位于STC32G系列单片机内,并且可以写入和读取
data存储器是片上存储器的前128字节。idata存储器是片上存储器的前256个字节。还有一个从20h开始的16字节区域,可用短8051兼容指令进行位寻址
声明idata变量的方法如下:
unsigned char idata variable;
对内部数据存储器的访问非常快,因为它可以使用8位地址访问
存储器区域
-内部数据存储器
内部数据存储器可以分为三种不同的数据类型,包括data
bdata ebdata
存储器区域
-内部数据存储器
存储器说明符data是指内部数据存储器的前128个字节□
此处保存的变量使用直接寻址进行访问■声明data变量,如下所示:
unsigned char data fast_variable ;
存储器区域
-内部数据存储器
存储器说明符bdata指定的内部数据区(20h~2Fh)中的16字节可位寻址的存储器
该存储器类型说明符允许程序开发人员声明也可以在位级别访问的数据类型
声明bdata变量,如下所示:
unsigned char bdata bdata_var;
存储器区域
-内部数据存储器
存储器说明符ebdata是指内部数据区(20h~7Fh)中的扩展251 共768位可寻址存储器
该存储器类型说明符允许程序开发人员声明也可以在位级别访问的数据类型
然而,与bdata存储区域相比,对ebdata存储器的位访问需要更长的操作码编码
声明edata变量,如下所示:
unsigned int ebdata eb_var ;
存储器区域
-内部数据存储器
【例8—1】存储器说明符ebdata的用法
struct s{ //定义结构体s
unsigned intb0:3; //整型变量b0,分配3个二进制位
unsigned intb1:2; //整型变量b1,分配2个二进制位
unsigned intb2:1; //整型变量b2,分配1个二进制位
unsigned intb3:1; //整型变量b3,分配1个二进制位
unsigned intb4:1; //整型变量b4,分配1个二进制位
unsigned intb5:1; //整型变量b5,分配1个二进制位
unsigned intb6:1; //整型变量b6,分配1个二进制位
unsigned intb7:4; //整型变量b7,分配4个二进制位};
存储器区域
-内部数据存储器 struct s ebdata v; //声明结构体变量v,且保存在ebdata区域
void main(void) { //声明主程序main
v.b0=4; //结构变量v的元素b0赋值为4
v.b1=3; //结构变量v的元素b1赋值为3
v.b7=15; //结构变量v的元素b7赋值为15
if (v.b1) { //如果结构变量v的元素b1的值不为0
v.b0=7; //结构变量v的元素b0赋值为7
}
}
存储器区域
-内部数据存储器
对于上面的设计代码,变量的位分配
位号 0x20.7 0x20.6 0x20.5 0x20.4 0x20.3 0x20.2 0x20.1 0x20.0
变量 v.b7 v.b6 v.b5
位号 0x21.7 0x21.6 0x21.5 0x21.4 0x21.3 0x21.2 0x21.1 0x21.0
变量 v.b4 v.b3 v.b2 v.b1 v.b0
存储器区域
-内部数据存储器
0xFF0000 020030 UJMP C:0x0030
14:void main(void){
15: v.b0=4;
0xFF0003 7E3520 MOV WR6,v(0x20)
0xFF0006 5E70F8 ANL R7,#0xF8
0xFF0009 4E7004 ORL R7,#0x04 //R7[3:0]=0x04
0xFF000C 7A3520 MOV v(0x20),WR6 // {R6, R7}=WR6
16: v.b1=3;
0xFF000F 4E7018 ORL R7,#0x18 //0x18逻辑“或”R7,R7.4,R7.3置1 0xFF0012 7A3520 MOV v(0x20),WR6 //
17: v.b7=15;
0xFF0015 4E603C ORL R6,#0x3C
0xFF0018 7A3520 MOV v(0x20),WR6
存储器区域
-外部数据存储器
片内/片外的外部数据存储器是读/写的
由于外部数据存储器是通过数据指针寄存器(必须加载地址)间接访问的,因此它比访问内部数据存储器慢
STC32G系列单片机提供了片上XRAM空间,该空间使用与传统外部数据空间相同的指令进行访问。该XRAM空间通常通过配置SFR寄存器启用,并于外部存储器空间重叠
可能有多达64KB的外部数据存储器。然而,该地址空间不一定必须用作存储器。硬件设计可能会将外设映射到存储器空间中。如果是这种情况,开发的程序将访问外部数据存储器来编程和控制外设。这种技术称为存储器映射的I/O
声明xdata变量的方法如下:
开发的程序将访问外部数据存储器来编程和控制外设。这种技术称为存储器映射的I/O sfr 80H~FF,
PWM, USB,....声明xdata变量的方法如下:
unsigned charxdlata variable;
存储器区域
-近存储器
近存储器(nearmemory)区域的地址范围为00:0000~00:FFFF,这是STC32G系列单片机存储器的前64KB
部分寄存器位于STC32G系列单片机的内部,并且可以使用16位寻址进行快速的访问
近存储器区域在汇编语言级别由存储器类EDATA或ECONST表示,使用直接寻址访问保存在近存储器中的变量
声明near对象的方法如下:
unsigned charnear near_variable;
存储器区域
-远存储器
远存储器(farmemory)区域表示STC32G系列单片机的完整地址范围
远存储器区域在汇编语言级别中使用存储器类HDATA或HCONST表示
使用间接寻址来访问存储器类型far定义的变量
地址计算仅为16位,因此将远对象的数据大小限制为64KB
然而,远变量可以驻留在存储器中的任何位置,这允许总大小多达16MB
存储器区域
-远存储器
声明far对象的方法如下:
unsigned charfar far_variable[0x10000];
unsigned charconst far far_const_variable[0x4000]= {1,2,3,...};
unsigned int i;
unsigned charfar_func (void) {
return(far_variable);
存储器区域
-大存储器
与far相反,huge使用32位运算进行地址计算,因此允许无限的对象大小
程序开发人员可以有一个数MB大小的单个数组或结构
在大存储器(hugememory)中,声明的变量的大小可以达到16MB-1
存储器区域
-大存储器
声明huge对象的方法如下:
unsigned charhuge huge_variable[0x50000];
unsigned charconst huge huge_const_variable[0x20000] = {1,2,3,...};
unsigned longl;
unsigned intfunction (void) {
return (huge_variable[l]);
}
存储器区域
--SFR存储器
STC32G系列单片机为SFR提供128字节的存储器
SFR是位、字节或字大小的寄存器,用于控制定时器、计数器、串行I/O和外设
注:可以使用MOV指令直接访问SFR存储器,不能使用间接寻址模式
|
|