Skip to content

UrowNVM

askn37 edited this page Jan 24, 2024 · 3 revisions

UrowNVM ツールリファレンス

USERROW領域書き換え支援ツール。

  • この支援ツールの機能は namespace UrowNVMに属するメンバー関数として提供される。

BOOTROW 領域は <FlashNVM.h>支援される。

用例

uint8_t buf[USER_SIGNATURES_SIZE];
UrowNVM::userrow_load(&buf);
Serial.printHex((const void *)&buf, sizeof(buf), ' ', 16).ln().ln();

ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
  if ( UrowNVM::userrow_clear()
    && UrowNVM::userrow_save(&buf, sizeof(buf))
  )    Serial.println(F("[success]"));
  else Serial.print(F("*failed* 0x")).println(NVMCTRL_STATUS, ZHEX, 2);
}

USER_SIGNATURES_SIZE の定義値は品種により異なる。

動作電圧

NVM領域消去と書換には十分な電力供給が必要で、不足すると不正な結果になりうる。 書換後にはUrowNVM::userrow_verifyで比較検証するのが好ましい。

操作中少なくとも 2.85V 以上は維持されるべきだ。サーボモーターや無線デバイスを操作している最中にこれらを実行するのは危険である。
一部の製品は低電圧下での NVM消去と書き換え結果が保証されていない。eratta情報を確認すること。

<UrowNVM.h>

依存性:<avr/io.h>

bool UrowNVM::userrow_clear (void)

USERROW 領域を消去する。NVM操作に成功すれば真を返す。

  • USERROW 領域は全体で1ページのフラッシュメモリ領域である。データ保存専用で、コード実行はできない。
  • megaAVR と tinyAVR 系統のみ、一般の EEPROM 領域と同様に 1バイト粒度の書き換えを <avr/eeprom.h> EEPROM 操作ライブラリで行える。

void UrowNVM::userrow_load (void* _data_addr, size_t _save_size = USER_SIGNATURES_SIZE)

USERROW 領域を _data_addr が示すデータメモリに複写する。先頭からのバイト数は _save_size で与える。省略時は USER_SIGNATURES_SIZE 定数の値に従う。NVM操作に成功すれば真を返す。

読み込み開始位置は USERROW 領域先頭(USER_SIGNATURES_START)に固定である。

単に USERROW 領域を読むだけなら、通常のデータ空間メモリ配列と同様に USERROW[n] が利用できる。 この関数はuserrow_saveを使う事前準備としての、構造体に複写したりするショートカットを提供する。

bool UrowNVM::userrow_save (const void* _data_addr, size_t _save_size = USER_SIGNATURES_SIZE)

USERROW 領域へ _data_addr が示すデータメモリ内容で書き換える。先頭からのバイト数は _save_size で与える。省略時は USER_SIGNATURES_SIZE 定数の値に従う。NVM操作に成功すれば真を返す。

書き込み開始位置は USERROW 領域先頭(USER_SIGNATURES_START)に固定である。 この関数はFlashNVM::bootrow_save関数同様に現在値との論理積を結果として残す。つまり事前にuserrow_clear関数で USERROW 領域全体を消去しておく前提だが、現在値を変更したくないバイト値には 0xFF を書くことで追記操作が可能である。

bool UrowNVM::userrow_verify (const void* _data_addr, size_t _save_size = USER_SIGNATURES_SIZE)

USERROW 領域と _data_addr が示すデータメモリ内容で比較一致を試みる。先頭からのバイト数は _save_size で与える。省略時は USER_SIGNATURES_SIZE 定数の値に従う。一致すれば真を返す。

検査開始位置は USERROW 領域先頭に固定である。

/* 比較ベリファイ */
if (UrowNVM::userrow_verify(&nvm_buffer, sizeof(nvm_buffer)))
{ /* success */ }