🛠 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

Objetivos

Implementar un registro de mediciones no volátil en la Nicla Vision. Atención: la placa NO tiene NINGÚN lector de tarjeta micro-SD; el almacenamiento masivo integrado es la flash NOR QSPI de 16 MB (128 Mbit), de la cual MicroPython expone ~88 Mbit en el sistema de archivos después de 4 MB de romfs y 1 MB de firmware Wi-Fi/BT.

Material

Código completo

// 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 apres 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 {}

Verificación esperada

Repetir la lectura 0x03 en LOG_BASE después de un reinicio: la línea sigue presente (no volátil). En MicroPython, la misma zona es accesible mediante os.listdir en el sistema de archivos QSPI — ruta confirmada por el port oficial.

Errores frecuentes

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales