klasa Flash – dostęp do wbudowanej pamięci flash

Klasa Flash umożliwia bezpośredni dostęp do podstawowego urządzenia flash w kamerach OpenMV Cam opartych na STM32.

W większości przypadków, aby przechowywać trwałe dane na urządzeniu, lepiej użyć abstrakcji wyższego poziomu, na przykład systemu plików poprzez standardowe API plików Pythona, jednak ten interfejs jest przydatny do dostosowania konfiguracji systemu plików lub zaimplementowania niskopoziomowego systemu pamięci masowej dla własnej aplikacji.

Informacja

OpenMV Cam H7 Plus, Pure Thermal i N6 używają zewnętrznego układu flash SPI/QSPI/XSPI jako pamięci podstawowej; pozostałe kamery OpenMV Cam oparte na STM32 używają wewnętrznej pamięci flash wbudowanej w MCU. Interfejs Pythona jest w obu przypadkach identyczny.

Konstruktory

class pyb.Flash
class pyb.Flash(*, start: int = -1, len: int = -1)

Tworzy urządzenie blokowe zgodne z vfs.AbstractBlockDev dla wbudowanej pamięci flash. Istnieją dwie formy:

  • Flash() (bez argumentów): zwraca starszy obiekt singletonowy, który udostępnia całą pamięć flash z dołączoną na początku wirtualną tablicą partycji. Faktyczne dane flash zaczynają się od bloku 0x100. Ta forma jest przestarzała i zostanie usunięta w przyszłej wersji MicroPython.

  • Flash(start=..., len=...): zwraca nowe urządzenie blokowe, które uzyskuje dostęp do pamięci flash, zaczynając od przesunięcia bajtowego start (domyślnie 0) przez len bajtów (domyślnie: pozostała część urządzenia). Obie wartości muszą być wielokrotnością bazowego rozmiaru bloku (zwykle 512 bajtów dla wewnętrznej pamięci flash; zewnętrzne układy SPI/QSPI/XSPI używają większego rozmiaru sektora kasowania).

Metody

readblocks(block_num: int, buf: bytearray) None
readblocks(block_num: int, buf: bytearray, offset: int) None

Odczytuje bajty z pamięci flash do buf. Dwie przeciążone wersje udostępniają interfejs prosty i rozszerzony:

Forma prosta (readblocks(block_num, buf)): odczytuje całe bloki, zaczynając od indeksu bloku block_num. len(buf) musi być wielokrotnością rozmiaru bloku flash.

Forma rozszerzona (readblocks(block_num, buf, offset)): odczytuje len(buf) bajtów – niekoniecznie całkowitą liczbę bloków – zaczynając od bajtu offset w obrębie bloku block_num. len(buf) nie ma ograniczeń wyrównania. Obsługiwane tylko na obiektach utworzonych z jawnymi argumentami start / len, a nie na przestarzałym singletonie.

writeblocks(block_num: int, buf: bytes | bytearray) None
writeblocks(block_num: int, buf: bytes | bytearray, offset: int) None

Zapisuje bajty z buf do pamięci flash. Dwie przeciążone wersje udostępniają interfejs prosty i rozszerzony:

Forma prosta (writeblocks(block_num, buf)): zapisuje całe bloki, zaczynając od indeksu bloku block_num. len(buf) musi być wielokrotnością rozmiaru bloku flash. Każdy zmieniany blok jest automatycznie kasowany przed zapisem.

Forma rozszerzona (writeblocks(block_num, buf, offset)): zapisuje len(buf) bajtów – niekoniecznie całkowitą liczbę bloków – zaczynając od bajtu offset w obrębie bloku block_num. len(buf) nie ma ograniczeń wyrównania i nie jest wykonywane żadne niejawne kasowanie – wywołujący musi zapewnić, że zmieniane bloki zostały skasowane wcześniejszym wywołaniem ioctl(6, block_num). Obsługiwane tylko na obiektach utworzonych z jawnymi argumentami start / len.

ioctl(cmd: int, arg: int) int | None

Standardowy punkt wejścia ioctl vfs.AbstractBlockDev. Pełną listę wartości cmd opisano w vfs.AbstractBlockDev.ioctl(). cmd=5 zwraca rozmiar bloku flash w bajtach; cmd=6 kasuje blok o indeksie arg.