本帖最后由 topdog 于 2022-5-22 23:29 编辑
提问:设置变量自加一,并保存在EEPROM中,掉电或者关机再开始,能够继续上次的计数。
1,擦除EEPROM上的数据:
[pre]#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() {
}[/pre]
2,先读取 EEPROM里面的数据如果是0,那么把设定值赋值给MCU,否者就从EEPROM里面读取的数据开始运行,这就是模拟掉电的状态,计算后再存入EEPROM。你重启,插拔电源都会从被记录的数据处开始运行:
[pre]#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);
}[/pre]
3、实验结果:
4、友谊提示:
用EEPROM.read() 和 EEPROM.write() 运行到255(十六进制就是0xFF)时,就溢出变为0。
因为EEPROM.read() 和 EEPROM.write()的基本单位是一个字节(byte)。要读取和写入字节,使用以下函数:
[pre]EEPROM.write(address, byteValue);
EEPROM.read(address); // 返回一个字节(byte)[/pre]
bit(比特):bit是数据的最小单位,通常简写为b。在计算机中通常用1和0来表示。
Byte(字节):数据存储的基本单位,通常简写为B。
一个字节(Byte) 等于 8 bit,最大值二进制表示:11111111,十六进制就是0xFF,如果到256,二进制就是100000000,一共九位,超过就溢出。
给出的示例无符号整数类型运行到65535(十六进制就是0xFFFF)时,再加一就溢出变为0。程序中使用了EEPROM操作多位字节的函数:
[pre]EEPROM.put(address,data);
EEPROM.get(address,data);[/pre]
因为EEPROM.put() 函数中采用EEPROM.update() 函数写出一组字节。此外,它还测量用于写出正确字节数的数据类型的大小。可以使用此函数写出 char、int、long或 float 类型对象,而无需知道该类型对象使用的字节数。因此,此函数可跨不同的编译器(使用不同的类型大小)移植。关于这个函数真正有用的一点是,它还可以写出你自己定义的类型,例如,如果你创建一个结构类型(如果里面有很多变量),那么它会把这种类型的变量写到EEPROM,而你不必知道该类型占用的字节数。结果是,如果您将数据捆绑到一个结构中,那么很容易将其放入EEPROM和从EPROM中获取。 UNO有1 KB的EEPROM,1 KB = 1024 Bytes,最多可以存储128字节。考虑到擦写会缩短UNO使用寿命,所以不建议频繁操作。 当然这不是结束,希望有兴趣的小伙伴再研究终极版。
(全文完)
|