《STC8A8K64S4A12开发板》——片上存储器讲解
一、硬件设计?
1.有关存储器概念介绍
RAM(全称是随机存取存储器) 随机存取存储器通常称为随机存取存储器。这种存储器在断电时会丢失其存储内容,因此主要用于存储短时间使用的变量或程序。它的优点是可以随时读写,而且速度非常快。它通常用作操作系统或其他正在运行的程序的临时数据存储介质。
ROM(全称是Read-Only Memory)只读存储器,通常称为只读存储器,是一种只能读出以前存储的数据的固态半导体存储器。与随机存取存储器不同,它可以快速、轻松地重写并存储在其中。数据。其优点是存储的数据稳定,断电后存储的数据不会丢失。
EPROM(全称是Erasable Programmable Read-Only Memory)是一种可重写存储器,断电时其内容不会丢失。换句话说,它是非易失性的。它通过EPROM编程器进行编程,它可以提供比正常工作电压更高的电压来对EPROM进行编程。一旦编程,EPROM 只能通过暴露在强紫外线下才能擦除。为了擦除,EPROM陶瓷封装有一个小的石英窗口。这种石英窗通常用不透明胶带覆盖。擦除时,将胶带撕下,然后置于强紫外线下照射约20分钟。
EEPROM(全称Electrically Erasable Programmable Read-Only Memory)是一种电可擦除可编程只读存储器,其内容在断电时不会丢失。一般情况下,EEPROM与EPROM一样是只读的。当需要写入时,可在指定引脚上施加高电压进行写入或擦除,其擦除速度极快。通常EEPROM芯片分为两种类型:串行EEPROM和并行EEPROM。读写串行EEPROM 时,数据输入/输出通过2 线、3 线、4 线或SPI 总线接口进行,而并行EEPROM 数据输入/输出则通过并行总线进行。
FLASH闪存结合了ROM和RAM的优点。它不仅具有电可擦除可编程(EEPROM)的性能,而且断电时也不会丢失数据。同时可以快速读取数据。因此,当今大多数微控制器都集成了这种存储器。并且由于FLASH的成本远低于EEPROM(又称E2PROM),因此常常会在微控制器中集成更大的FLASH存储器供用户使用。在单片机的应用中,开发调试成功后的应用程序往往存放在程序存储器中,而FLASH存储器是一种理想的程序存储器。
FRAM(全称是Ferroelectric Random Access Memory)铁电随机存储器常被称为铁电存储器。这种存储器的核心技术是铁电晶体材料。这种特殊材料使得铁电存储器也具有随机存取存储器(RAM)。以及非易失性存储器的特性。
根据存储器是否位于微控制器内部,存储器可以分为片内存储器和片外存储器。以下存储器均为片外存储器。
图1:外部存储器物理图
注:根据存储器与单片机之间的接口是并行还是串行,存储器可分为串行存储器和并行存储器。
2.STC8A8K64S4A12系列单片机片内存储器介绍
STC8A8K64S4A12系列单片机具有(8192+256)字节(为了方便描述通常称8K字节)数据存储器、存储空间为16KB~64KB的FLASH程序存储器、存储空间为4KB的E2PROM存储器至48KB。如下表所示。
表1:STC8A8K64S4A12系列微控制器片上存储器
序列号
单片机型号
静态随机存储器
闪光
可编程只读存储器
评论
1
STC8A8K08S4A12
8K字节
8K字节
56K字节
具有模拟功能
2
STC8A8K16S4A12
8K字节
16K字节
48K字节
具有模拟功能
3
STC8A8K24S4A12
8K字节
24K字节
40K字节
具有模拟功能
4
STC8A8K32S4A12
8K字节
32K字节
32K字节
具有模拟功能
5
STC8A8K40S4A12
8K字节
40K字节
24K字节
具有模拟功能
6
STC8A8K48S4A12
8K字节
48K字节
16K字节
具有模拟功能
7
STC8A8K56S4A12
8K字节
56K字节
8K字节
具有模拟功能
8
STC8A8K60S4A12
8K字节
60K字节
4K字节
具有模拟功能
9
STC8A8K64S4A12
8K字节
64K字节
- -
具有模拟功能
SRAM和DRAM的区别
SRAM(全称是Static Random Access Memory)静态随机存储器常被称为静态存储器。所谓“静态”,就是指只要通电,这块内存中存储的数据就可以一直保持不变。
DRAM(全称是Dynamic Random Access Memory)动态随机存取存储器通常被称为动态存储器。所谓“动态”,是指这种存储器需要每隔一段时间刷新一次、充电一次,否则内部数据就会消失。
SRAM和DRAM都是RAM存储器,断电后所有存储的数据都会丢失。 SRAM的优点是只需要刷新和充电一次,而DRAM需要每隔一段时间刷新和充电一次。 SRAM的缺点是与DRAM相比,集成度较低、功耗较高、尺寸较大、价格较高。
注:STC8A8K64S4A12 微控制器集成了片上SRAM。
STC8A8K64S4A12系列微控制器片上SRAM
与程序存储器相对应的另一种类型的存储器称为数据存储器。数据存储器可以在操作过程中临时存储数据、中间结果、缓冲区和标志位。数据存储器一般选用RAM来存储数据。
STC8A8K64S4A12系列单片机的片内RAM类型为静态存储器SRAM。片上SRAM的大小为(8192+256)字节。 (8192+256)字节SRAM在物理上和逻辑上分为2个地址空间:内部RAM(256字节)和内部扩展RAM(8192字节)。
STC8A8K64S4A12系列单片机的256字节内部RAM分为三部分:低128字节RAM(兼容传统8051)、高128字节RAM(Intel在8052中扩展了高128字节RAM)和特殊功能寄存器区域。高128字节RAM和特殊功能寄存器区域看似共享相同的地址范围,但它们在物理上是独立的,使用时通过不同的寻址方式来区分。如下图所示。
图2:STC8A8K64S4A12系列单片机内部RAM分配示意图
注:直接寻址、间接寻址、立即寻址是CPU通过总线与内存交互时,不同交互方式产生的三个概念词。我这里就不详细介绍了。学过汇编的同学很容易理解它们之间的区别。
STC8A8K64S4A12系列单片机除了集成256字节SRAM外,还集成了8192字节SRAM(通常称为内部扩展RAM)。地址范围为:0000H~1FFFH。访问内部扩展RAM的方法与传统8051单片机访问外部扩展RAM的方法相同。但STC8A8K64S4A12系列单片机对内部扩展RAM的访问不会影响P0口、P2口、WR引脚、RD引脚和ALE引脚。
STC8A8K64S4A12系列单片机的片内扩展RAM是否可以访问是由辅助寄存器的B1位控制的,如下图所示。
图3:辅助寄存器AUXR
注:一般情况下,EXTRAM 位默认为0,这允许使用逻辑上位于片外、物理上位于片上的扩展SRAM。
STC8A8K64S4A12系列微控制器具有片上E2PROM。在项目应用中,经常有一些非常重要的数据,在断电时不需要丢失。这些数据需要保存在非易失性存储器中。这些非易失性存储器可以是微控制器内部的非易失性存储器,也可以是微控制器外部的非易失性存储器。 STC8A8K64S4A12系列微控制器在片上集成了不同容量的E2PROM(STC8A8K64S4A12没有片上E2PROM)。它与程序空间分离,可擦写10万次以上。用户可以用它来存储一些重要的数据,断电时也不会丢失。
STC8A8K64S4A12系列单片机的片上E2PROM以扇区为单位运行,每个扇区包含512字节。使用片上E2PROM时,建议同时修改的数据放在同一扇区。不同时间需要修改的数据不应该放在同一个扇区。每个扇区不必都是满的。
表2:STC8A8K64S4A12系列单片机片内E2PROM空间大小及地址
序列号
单片机型号
可编程只读存储器
扇区数量
E2PROM起始扇区首地址
E2PROM结束扇区结束地址
评论
1
STC8A8K08S4A12
56K字节
112
0000小时
DFFFh
这里E2PROM起始扇区的首地址和结束扇区的结束地址是用IAP字节读取的。 (使用MOVC指令读取时地址不同)
2
STC8A8K16S4A12
48K字节
96
0000小时
好朋友
这里E2PROM起始扇区的首地址和结束扇区的结束地址是用IAP字节读取的。 (使用MOVC指令读取时地址不同)
3
STC8A8K24S4A12
40K字节
80
0000小时
9FFF小时
这里E2PROM起始扇区的首地址和结束扇区的结束地址是用IAP字节读取的。 (使用MOVC指令读取时地址不同)
4
STC8A8K32S4A12
32K字节
64
0000小时
7FFF小时
这里E2PROM起始扇区的首地址和结束扇区的结束地址是用IAP字节读取的。 (使用MOVC指令读取时地址不同)
5
STC8A8K40S4A12
24K字节
48
0000小时
5FFF小时
这里E2PROM起始扇区的首地址和结束扇区的结束地址是用IAP字节读取的。 (使用MOVC指令读取时地址不同)
6
STC8A8K48S4A12
16K字节
32
0000小时
3FFF小时
这里E2PROM起始扇区的首地址和结束扇区的结束地址是用IAP字节读取的。 (使用MOVC指令读取时地址不同)
7
STC8A8K56S4A12
8K字节
16
0000小时
1FFF小时
这里E2PROM起始扇区的首地址和结束扇区的结束地址是用IAP字节读取的。 (使用MOVC指令读取时地址不同)
8
STC8A8K60S4A12
4K字节
8
0000小时
0FFF小时
这里E2PROM起始扇区的首地址和结束扇区的结束地址是用IAP字节读取的。 (使用MOVC指令读取时地址不同)
注:STC8A8K64S4A12 微控制器的E2PROM 大小可以在下载的软件中配置。用户应该知道分配了多少E2PROM存储空间,相应的FLASH存储空间会减少多少。
STC8A8K64S4A12单片机中配置的E2PROM是从FLASH空间的高位存储区规划到低位存储区的。配置方法如下图所示。
图4:STC-ISP下载接口E2PROM配置(适用于STC8A8K64S4A12)
STC8A8K64S4A12系列单片机中FLASH空白区域的填充值是可以配置的。填充值可以是FF或者00。下载程序到单片机时可以按照下图进行。
图5:STC-ISP 下载接口选项说明
注:填充值建议选择FF。 (默认选择也是FF)
二、软件设计
1.片内存储器寄存器汇集
STC8A8K64S4A12系列单片机在操作片上存储器时使用8个寄存器,如下表所示:
表3:STC8A8K64S4A12系列片上存储器操作中使用的寄存器汇总
序列号
注册名称
读/写
功能说明
1
辅助接收器
读/写
辅助寄存器
2
IAP_数据
读/写
IAP数据寄存器
3
IAP_CMD
读/写
IAP命令寄存器
4
IAP_TRIG
读/写
IAP触发寄存器
5
IAP_CONTR
读/写
IAP控制寄存器
6
IAP_地址
读/写
IAP地址寄存器
7
IAP_ADDRL
读/写
IAP地址寄存器
注意:在操作STC8A8K64S4A12 系列单片机的片上E2PROM 时,必须仔细定义操作地址(即ISP/IAP 地址寄存器的值),以避免操作到不适当或无效的区域。
2.寄存器解析
2.1.IAP命令寄存器IAP_CMD
IAP命令寄存器IAP_CMD的CMD0位和CMD1位的组合用于选择用户应用程序区域的操作模式。
图6:IAP命令寄存器IAP_CMD
2.2.IAP触发寄存器IAP_TRIG
IAP触发寄存器IAP_TRIG:用于触发对用户应用区域的读、写、擦除操作。每次执行读、写或擦除操作时,必须先使能IAPEN 位(即将IAPEN 位设置为1),然后向IAP_TRIG 寄存器写入0x5A,再写入0xA5,这样操作命令才会采取影响。
图7:IAP命令触发寄存器
2.3.IAP控制寄存器IAP_CONTR
IAP控制寄存器IAP_CONTR主要用于配置用户应用区读、写、擦除操作时的功能选择。 IAPEN 是主操作开关。 SWBS 位和SWRST 位一起使用来控制软件复位和启动。在执行程序区,CMD_FAIL位用于指示操作是否成功。如果不成功,会自动设置为1(需要软件清零)。
图8:ISP/IAP控制寄存器
注:STC8A8K64S4A12 系列微控制器建议针对不同系统时钟设置等待时间。用户应该知道,等待时间是由硬件自动完成的,不需要用户在软件中添加额外的软件延迟。另外,如果用户使用MOVC指令进行读操作,CPU不需要等待时间。
3.片内EEPROM读写 - 单个字节(STC8A8K32S4A12)
注:本节实验源码是在“实验2-8-1:串口1收发实验(P3.0和P3.1)”的基础上修改的。本节对应的实验源码为:《实验2-11-1:片内EEPROM读写——单字节(STC8A8K32S4A12)》。
3.1.工程需要用到的c文件
本例所需的c文件如下表所示。项目需要添加下表中的c文件。
表4:实验所需的c文件
序列号
文件名
后缀
功能说明
1
串口
.c
包含与用户uart相关的用户自定义函数
2
EEPROM
.c
与E2PROM相关的用户定义函数
3
延迟
.c
包含用户定义的延迟功能
3.2.头文件引用和路径设置
需要引用的头文件
#include 'delay.h' #include 'uart.h' #include 'eeprom.h' 需要包含的头文件路径
本例中需要包含的头文件路径如下:
表5:头文件包含路径
序列号
小路
描述
1
…\ 来源
uart.h、eeprom.h和delay.h头文件都在这个路径中,所以必须包含它们
2
…\用户
STC8.h头文件就在这个路径下,所以必须包含它
点击MDK中的魔棒,打开项目配置窗口,添加头文件包含路径,如下图所示。
图9:添加头文件包含路径
3.3.编写代码
首先,将用于操作E2PROM外设的函数写入eeprom.c文件中,如下表所示。
表6:E2PROM相关用户函数集合
序列号
函数名
功能说明
1
禁用_EEPROM
禁止对用户应用程序区域进行读、写和擦除操作
2
EEPROM_read_n
在指定地址读取n个字节的数据
3
EEPROM_扇区擦除
擦除指定地址扇区
4
EEPROM_write_n
将n字节数据写入指定地址
关于E2PROM相关的各个用户函数,下面详细给出代码。
程序列表:禁止访问ISP/IAP 功能
/**************************************************** * ************************ * 描述: 禁止访问ISP/IAP * 输入参数: None * 返回值: None ******** ****************************************************** * ****************/无效Disable_EEPROM(无效) { IAP_CONTR=0x00; //给ISP/IAP控制寄存器赋值,IAPEN位为0,禁止ISP/IAP操作IAP_CMD=0x00 ; //清除ISP/IAP命令寄存器位,去除ISP/IAP命令IAP_TRIG=0x00; //清除ISP/IAP命令触发寄存器位,防止ISP/IAP命令意外触发IAP_ADDRH=0x80; //ISP/IAP地址分配寄存器高8位IAP_ADDRL=0x00; //分配ISP/IAP地址寄存器的低8位,指向非EEPROM区域,防止误操作} 程序列表:在指定地址读取n个字节的数据函数
/**************************************************** * ************************** * 说明: 从指定EEPROM 首地址读取n 个字节,放入指定缓冲区* 输入参数: EE_address: 读取DataAddress:EEPROM 的首地址。 Number:读数据缓冲区首地址。读取字节长度*。返回值:无******************************************** ******************************/void EEPROM_read_n(uint16 EE_address,uint8 *DataAddress,uint16 number) { EA=0; //禁用总中断IAP_CONTR |=0x80; //IAPEN位0,允许ISP/IAP操作IAP_CONTR |=0x03; //WT0和WT1位置1,用于设置CPU等待时间IAP_CONTR=0xFB; //WT2位置0,用于设置CPU等待时间IAP_CMD=0x01; //MS0位置1,MS1位置0,对ISP/IAP执行字节读操作do { IAP_ADDRH=EE_address/256; //ISP/IAP地址寄存器的高8位赋值IAP_ADDRL=EE_address % 256; //ISP/IAP地址寄存器低8位赋值IAP_TRIG=0x5A; //ISP/IAP命令触发寄存器赋值为5AH IAP_TRIG=0xA5; //ISP/IAP命令触发给A5H赋值_nop_(); //空命令*DataAddress=IAP_DATA; //读取ISP/IAP数据寄存器的值并发送给指定缓存EE_address++;数据地址++; } while(- -数字);禁用_EEPROM(); //禁止访问ISP/IAP EA=1; //使能总中断}程序列表:擦除指定地址扇区功能
/**************************************************** * ************************** * 说明: 擦除指定地址处的EEPROM 扇区* 输入参数: EE_address: 读取EEPROM 首地址DataAddress:读取数据缓冲区的首地址。 number: 读取的字节长度。 * 返回值: 无************************************************ *********************************/void EEPROM_SectorErase( uint16 EE_address) { EA=0; //禁用总中断IAP_ADDRH=EE_address/256; //分配ISP/IAP地址寄存器的高8位IAP_ADDRL=EE_address % 256; //分配ISP/IAP地址寄存器的低8位IAP_CONTR |=0x80; //IAPEN位0,允许ISP/IAP操作IAP_CONTR |=0x03; //WT0和WT1位1,用于设置CPU等待时间IAP_CONTR=0xFB; //WT2位0,用于设置CPU等待时间IAP_CMD=0x03; //MS0位1,MS1位1,对ISP/IAP执行扇区擦除操作IAP_TRIG=0x5A; //ISP/IAP命令触发赋值为5AH IAP_TRIG=0xA5; //ISP/IAP命令触发赋值For A5H _nop_(); //清空命令Disable_EEPROM(); //禁止访问ISP/IAP EA=1; //重新使能中断}程序列表:向指定地址写入n字节数据函数
/**************************************************** * ***************************** * 描述: 从指定的EEPROM 首地址读取n 个字节,放入指定的缓冲区* 输入参数: EE_address: Write EEPROM 首地址DataAddress: 写入源数据的缓冲区首地址number: 写入字节长度* 返回值: 无******************** ****************************************************** ************** */void EEPROM_write_n(uint16 EE_address,uint8 *DataAddress,uint16 number) { EA=0; //禁用总中断IAP_CONTR |=0x80;
//IAPEN位置0,允许ISP/IAP操作 IAP_CONTR |= 0x03; //WT0和WT1位置1,用于设置CPU等待时间 IAP_CONTR &= 0xFB; //WT2位置0,用于设置CPU等待时间 IAP_CMD = 0x02; //MS0位置0,MS1位置1,对ISP/IAP进行字节写操作 do { IAP_ADDRH = EE_address / 256; //ISP/IAP地址寄存器高8位赋值 IAP_ADDRL = EE_address % 256; //ISP/IAP地址寄存器低8位赋值 IAP_DATA = *DataAddress; //将指定缓存数据送往ISP/IAP数据寄存器 IAP_TRIG = 0x5A; //ISP/IAP命令触发寄赋值为5AH IAP_TRIG = 0xA5; //ISP/IAP命令触发寄赋值为A5H _nop_(); //空命令 EE_address++; DataAddress++; }while(--number); Disable_EEPROM(); //禁止访问ISP/IAP EA = 1; //开启总中断 }注:以上关于E2PROM的用户自定义函数有对EA的操作,即操作E2PROM相关寄存器之前关掉总中断EA,之后再打开总中断EA。这在官方手册提供的例程中并没有,这个仅供用户参考。 然后,在主函数中对串口1进行初始化,通过串口1发送不同的命令实现对单片机片内E2PROM的单字节读、写及扇区擦除等操作。(注意读写的首地址) 代码清单:主函数 int main() { P3M1 &= 0xFE; P3M0 &= 0xFE; //设置P3.0为准双向口 P3M1 &= 0xFD; P3M0 |= 0x02; //设置P3.1为推挽输出 Uart1_Init(); //串口1初始化 EA = 1; //使能总中断 delay_ms(10); //初始化后延时 while (1) { if(WriteFLAG) //写模式 { WriteFLAG=0; //写标志变量清零,发送一次 EEPROM_write_n(0x0000,scan,1); //在EEPROM的首地址为0x0000处写入1个字节 SendDataByUart1(0x33); //串口1发送数据0x33 } if(ReadFLAG) //读模式 { ReadFLAG=0; //读标志变量清零,发送一次 EEPROM_read_n(0x0000,buffer,1); //在EEPROM的首地址为0x0000处读取1个字节存入buffer数组中 SendStringByUart1_n(buffer,1); //串口1发送buffer中存的数据 } if(ClearFLAG) //扇区擦除模式 { ClearFLAG=0; //清除标志变量清零,发送一次 EEPROM_SectorErase(0x0000); //对EEPROM的首地址为0x0000处的扇区进行扇区擦除 SendDataByUart1(0x00); //串口1发送数据0x00 } } }
用户评论
这款STC8A8K64S4A12开发板真是太棒了,对于学*单片机来说,内置的片内存储器给了我们极大的便利。
有8位网友表示赞同!
刚刚入手了STC8A系列的开发板,感觉其内部提供的大容量存储空间超乎期待,适合深入学*和项目实践。
有18位网友表示赞同!
对于电子爱好者而言,这款STC8A8K64S4A12的开发板是不可多得的宝物,片内存储器的设计省去了单独连接闪存设备的步骤,非常方便实用。
有18位网友表示赞同!
在使用STC8A系列的开发板进行编程实践时,我深深感受到其内部集成的存储性能为调试和开发带来了极大的便捷性。
有8位网友表示赞同!
强烈推荐给初学者作为单片机学*的第一个工具,STC8A8K64S4A12开发板的片内存储器容量足以支持各种教学实例和小项目。
有15位网友表示赞同!
这款开发板在设计上考虑得非常周全,片内包含了足够的RAM和ROM空间,是电子项目探索的理想伴侣。
有5位网友表示赞同!
对于那些热衷于嵌入式系统学*的人来说,STC8A系列的开发板不仅提供了强大的处理能力,其内部丰富的存储资源也是一个巨大的亮点。
有10位网友表示赞同!
使用过此款STC8A8K64S4A12开发板后,我发现它在实际应用中能有效提升开发效率,减少了外部存储设备的需求。
有5位网友表示赞同!
个人觉得这款STC系列的开发板对于培养编程和电路设计技能非常有帮助,尤其是那一块片内大容量存储器让人爱不释手。
有18位网友表示赞同!
作为一名嵌入式系统的爱好者,在多次尝试与探究后,发现STC8A8K64S4A12开发板的内部资源极为丰富且运行稳定。
有7位网友表示赞同!
如果你正在寻找一个适合学*和实践各种单片机应用的好工具,我绝对推荐考虑STC8A8K64S4A12开发板,尤其是其内含的强大存储功能。
有17位网友表示赞同!
对于电子工程学生来说,这款开发板是不可或缺的学*工具之一。其内部的片上内存容量不仅适合课程要求,还能支撑更复杂的项目需求。
有8位网友表示赞同!
在深入研究STC8系列后发现,这款开发板上的片内存储器是设计之美的最佳体现,让学*过程中免去了不少困扰。
有14位网友表示赞同!
无论是新手还是有一定经验的学*者,在寻求可靠的实践平台时都应当考虑STC8A8K64S4A12。其内置的存储资源是绝对加分项。
有16位网友表示赞同!
对微控制器感兴趣的朋友要留意这款STC8A系列开发板,特别是它的片内存储性能为快速迭代和测试提供了便利。
有5位网友表示赞同!
作为一位长期从事嵌入式系统研发的技术人员,我非常认可这个系列的开发板,尤其是那一块高效的内部记忆体处理能力,提升了整个开发流程的效率。
有9位网友表示赞同!
使用STC8A系列的单片机开发工具箱进行项目研究时,内置存储资源对数据管理和程序编程非常有帮助,是专业级的推荐选择。
有18位网友表示赞同!
不论是课堂实验室还是个人自学,STC8A8K64S4A12开发板都展现出了它在存储管理方面的优异性能,为用户提供了极佳的使用体验。
有12位网友表示赞同!