【出坑笔记】正确使用STC单片机内部EEPROM

【出坑笔记】正确使用STC单片机内部EEPROM,第1张

        作者今天使用了STC12C5A60S2单片机内部的EEPROM存储数据,在使用过程中发现一个坑,最后经过试验避免了该问题,这里详细记录一下。

【出坑笔记】正确使用STC12系列单片机内部EEPROM

目录

一、实验环境

二、EEPROM掉电存储实验(基础实验)   

三、EEPROM多次“写” *** 作实验(重点注意)

四、实验感悟

五、链接

六、关于作者


一、实验环境

单片机最小系统

STC12C5A60S2单片机       

11.0592MHZ晶振(实验中需用到串口通信)

二、EEPROM掉电存储实验(基础实验)   

        对STC12C5A60S2单片机内部EEPROM进行 *** 作,断开电源,重新上电,检查是否可以实现掉电存储,试验成功。

main函数如下:

void main(void)
{	
	Uart_Init();//串口初始化函数
	IAP_EraseSector(0);//扇区擦除,一个扇区512字节

	/*将EEPROM前3个位置分别写入数据0、1、2*/
	IAP_ProgramByte(0,0);
	IAP_ProgramByte(1,1);
	IAP_ProgramByte(2,2);
	
	/*将EEPROM前3个位置数据通过串口打印出来*/
	Uart_SendByte(IAP_ReadByte(0));
	Uart_SendByte(IAP_ReadByte(1));
	Uart_SendByte(IAP_ReadByte(2));

	while(1);
	
}

(1)编译下载程序,通过串口工具查看实验现象:

 通过以上程序,已将STC12C5A60S2单片机内部EEPROM的前三个地址内容写入了数据0、1、2,现在修改主程序,屏蔽“写” *** 作,只进行“读” *** 作,修改如下:

 (2)重新编译,下载,发现串口打印效果和上一次一样,如图:

(3)断开开发板电源,然后重新通电,查看串口工具,发现打印的数据依然是0、1、2(实验效果和上图串口工具显示的内容一致),说明我们EEPROM确实 *** 作成功了,实现了“掉电保存”功能。

三、EEPROM多次“写” *** 作实验(重点注意)

        对STC12C5A60S2单片机内部EEPROM前三个地址进行 *** 作,第一次写入数据,第二次写入新的数据,然后查看这三个地址存储的数据(理论上应该是第二次写入的数据),实验失败

main函数如下:

#include "common.h"
#include "uart.h"
#include "eeprom.h"

void main(void)
{	
	Uart_Init();
	IAP_EraseSector(0);//扇区擦除,一个扇区512字节

	/*将EEPROM前3个位置分别写入数据*/
	IAP_ProgramByte(0,0);
	IAP_ProgramByte(1,1);
	IAP_ProgramByte(2,2);
	
	/*将EEPROM前3个位置数据通过串口打印出来*/
	Uart_SendByte(IAP_ReadByte(0));
	Uart_SendByte(IAP_ReadByte(1));
	Uart_SendByte(IAP_ReadByte(2));
	
	/*将EEPROM前3个位置分别写入新的数据*/
	IAP_ProgramByte(0,3);
	IAP_ProgramByte(1,4);
	IAP_ProgramByte(2,5);
	
	/*将EEPROM前3个位置数据通过串口打印出来*/
	Uart_SendByte(IAP_ReadByte(0));
	Uart_SendByte(IAP_ReadByte(1));
	Uart_SendByte(IAP_ReadByte(2));
	
	while(1);
	
}

实验效果如下图:

 很明显,第一次写入数据成功,但是第二次写入数据失败了。通过前面的基础实验,说明我们的“写” *** 作是成功的,但是为什么第一次写入成功了,但是第二次写入失败了呢?仔细阅读STC12C5A60S2的手册,会发现以下内容:

仅仅看上面的说明,一头雾水,作者翻译一下就是:要对单片机内部EEPROM进行“写” *** 作,该地址数据必须是0xff才行,在我们实验中,我们第一次写入了数据0、1、2,然后准备再次写入数据3、4、5,因为该地址的数据不是0xff,所以无法进行“写” *** 作,所以作者修改程序如下:

 只是新增了一句代码,然后看实验现象:

实验成功,这就是我们想要的结果,然后再回头看STC12C5A60S2的说明:

 就更加容易理解了。然后引用手册里面的话(重点领会!!!!!!):

如果在一个扇区中存放了大量数据,某次只需要修改其中一个字节或者一部分字节时,则另外的不需要修改的数据须先读出放在STC单片机的RAM中,然后擦除整个扇区,再将需要保留的数据和需修改的数据按字节逐字节写回该扇区中……

 备注:对单片机内部EEPROM进行“扇区擦除”后,扇区的数据就变成0xff。

四、实验感悟

        通过上面的实验,说明要结合实验和官方手册,多方实验求证,才能真正学好、用好手头的单片机,要学会和单片机“对话”,用事实说话。

【注意】

        (1)STC89C51系列单片机内部也有EEPROM,但是STC89C51系列单片机和STC12系列单片机内部关于EEPROM的特殊功能寄存器和EEPROM地址不同,所以代码需要适当修改,具体方法请对比STC89C51系列单片机、STC12系列单片机手册。

五、链接

1.程序链接:程序下载--------百度网盘

2.视频连接:

链接①:哔哩哔哩--------点击播放

链接②:优酷视频--------点击播放

链接③:爱奇艺----点击播放

链接④:腾讯视频--------点击播放

链接⑤:搜狐视频--------点击播放

六、关于作者

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/800931.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-07
下一篇 2022-05-07

发表评论

登录后才能评论

评论列表(0条)

保存