🛠 Journaliser dans la flash QSPI 16 Mo (pas de slot TF)
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
- Arduino Nicla Vision (flash QSPI en los pines PD11/PF9/PE2/PD13/PF10/PG6 según pins_arduino.h)
- Core ArduinoCore-mbed
- > NO VERIFICADO: referencia exacta del chip QSPI y API Arduino dedicada — el core no expone una biblioteca «SD» utilizable aquí; el código siguiente utiliza la clase QSPI de Mbed con los comandos NOR estándar (write-enable 0x06, erase sector 0x20, page program 0x32, read 0x03) a validar en el chip real.
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
- Buscar una ranura TF: la Nicla Vision no tiene lector de tarjetas; cualquier referencia a SD.h/SdFat está fuera de contexto — utilizar la QSPI (o la flash MCU de 2 MB para registros muy cortos).
- Borrar la zona del firmware de radio: nunca escribir en los primeros 5 MB (romfs + firmware Wi-Fi/BT); un borrado rompe la conectividad (se requiere un reflash DFU completo).
- Olvidar el erase: una página NOR solo se programa de 1 a 0; sin un 0x20 previo, los bytes se combinan con AND con el contenido anterior.
- Escrituras frecuentes: el erase por sector desgasta el chip; registrar en ráfagas (búfer en RAM, escritura cada N líneas).
- Frecuencia QSPI demasiado alta: comenzar a 1 MHz antes de aumentar, según el chip real (> NO VERIFICADO).
Otros tutoriales para esta placa
Ejemplos de código para esta placa
led_rgb.inoArduinoimu_lsm6dsox.inoArduinotof_distance.inoArduinomicro_pdm.inoArduinocamera_capture.inoArduinowifi_scan.inoArduino