残念ながらPIC32MXにはEEPROMが無いので、ちょっとしたパラメータを格納する為にプログラムメモリに書き込む事にする。その為に使う機能がNVMだ。今回初めて使うことになるのでちょっとテストしてみた。
参考資料は下記となる。
NVMは迂闊にプログラムエリアを書き換え出来ないように、フラグを設定したりキーワードを設定したりといろいろ手順が複雑で、またPIC32MX250の場合、消去の単位が1KBytes、書き込む単位が128bytesだったりするのでちょっと面倒くさい。
しかしながら面倒な書き込み手順についてはMCCがコードを出力してくれるのでこれを使えば大丈夫だ。
MCCを使ったNVMの設定は下記の通り。Media Start Addressはデフォルトのままとし、割り込みもチェックしない。
レジスタの設定は、上記1.の資料を参考に赤枠の部分を修正した。
次にデータを書き込むプログラムエリアだが、仮想メモリKSEG0の0x9D000000~0x9D01FFFFに1KBytesを確保しなければならない。当初0x9D01E000あたりを使いたかったのだが、アセンブルリストを確認した所、何やら別の事に使っているようだったので、0x9D018000あたりを使うことにした。
これについて、下記のようにコーディングしてみた。
-------------------------------------------------------------------------------------------
volatile const BYTE __attribute__((address(0x9D000000 + 0x18000))) NVM_ProgramPage[1024] = {
"aaa\n"
};
-------------------------------------------------------------------------------------------
+0x18000についてだが、プログラムが0x14624だったので、そのちょっと後ろのキリの良いあたりにしている。
またMVN_ProgramPageの変数についてだが、当初typedefで型を作って割り当てたのだが、voidのポインターに型変換が出来なかったので、実際にコーディングする時にもう一工夫必要だ。
それで初めて使う機能はやはり躓く部分があるもので、下記のようなコーディングをして試したのだがなぜか上手く動かない。vVNM_Test1, vVNM_Test2 をそれぞれ動かせば、NVM_ProgramPageのエリアが更新されるはずが更新されないのだ。
さんざん悩んだ挙句にはたと思いついて修正したコーディングが下記の通り。
つまり、Program area⇒Program area では上手く機能しないという事。ちょっとテストするつもりの迂闊なコーディングではまってしまい、これで半日つぶしました。
最終的にテストのプログラムは下記の通り。
-------------------------------------------------------------------------------------------
volatile const BYTE __attribute__((address(0x9D000000 + 0x18000))) NVM_ProgramPage[1024] = {
"aaa\n"
};
//******************************************************************************
/**
* @brief NVM TEST .
* @param[in,out]
* @return
* @details
*
*/
void vNVM_Test0 (
)
{
// Erase second page of Program Flash
NVM_ErasePage((void*)NVM_ProgramPage);
}
void vNVM_Test1 (
)
{
BYTE bMsg_NVM1[128] = {
"Hello World!\r\n"
};
// Erase second page of Program Flash
NVM_ErasePage((void*)NVM_ProgramPage);
// Write 128 words starting at Row Address NVM_ProgramPage
NVM_WriteRow((void*)NVM_ProgramPage, (void*)bMsg_NVM1);
}
void vNVM_Test2 (
)
{
BYTE bMsg_NVM2[128] = {
"Check NVM feature\r\n"
};
// Erase second page of Program Flash
NVM_ErasePage((void*)NVM_ProgramPage);
// Write 128 words starting at Row Address NVM_ProgramPage
NVM_WriteRow((void*)NVM_ProgramPage, (void*)bMsg_NVM2);
}
-------------------------------------------------------------------------------------------