13Arduino Flash 存储

Arduino Flash 存储

介绍

在Arduino开发中,Flash存储是一种非易失性存储器,用于存储程序代码和常量数据。与RAM(随机存取存储器)不同,Flash存储即使在断电后也能保留数据。这使得它非常适合存储不会频繁更改的数据,例如配置参数、查找表或固件代码。

在本教程中,我们将探讨如何在Arduino中使用Flash存储来保存数据,并通过代码示例和实际案例帮助你理解这一概念。

Flash存储的基本概念

Arduino的Flash存储通常用于存储程序代码和常量数据。与RAM不同,Flash存储的写入次数有限,因此不适合频繁写入数据。然而,它非常适合存储不会频繁更改的数据。

Flash存储的特点

  • 非易失性:数据在断电后不会丢失。
  • 写入次数有限:Flash存储的写入次数通常在10,000到100,000次之间。
  • 读取速度快:读取Flash存储中的数据非常快。

Flash存储的使用场景

  • 存储程序代码
  • 存储常量数据(如查找表、配置参数)
  • 存储固件更新

在Arduino中使用Flash存储

在Arduino中,Flash存储通常用于存储常量数据。我们可以使用PROGMEM关键字将数据存储在Flash中,而不是RAM中。

使用PROGMEM存储数据

PROGMEM是Arduino提供的一个关键字,用于将数据存储在Flash中。以下是一个简单的示例,展示如何使用PROGMEM存储一个字符串数组:

codeBlock_bY9V 复制代码
#include <avr/pgmspace.h>

const char myStrings[][20] PROGMEM = {
  "Hello, World!",
  "Arduino Flash Storage",
  "PROGMEM Example"
};

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

  for (int i = 0; i < 3; i++) {
    char buffer[20];
    strcpy_P(buffer, (char*)pgm_read_word(&(myStrings[i])));
    Serial.println(buffer);
  }
}

void loop() {
  // 空循环
}

代码解释

  1. PROGMEM关键字 :将myStrings数组存储在Flash中。
  2. pgm_read_word函数:从Flash中读取数据。
  3. strcpy_P函数:将Flash中的字符串复制到RAM中的缓冲区。

输出

codeBlock_bY9V 复制代码
Hello, World!
Arduino Flash Storage
PROGMEM Example

实际应用案例

案例1:存储查找表

假设你正在开发一个需要快速访问大量数据的项目,例如LED灯的颜色值。将这些数据存储在Flash中可以节省RAM空间。

codeBlock_bY9V 复制代码
#include <avr/pgmspace.h>

const uint16_t colorTable[][3] PROGMEM = {
  {255, 0, 0},   // 红色
  {0, 255, 0},   // 绿色
  {0, 0, 255},   // 蓝色
  {255, 255, 0}, // 黄色
  {255, 0, 255}, // 品红
  {0, 255, 255}  // 青色
};

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

  for (int i = 0; i < 6; i++) {
    uint16_t red = pgm_read_word(&(colorTable[i][0]));
    uint16_t green = pgm_read_word(&(colorTable[i][1]));
    uint16_t blue = pgm_read_word(&(colorTable[i][2]));

    Serial.print("Color ");
    Serial.print(i);
    Serial.print(": R=");
    Serial.print(red);
    Serial.print(", G=");
    Serial.print(green);
    Serial.print(", B=");
    Serial.println(blue);
  }
}

void loop() {
  // 空循环
}

输出

codeBlock_bY9V 复制代码
Color 0: R=255, G=0, B=0
Color 1: R=0, G=255, B=0
Color 2: R=0, G=0, B=255
Color 3: R=255, G=255, B=0
Color 4: R=255, G=0, B=255
Color 5: R=0, G=255, B=255

案例2:存储配置参数

假设你有一个需要存储配置参数的项目,例如Wi-Fi的SSID和密码。将这些参数存储在Flash中可以确保它们在断电后不会丢失。

codeBlock_bY9V 复制代码
#include <avr/pgmspace.h>

const char wifiSSID[] PROGMEM = "MyWiFiNetwork";
const char wifiPassword[] PROGMEM = "MySecurePassword";

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

  char ssidBuffer[20];
  char passwordBuffer[20];

  strcpy_P(ssidBuffer, wifiSSID);
  strcpy_P(passwordBuffer, wifiPassword);

  Serial.print("SSID: ");
  Serial.println(ssidBuffer);
  Serial.print("Password: ");
  Serial.println(passwordBuffer);
}

void loop() {
  // 空循环
}

输出

codeBlock_bY9V 复制代码
SSID: MyWiFiNetwork
Password: MySecurePassword

总结

在本教程中,我们探讨了如何在Arduino中使用Flash存储来保存数据。我们介绍了PROGMEM关键字的使用方法,并通过代码示例展示了如何存储和读取Flash中的数据。我们还通过实际案例展示了Flash存储的应用场景。

提示
Flash存储非常适合存储不会频繁更改的数据,例如配置参数、查找表或固件代码。使用PROGMEM可以有效地节省RAM空间。

附加资源与练习

附加资源

练习

  1. 修改案例1中的代码,添加更多的颜色值并打印出来。
  2. 尝试将你的项目中的某些常量数据存储在Flash中,并观察RAM使用情况的变化。
  3. 研究如何在Arduino中使用EEPROM存储数据,并与Flash存储进行比较。

通过完成这些练习,你将更深入地理解Arduino中的Flash存储及其应用。

相关推荐
单片机杂货铺12 小时前
基于单片机的智能粮仓控制系统设计与实现
stm32·单片机·嵌入式硬件·物联网·计算机外设·51单片机·课程设计
指尖的爷12 小时前
RKNN转化环境搭建(rknn_toolkit2新版本)
嵌入式硬件·深度学习·物联网·目标检测
梁朝辉12 小时前
滴泪的曲线(Curved)还是直线(Line)什么区别,都应用于什么场景!
嵌入式硬件·硬件工程
clear sky .14 小时前
stm32H7进入HardFault_Handler机制
stm32·单片机·嵌入式硬件
小僧景贤15 小时前
STM32 GPIO 详解(含寄存器、HAL 库、电气特性、低功耗深度剖析)
stm32·单片机·嵌入式硬件
远翔调光芯片^1382879887217 小时前
从参数到应用:FP7208如何以0.2V精密反馈提升LED驱动性能
科技·单片机·嵌入式硬件·智能家居·能源
碧海银沙音频科技研究院18 小时前
4 BES2710编译环境搭建方法
嵌入式硬件·算法
csdn杰哥19 小时前
瑞萨单片机AI教程【六】导入外部电机状态数据训练模型
人工智能·单片机·嵌入式硬件·瑞萨·ra6m5
深念Y19 小时前
ZTE_UZ901_NVRAM经验总结
linux·服务器·网络·嵌入式硬件·嵌入式·随身wifi
远翔调光芯片^1382879887220 小时前
高效驱动!FP7153赋能3A大电流手电筒,单节锂电 / 5V 供电也能迸发强劲照明力
科技·单片机·嵌入式硬件·智能家居·能源