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

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1556|回复: 5

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

[复制链接]
发表于 2022-5-14 01:42 | 显示全部楼层 |阅读模式
本帖最后由 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、实验结果:

eeprom.PNG



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使用寿命,所以不建议频繁操作。
当然这不是结束,希望有兴趣的小伙伴再研究终极版。


(全文完)





















发表于 2022-6-26 16:26 | 显示全部楼层
有意思,这样也行!!!!
 楼主| 发表于 2022-6-26 22:25 | 显示全部楼层
zydl123 发表于 2022-6-26 16:26
有意思,这样也行!!!!

谢谢关注,一起学习一起进步。
发表于 2022-8-1 08:35 来自手机 | 显示全部楼层
你好,能显示到屏幕上吗?
 楼主| 发表于 2022-8-1 20:48 | 显示全部楼层
785363263 发表于 2022-8-1 08:35
你好,能显示到屏幕上吗?

一切皆可屏幕。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-30 23:45 , Processed in 0.090695 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表