掉电后读取EEPROM数据继续工作-Arduino中文社区 - Powered by Discuz! Archiver

topdog 发表于 2022-5-14 01:42

掉电后读取EEPROM数据继续工作

本帖最后由 topdog 于 2022-5-22 23:29 编辑

提问:设置变量自加一,并保存在EEPROM中,掉电或者关机再开始,能够继续上次的计数。

1,擦除EEPROM上的数据:

#include <EEPROM.h>

void setup() {   
/***
    遍历EEPROM存储的每个字节.

   较大的AVR处理器有较大的EEPROM大小,例如:
    - Arduino Duemilanove: 512 B EEPROM storage.
    - Arduino Uno:         1 kB EEPROM storage.
    - Arduino Mega:      4 kB EEPROM storage.   
***/

for (int i = 0 ; i < EEPROM.length() ; i++) {
    EEPROM.write(i, 0);
}
}

void loop() {
}

2,先读取 EEPROM里面的数据如果是0,那么把设定值赋值给MCU,否者就从EEPROM里面读取的数据开始运行,这就是模拟掉电的状态,计算后再存入EEPROM。你重启,插拔电源都会从被记录的数据处开始运行:

#include <EEPROM.h>

const int address = 0;
static unsigned int Set = 65000;
unsigned int Stock, Saving;
unsigned long TimeBegin, TimeNow;

void setup() {
Serial.begin(9600);
if (EEPROM.get(address, Saving) == 0) {
    Stock = Set;
} else {
    Stock = EEPROM.get(address, Saving);
}
}

void loop() {

Stock++;

TimeBegin = micros();
EEPROM.put(address, Stock);
TimeNow = micros();

Serial.print("Stock = ");
Serial.print(Stock);
Serial.print("");
Serial.print("EEPROM Write time(us) = ");
Serial.print(TimeNow - TimeBegin);
Serial.print("");
Serial.print("EEPROM Write time per byte (us) = ");
Serial.println((TimeNow - TimeBegin) / (4 * sizeof(Stock)));

delay(1000);
}



3、实验结果:





4、友谊提示:
用EEPROM.read() 和 EEPROM.write() 运行到255(十六进制就是0xFF)时,就溢出变为0。
因为EEPROM.read() 和 EEPROM.write()的基本单位是一个字节(byte)。要读取和写入字节,使用以下函数:
EEPROM.write(address, byteValue);

EEPROM.read(address); // 返回一个字节(byte)


bit(比特):bit是数据的最小单位,通常简写为b。在计算机中通常用1和0来表示。
Byte(字节):数据存储的基本单位,通常简写为B。

一个字节(Byte) 等于 8 bit,最大值二进制表示:11111111,十六进制就是0xFF,如果到256,二进制就是100000000,一共九位,超过就溢出。

给出的示例无符号整数类型运行到65535(十六进制就是0xFFFF)时,再加一就溢出变为0。程序中使用了EEPROM操作多位字节的函数:

EEPROM.put(address,data);
EEPROM.get(address,data);

因为EEPROM.put() 函数中采用EEPROM.update() 函数写出一组字节。此外,它还测量用于写出正确字节数的数据类型的大小。可以使用此函数写出 char、int、long或 float 类型对象,而无需知道该类型对象使用的字节数。因此,此函数可跨不同的编译器(使用不同的类型大小)移植。关于这个函数真正有用的一点是,它还可以写出你自己定义的类型,例如,如果你创建一个结构类型(如果里面有很多变量),那么它会把这种类型的变量写到EEPROM,而你不必知道该类型占用的字节数。结果是,如果您将数据捆绑到一个结构中,那么很容易将其放入EEPROM和从EPROM中获取。UNO有1 KB的EEPROM,1 KB = 1024 Bytes,最多可以存储128字节。考虑到擦写会缩短UNO使用寿命,所以不建议频繁操作。当然这不是结束,希望有兴趣的小伙伴再研究终极版。

(全文完)





















zydl123 发表于 2022-6-26 16:26

有意思,这样也行!!!!

topdog 发表于 2022-6-26 22:25

zydl123 发表于 2022-6-26 16:26
有意思,这样也行!!!!

谢谢关注,一起学习一起进步。

785363263 发表于 2022-8-1 08:35

你好,能显示到屏幕上吗?

topdog 发表于 2022-8-1 20:48

785363263 发表于 2022-8-1 08:35
你好,能显示到屏幕上吗?

一切皆可屏幕。
页: [1]
查看完整版本: 掉电后读取EEPROM数据继续工作