0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

怎样在Arduino上永久存储数据

454398 来源:工程师吴畏 2019-08-01 17:47 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一些Arduino板允许您将数据永久存储在EEPROM中但必须保持电路板插入。本文将教你如何写入板载EEPROM(如果你的Arduino有一个),并向您介绍一种允许您使用外部存储器的替代方法。

你可以将本指南用于支持通过I2C总线通信的任何微控制器

支持的Arduino开发板

下表列出了每个MCU可以提供的数据量商店:

怎样在Arduino上永久存储数据

连接内置EEPROM

EEPROM代表电子可擦除可编程只读存储器。虽然您可以覆盖芯片上的数据,但在开始出现故障之前,您只能进行有限次数的操作。但是,您可以根据需要多次读取它。

Write()方法

以下示例说明了如何存储字节。

#include

void setup()

{

int word_address = 0;

EEPROM.write(word_address, 0x7F);

}

void loop()

{ }

将write()方法与字地址和要存储的值一起使用。地址必须是介于零和EEPROM.length() - 1之间的值,它告诉MCU在哪里存储值。

read()方法

以下示例从EEPROM中读取一个字节:

#include

void setup()

{

Serial.begin(9600);

int word_address = 0;

byte value;

value = EEPROM.read(word_address);

Serial.println(value, HEX);

}

void loop()

{ }

read() - 方法也将地址作为参数并返回值作为一个字节。

清除内存

要清除内存,请在EEPROM的每个位置存储零:

void erase(void)

{

for (int i = 0 ; i 《 EEPROM.length() ; i++)

EEPROM.write(i, 0);

}

“Hello World”示例

以下代码将清除EEPROM,然后在将字符串写入控制台之前将“Hello World!”存储在其中:

#include

void erase(void)

{

for (int i = 0 ; i 《 EEPROM.length() ; i++)

EEPROM.write(i, 0);

}

void printMessage(byte* first, size_t len)

{

for (int i = 0; i 《 len; i++)

{

Serial.print((char)first[i]);

}

}

void writeMsg(byte* first, size_t len)

{

for(int i = 0; i 《 len; i++)

{

EEPROM.write(i, first[i]);

}

}

void readMsg(size_t len)

{

byte res;

Serial.print(“Message: ”);

for(int i = 0; i 《 len; i++)

{

res = EEPROM.read(i);

Serial.print((char)res);

}

Serial.println(“”);

}

void setup()

{

char* string = “Hello World!”;

Serial.begin(9600);

Serial.print(“Serial connection opened! ”);

Serial.print(“EEPROM length: ”);

Serial.println(EEPROM.length());

Serial.print(“Attempting to erase EEPROM.。. ”);

erase();

Serial.print(“Done! ”);

Serial.print(“Message: ”);

printMessage(string, 12);

Serial.print(“ ”);

Serial.print(“Attempting to write to EEPROM.。. ”);

writeMsg(string, 12);

Serial.print(“Done! ”);

Serial.print(“Attempting to read from EEPROM.。. ”);

readMsg(12);

Serial.print(“Done! ”);

}

void loop()

{ }

使用外部EEPROM

如果您不使用Arduino或如果您想拥有额外的存储空间,可以使用外部EEPROM IC来存储字节。在这个例子中,我们将使用4LC16B(PDF),它是一个16 kB I2C EEPROM。

电路很简单,只需要添加一个100K上拉电阻并将IC连接到Arduino(或您想要使用的任何其他MCU):

将4LC16B外部EEPROM添加到电路图Arduino。

该IC的第七个引脚是写保护指示灯。如果要写入存储器,请将此引脚连接到GND。如果它很高,芯片将不会保存任何数据。无论引脚的状态如何,都可以进行读取。

与外部存储器通信

设置Arduino和外部存储器之间的通信比较复杂内置存储器。

4LC16B IC的数据表详细描述了如何与它进行通信以存储数据。我写了这个草图,允许你在外部EEPROM上连接一个字(或一个字节)。我使用16 kB变体对其进行了测试,但只要通信以相同的方式工作,它应该适用于所有其他大小(来自此制造商):

#include

static const byte DEVICE_BASE_ADDRESS = 0x50;

void setup()

{

Wire.begin();

Serial.begin(9600);

}

byte readByteFromEEPROM(byte block, byte word_offset)

{

Wire.beginTransmission(block);

Wire.write(int(word_offset));

Wire.endTransmission(true);

Wire.requestFrom(int(block), 1);

if (Wire.available())

return Wire.read();

}

void readBlockFromEEPROM(byte block, byte outArray[256])

{

for(int i = 0; i 《 256; i++)

{

outArray[i] = readByteFromEEPROM(block, i);

}

}

void readPageFromEEPROM(byte block, byte word_offset, byte outArray[16])

{

for(int i = 0; i 《 16; i++)

{

outArray[i] = readByteFromEEPROM(block, word_offset + i);

}

}

void writeByteToEEPROM(byte block, byte word_offset, byte data)

{

writePageToEEPROM(block, word_offset, &data, 1);

}

/**

* block:

* 0x50 = first block = DEVICE_BASE_ADDRESS

* 0x51 = second block

* 。..

* 0x57 = eight block

*/

void writePageToEEPROM(byte block, byte word_offset, byte *data, size_t len)

{

Wire.beginTransmission(block);

Wire.write(word_offset);

for(int i = 0; i 《 len; i++)

{

Wire.write(data[i]);

}

Wire.endTransmission(true);

delay(10);

}

内存分为八个块可以直接寻址256个字节和每个块。 DEVICE_BASE_ADDRESS(0x50)表示第一个,0x57表示最后一个块。

不同的芯片也有不同的基址。如有必要,请参阅EEPROM的数据表并更新代码。

另一个“ Hello World“示例

此程序将”Hello World“存储在外部EEPROM上第一个块的第一页,然后读取整个第一个块并将其打印到控制台:

void printBlock(byte blockContent[256])

{

for(int i = 0; i 《 16; i++)

{

Serial.print(“Page ”);

if(i+1 《 10)

Serial.print(“0”);

Serial.print(i+1);

Serial.print(“: ”);

for(int u = 0; u 《 16; u++)

{

Serial.print((char)blockContent[i*16+u]);

if(u==7)

Serial.print(“ ”);

}

Serial.println(“”);

}

}

void loop()

{

byte result[256];

writePageToEEPROM(DEVICE_BASE_ADDRESS, 0, “Hello World!”, 12);

readBlockFromEEPROM(DEVICE_BASE_ADDRESS, result);

printBlock(result);

delay(20000);

exit(0);

}

执行此示例将为您提供以下结果(或类似的内容取决于你的EEPROM的内容:

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • EEPROM
    +关注

    关注

    9

    文章

    1129

    浏览量

    85533
  • 存储数据
    +关注

    关注

    0

    文章

    90

    浏览量

    14420
  • Arduino
    +关注

    关注

    190

    文章

    6515

    浏览量

    195964
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Everspin串口MRAM存储芯片有哪些型号

    MRAM是一种利用电子的自旋磁性来存储信息的非易失性存储器。它完美结合了SRAM的高速读写特性与闪存(Flash)的非易失性,能够断电后永久保存
    的头像 发表于 10-24 15:48 309次阅读

    服务器数据恢复—EqualLogic存储raid5磁盘阵列数据恢复案例

    服务器存储数据恢复环境&故障: 某品牌EqualLogic PS6100存储阵列上有一组由16块硬盘组建的raid5磁盘阵列。磁盘阵列上层划分多个大小不同的卷,存放虚拟机文件。 硬盘出现故障导致
    的头像 发表于 10-21 15:04 163次阅读

    如何在 MCU/MUP 安全地存储机密数据

    如何在 MCU/MUP 安全地存储机密数据
    发表于 09-08 06:44

    如何在 NuMaker-IoT-M467 板使用 Arduino IDE 控制 Wi-Fi 模块?

    NuMaker开发板,有一个ESP-12F Wi-Fi模块;但是,Arduino IDE 中的 NuMaker UNO 包不提供该模块的相关控制。如果您希望
    发表于 09-04 08:28

    如何使用 EZserial 禁用 CYBT-343026 模块的嗅探模式?

    。 我们想知道该设置是否永久存储到闪存中,或者是否需要在每次POWER_DRILL2GO模块时显式禁用嗅探模式。
    发表于 07-02 06:26

    聚徽架式工控一体机的工业级存储技术:数据安全与高效读写保障

    一、引言 工业自动化领域,工控一体机作为核心控制设备,承担着数据采集、处理与存储的重要任务。随着工业生产的智能化程度不断提高,数据量呈爆炸式增长,对工控一体机的
    的头像 发表于 06-24 16:18 370次阅读

    《ESP32S3 Arduino开发指南》第二章 Arduino基础知识

    的发展,Arduino出现以前,虽然也有很多公司推广一些简单易用的可编程控制器,但是由于开发平台种类繁多,而且使用这些控制器基本都需要对电子技术、数字逻辑、寄存器等内容进行多方面
    发表于 05-13 09:28

    #### KEPServerEX 数据存储插件\\-2

    到VARCHAR”启用,这样就可以修改成字符串的形式了。 三、前面我们都在说怎么设置存储触发条件,那如果由于网络等问题导致Kepware与数据库之间的连接断开了,怎么保障数据存储不丢失
    发表于 04-09 16:09

    SDMMC SD_init() 启用了TrustZone的项目中永久循环是怎么回事?

    我是嵌入式领域的菜鸟,所以也许我错过了一些非常明显的东西。 我正在开发一个基于 LPCXpresso55S69 板的 TrustZone 的项目。该项目所需的部分功能是启用某些对象的持久存储
    发表于 03-26 06:02

    arduino中st25dv16k怎么接收外部传输的图片数据

    arduino中st25dv16k怎么接收外部传输的图片数据
    发表于 03-10 07:14

    KEPServerEX 数据存储插件

    好LogGroup之后,Triggers里面记录条件中,设置 “登录静态间隔”--否; “在数据更改时记录”---是 这样数据就会在变化的时候才会存储。反之,就会按照固定的时间间隔进
    的头像 发表于 02-28 14:47 510次阅读
    KEPServerEX <b class='flag-5'>数据</b><b class='flag-5'>存储</b>插件

    数据怎么云存储电脑,数据怎么操作才能云存储电脑

    怎么操作才能云存储电脑。    在数字化时代,云存储成为了一种高效、灵活的数据管理方式。通过将数据存储
    的头像 发表于 01-14 10:10 1152次阅读
    <b class='flag-5'>数据</b>怎么云<b class='flag-5'>存储</b><b class='flag-5'>在</b>电脑,<b class='flag-5'>数据</b>怎么操作才能云<b class='flag-5'>存储</b><b class='flag-5'>在</b>电脑

    怎样读出eZdspC5535INA219的数据

    INA219软件 怎样读出eZdspC5535INA219的数据
    发表于 01-10 06:00

    怎么更改电脑的云存储位置,更改电脑的云存储位置教程

        ‌云存储是一种通过互联网将数据存储远程服务器的技术‌,用户可以通过互联网随时随地访问和管理自己的
    的头像 发表于 01-07 16:43 1716次阅读
    怎么更改电脑<b class='flag-5'>上</b>的云<b class='flag-5'>存储</b>位置,更改电脑<b class='flag-5'>上</b>的云<b class='flag-5'>存储</b>位置教程

    Arduino采集雷达模块数据与串口绘图

    Arduino采集雷达模块数据与串口绘图
    的头像 发表于 12-14 11:44 1211次阅读
    <b class='flag-5'>Arduino</b>采集雷达模块<b class='flag-5'>数据</b>与串口绘图