本帖最后由 Yuhun_Shen 于 2021-3-16 15:59 编辑
最近用到了STC15F2K60S2的EEPROM,用来存储一些需要掉电保存的数据。看了一下官方的手册和例程,例程提供了写1个字节函数void IapProgramByte(WORD addr, BYTE dat),读1个字节函数BYTE IapReadByte(WORD addr),擦除扇区函数void IapEraseSector(WORD addr),例程中是按扇区来操作的,1个扇区=256个字节,EEPROM的存储空间只有1K,若按扇区操作只能存储2个数据,所以我采用按地址操作。读完例程发现只需要用到两个函数:写一个字节函数和读一个字节函数,然后我就开始写函数测试了。然后......发现读取的值和写入的值不一样,经过多次测试发现每个地址第一次写入额值能成功读取出来,之后写入的值就不行了。继续翻手册读例程,发现在每次写入数据之前需要先擦除数据,那就先擦除再写入。然后新的问题又来了,我是按地址操作的,官方提供的擦除函数是按扇区操作的,一擦256个字节数据全没了.......
对此我想了三个方法:
1.在电路板上增加掉电检测电路,电源关闭时进行数据保存。但我的电路板已经做好了没法改了;
2.实时存储数据,这个方法消耗单片机性能,而且EEPROM擦写次数是有限的,不建议用;
3.数据有变化进行存储,不变化不存储。
综合来看方法3是最合适的,于是乎我又改了一下程序,单片机上电后读出EEPROM里的所有数据,当有数据变化后就把所有数据写入EEPROM。经过测试这个方法非常好
|