跳到主要内容

Arduino Flash存储

介绍

Arduino的Flash存储是一种非易失性存储器,用于存储程序代码和常量数据。与RAM(随机存取存储器)不同,Flash存储即使在断电后也能保留数据。这使得它非常适合存储程序代码和不需要频繁更改的数据。

在Arduino中,Flash存储的主要用途是存储程序代码(即你上传到Arduino的代码)。此外,你还可以使用Flash存储来存储常量数据,例如查找表、字符串或其他不会在运行时更改的数据。

备注

Flash存储的容量有限,具体取决于你所使用的Arduino型号。例如,Arduino Uno的Flash存储容量为32KB。

Flash存储的工作原理

Flash存储是一种基于闪存技术的存储器,它通过电子方式存储数据。与EEPROM(电可擦可编程只读存储器)不同,Flash存储的写入速度较慢,且写入次数有限(通常为10,000次左右)。因此,Flash存储通常用于存储不需要频繁更改的数据。

在Arduino中,Flash存储是通过PROGMEM关键字来访问的。PROGMEM允许你将数据存储在Flash中,而不是RAM中,从而节省宝贵的RAM空间。

使用PROGMEM存储数据

要在Flash中存储数据,你可以使用PROGMEM关键字。以下是一个简单的示例,展示了如何将字符串存储在Flash中:

cpp
#include <avr/pgmspace.h>

const char myString[] PROGMEM = "Hello, Flash Storage!";

void setup() {
Serial.begin(9600);

// 从Flash中读取字符串并打印到串口
char buffer[20];
strcpy_P(buffer, myString);
Serial.println(buffer);
}

void loop() {
// 空循环
}

在这个示例中,myString被存储在Flash中,而不是RAM中。通过使用strcpy_P函数,我们可以从Flash中读取数据并将其复制到RAM中的缓冲区,然后通过串口打印出来。

提示

使用PROGMEM时,确保你使用的函数支持从Flash中读取数据。例如,strcpy_Pstrcpy的Flash版本。

实际应用案例

案例1:存储查找表

假设你正在开发一个项目,需要使用一个查找表来计算某些值。由于查找表通常不会在运行时更改,因此将其存储在Flash中是一个不错的选择。

cpp
#include <avr/pgmspace.h>

const uint16_t lookupTable[] PROGMEM = {
0, 10, 20, 30, 40, 50, 60, 70, 80, 90
};

void setup() {
Serial.begin(9600);

// 从Flash中读取查找表的值并打印到串口
for (int i = 0; i < 10; i++) {
uint16_t value = pgm_read_word_near(lookupTable + i);
Serial.println(value);
}
}

void loop() {
// 空循环
}

在这个示例中,lookupTable被存储在Flash中。通过使用pgm_read_word_near函数,我们可以从Flash中读取数据并将其打印到串口。

案例2:存储大量字符串

如果你需要在项目中存储大量字符串(例如菜单选项或提示信息),将这些字符串存储在Flash中可以节省大量RAM空间。

cpp
#include <avr/pgmspace.h>

const char menuItems[][20] PROGMEM = {
"1. Start Game",
"2. Settings",
"3. High Scores",
"4. Exit"
};

void setup() {
Serial.begin(9600);

// 从Flash中读取菜单项并打印到串口
for (int i = 0; i < 4; i++) {
char buffer[20];
strcpy_P(buffer, menuItems[i]);
Serial.println(buffer);
}
}

void loop() {
// 空循环
}

在这个示例中,menuItems数组被存储在Flash中。通过使用strcpy_P函数,我们可以从Flash中读取字符串并将其打印到串口。

总结

Arduino的Flash存储是一种非常有用的资源,特别适合存储程序代码和常量数据。通过使用PROGMEM关键字,你可以将数据存储在Flash中,从而节省RAM空间。在实际应用中,Flash存储可以用于存储查找表、字符串等不需要频繁更改的数据。

警告

请注意,Flash存储的写入次数有限,因此不适合存储需要频繁更改的数据。对于需要频繁更改的数据,建议使用EEPROM。

附加资源与练习

  • 练习1:尝试将你自己的数据(例如一组传感器校准值)存储在Flash中,并在运行时读取这些数据。
  • 练习2:研究如何使用pgm_read_bytepgm_read_word函数从Flash中读取不同类型的数据。
  • 资源:Arduino官方文档中关于PROGMEM的更多信息。

通过掌握Arduino的Flash存储,你将能够更有效地管理内存,并为更复杂的项目打下坚实的基础。