🛠 Journaliser dans la flash QSPI 16 Mo (pas de slot TF)

Arduino Nicla Vision · avance · Schéma : IMG-nicla-vision-avance-1-niclavision-logs-flash-qspi.svg — architecture mémoire du Nicla Vision : STM32H747, bus QSPI vers la puce NOR 16 Mo découpée en zones romfs, firmware radio et journal circulaire

Objectifs

Mettre en place un journal de mesures non volatile sur la Nicla Vision. Attention : la carte n'a AUCUN lecteur de carte micro-SD ; le stockage de masse embarqué est la flash NOR QSPI 16 Mo (128 Mbit), dont MicroPython expose ~88 Mbit en filesystem après 4 Mio de romfs et 1 Mio de firmware Wi-Fi/BT.

Matériel

Code complet

// Journal circulaire brut dans la flash QSPI (mbed QSPI)
// > 
#include "QSPI.h"

QSPI qspi(PD_11, PF_9, PE_2, PD_13, PF_10, PG_6); // bus QSPI x4
const uint32_t LOG_BASE = 0x600000;  // zone journal après romfs+fw (hyp.)
const uint16_t SECT = 4096;          // effacement par secteur
uint32_t offset = 0;

void flashCmd(uint8_t cmd, uint32_t addr, const uint8_t* buf, size_t n, bool write) {
  qspi.format(8, 0);
  qspi.frequency(1000000);
  QSPI_TransferConfig_t t = {};
  t.instruction = cmd; t.address = addr;
  t.alternateBytes = 0; t.dataMode = QSPI_1;
  t.dataLength = n; t.dataBufferSize = n;
  t.txBuffer = write ? (uint8_t*)buf : nullptr;
  t.rxBuffer = write ? nullptr : (uint8_t*)buf;
  qspi.transfer(&t);
}

void logLine(const char* line) {
  uint32_t a = LOG_BASE + (offset % (256 * SECT));
  uint8_t we = 0x06; flashCmd(we, 0, nullptr, 0, true);      // write enable
  uint8_t er = 0x20; flashCmd(er, a & ~(SECT - 1), nullptr, 0, true); // erase
  uint8_t pp[64]; memset(pp, 0xFF, 64); size_t L = strlen(line);
  memcpy(pp, line, L > 63 ? 63 : L);
  we = 0x06; flashCmd(we, 0, nullptr, 0, true);
  flashCmd(0x32, a, pp, 64, true);                            // page program
  offset += 64;
}

void setup {
  Serial.begin(115200);
  char buf[48]; uint32_t n = 0;
  snprintf(buf, sizeof buf, "%lu,tof=%u\n", (unsigned long)millis, n++);
  logLine(buf);
  Serial.println(F("ligne journalisee en QSPI"));
}
void loop {}

Vérification attendue

Rejouer la lecture 0x03 sur LOG_BASE après reset : la ligne est toujours présente (non volatile). En MicroPython, la même zone est accessible par os.listdir sur le filesystem QSPI — chemin confirmé par le port officiel.

Erreurs fréquentes

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels