Ecriture / Lecture dans la mémoire Flash

Lorsque l'OpenGeiger n'est pas connecté à un smartphone, il doit conserver un historique des mesures, même s'il est mis hors tension. De plus, si l'utilisateur souhaite changer le nom de son device, sans avoir à le reprogrammer, nous avons besoin d'enregistrer ces informations de manière permanente.

La mémoire flash du rfDuino, se découpe en plages de 1kByte. Il y a 127 plages utilisables, de la plage 124 à la plage 251. Les autres sont réservées par le bootloader et les transmissions rf.

Attention ! Sur les 127 plages utilisables, les premières sont occupées par le programme, il ne faut donc pas écrire dessus.

Actuellement le programme, dans sa version non définitive, occupe 27 000 octets, soit une 30aine de pages. On peut espérer consacrer 80 pages aux données.

Par contre, ce qui peut poser un gros problème c'est la durée de vie de la mémoire flash. La documentation, nous dit que la puce peut être réécrite 10.000 fois, ce qui est très peu. Il faudra faire attention à économiser la vie des pages en y insérant beaucoup de données d'un coup et non petit à petit.

Dans cette exemple, nous voyons comment enregistrer une chaîne de caractères dans la mémoire flash :

// Flash Memory
 
#define NAME_FLASH_PAGE 251
 
struct str_data_t {
  char str[10];
  int len;
};
 
str_data_t *nom = (str_data_t*)ADDRESS_OF_PAGE(NAME_FLASH_PAGE);
str_data_t buff = {"", 0};
 
void setup() {
  Serial.begin(9600);
 
  Serial.println("Previous name :");
  Serial.println(nom->str);
}
 
void loop() {
  while (Serial.available()>0) {
    char c = Serial.read();
    if (c=='\n' || buff.len >= 10) {
      buff.str[buff.len] = '\0';
      buff.len = 0;
      Serial.println(buff.str);
      flashPageErase(NAME_FLASH_PAGE);
      flashWriteBlock(nom, &buff, sizeof(buff));
    } else {
      buff.str[buff.len++] = c;
    }
  }
}