клас Flash – доступ до вбудованої флеш-пам’яті

Клас Flash надає прямий доступ до основного пристрою флеш-пам’яті на OpenMV Cams на базі STM32.

У більшості випадків для зберігання постійних даних на пристрої доцільно використовувати абстракцію вищого рівня, наприклад файлову систему через стандартний файловий API Python, але цей інтерфейс корисний для налаштування конфігурації файлової системи або реалізації низькорівневої системи зберігання даних у вашому застосунку.

Примітка

OpenMV Cam H7 Plus, Pure Thermal та N6 використовують зовнішній чіп флеш-пам’яті SPI/QSPI/XSPI для основного сховища; інші OpenMV Cams на базі STM32 використовують внутрішню флеш-пам’ять всередині MCU. Python-інтерфейс в обох випадках однаковий.

Конструктори

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

Створює блоковий пристрій, сумісний з vfs.AbstractBlockDev, для вбудованої флеш-пам’яті. Існують дві форми:

  • Flash() (без аргументів): повертає застарілий одиночний об’єкт, що надає доступ до всієї флеш-пам’яті з попередньо доданою віртуальною таблицею розділів. Фактичні дані флеш-пам’яті починаються з блоку 0x100. Ця форма є застарілою і буде видалена у майбутньому випуску MicroPython.

  • Flash(start=..., len=...): повертає новий блоковий пристрій, що надає доступ до флеш-пам’яті починаючи зі зміщення в байтах start (за замовчуванням 0) на len байтів (за замовчуванням: залишок пристрою). Обидва значення мають бути кратні розміру базового блоку (зазвичай 512 байт для внутрішньої флеш-пам’яті; зовнішні SPI/QSPI/XSPI чіпи використовують більший розмір сектора стирання).

Методи

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

Читає байти з флеш-пам’яті у buf. Дві перевантажені форми надають прості та розширені інтерфейси:

Проста форма (readblocks(block_num, buf)): читає цілі блоки починаючи з індексу блоку block_num. len(buf) має бути кратним розміру блоку флеш-пам’яті.

Розширена форма (readblocks(block_num, buf, offset)): читає len(buf) байтів – не обов’язково ціле число блоків – починаючи зі зміщення offset в байтах у блоці block_num. len(buf) не має обмежень на вирівнювання. Підтримується лише для об’єктів, створених із явними аргументами start / len, але не для застарілого одиночного об’єкта.

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

Записує байти з buf у флеш-пам’ять. Дві перевантажені форми надають прості та розширені інтерфейси:

Проста форма (writeblocks(block_num, buf)): записує цілі блоки починаючи з індексу блоку block_num. len(buf) має бути кратним розміру блоку флеш-пам’яті. Кожен задіяний блок автоматично стирається перед записом.

Розширена форма (writeblocks(block_num, buf, offset)): записує len(buf) байтів – не обов’язково ціле число блоків – починаючи зі зміщення offset в байтах у блоці block_num. len(buf) не має обмежень на вирівнювання, і неявне стирання не виконується – викликаючий код повинен заздалегідь переконатись, що задіяні блоки були стерті за допомогою виклику ioctl(6, block_num). Підтримується лише для об’єктів, створених із явними аргументами start / len.

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

Стандартна точка входу ioctl vfs.AbstractBlockDev. Повний список значень cmd наведено у vfs.AbstractBlockDev.ioctl(). cmd=5 повертає розмір блоку флеш-пам’яті в байтах; cmd=6 стирає блок з індексом arg.