【Raspberry Pi Pico】Flashメモリの空き領域に設定値保存 (C/C++)
PicoではオンボードのFlashメモリにプログラム[.uf2]を書き込んで動作させますが、大抵の場合はメモリの一番後ろの方は空いているはずです。(メモリをフルに使うようなギリギリのプログラムを作成されているなら別ですが) その空いているFlashメモリの領域は使用できますので、電源が切れても保持しておきたい設定値等を保存することができます。 ※本当はUSB接続によりPicoのマスストレージにテキストファイルをコピーしてPicoで読み書きしたかったのですが、C/C++ではどうやらまだ難しそうでした。(2022/7月現在。MicroPythonならできるかも) 1. Pico基板上のFlashメモリについて 型式: W25Q16JVUXIQ 容量: 16Mbit (16777208bit = 2097151Byte) アドレス: 0x000000 ~ 0x1FFFFF 通信: SPI (Pico C/C++SDK有り) ブロック図 容量は16Mbitで、32ブロックに分かれています。.uf2のプログラムは先頭から書き込まれるため、大抵の場合32ブロック目(Block31)は空き容量となると思います。よってここ(Block31)を電源遮断時でも維持したいデータの保存場所とします。開始アドレスは 0x1F0000 です。 各ブロック自体も16セクタに分かれており、1セクタにつき4kByteとなっています。Flashの消去はこの1セクタ(4kByte)単位で行われ、書き込みは256Byte単位で行われるとのことです。 2. Flashメモリに設定値を書き込む例 用意されているC/C++SDKの関数で簡単に実現できます。アドレスはFlashメモリのアドレスを指定します。 #include <hardware/flash.h> static void save_setting_to_flash(void) { // W25Q16JVの最終ブロック(Block31)のセクタ0の先頭アドレス = 0x1F0000 const uint32_t FLASH_TARGET_OFFSET = 0x1F0000; // W25Q16JVの書き込み最小単位 = FLASH_PAGE_SIZE