作者今天使用了STC12C5A60S2单片机内部的EEPROM存储数据,在使用过程中发现一个坑,最后经过试验避免了该问题,这里详细记录一下。
【出坑笔记】正确使用STC12系列单片机内部EEPROM
目录
一、实验环境
二、EEPROM掉电存储实验(基础实验)
三、EEPROM多次“写” *** 作实验(重点注意)
四、实验感悟
五、链接
六、关于作者
一、实验环境
二、EEPROM掉电存储实验(基础实验)◆单片机最小系统
◆STC12C5A60S2单片机
◆11.0592MHZ晶振(实验中需用到串口通信)
对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.视频连接:
六、关于作者链接①:哔哩哔哩--------点击播放
链接②:优酷视频--------点击播放
链接③:爱奇艺----点击播放
链接④:腾讯视频--------点击播放
链接⑤:搜狐视频--------点击播放
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)