2020年8月16日日曜日

おしゃべり時計withUSB開発日誌(7)、NVM

 残念ながらPIC32MXにはEEPROMが無いので、ちょっとしたパラメータを格納する為にプログラムメモリに書き込む事にする。その為に使う機能がNVMだ。今回初めて使うことになるのでちょっとテストしてみた。 


参考資料は下記となる。

  1. 組み込みエンジニア向け MPLAB® XC32 ユーザガイド
  2. セクション 5. フラッシュ プログラミング


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);

}

-------------------------------------------------------------------------------------------


20200814(+6.0h)



2020年8月14日金曜日

おしゃべり時計withUSB開発日誌(6)、printfで2進数表示。

 RTCCのキャリブレーションの設定についてコーディングしたので、デバッグでコンソールに値を2進数で表示したい。

しかしながら、c言語のprintfには、2進数の出力フォーマット指定が無い。

そこでネットでいろいろ調べて下記のよにコーディングを追加して2進数で表示するようにした。

---------------------------------------------------------------------------------------------

void printb(unsigned int val) 

{

    unsigned int mask = (int)1 << (sizeof(int) * 8 - 1);

    do 

    {

        if ( val & mask ){

            xputs("1");

        }

        else{

            xputs("0");

      }

    }

    while (mask >>= 1);

  

}


void putb(unsigned int v) 

{

  xputs("0b"), printb(v), xputs("\n");

}

---------------------------------------------------------------------------------------------


これで、次のようにコーディングすれば、下記のように出力される。
xputs("Cal Value = "); 
putb(RTCCONbits.CAL);



20200730(+2.0)




KT0913 FMラジオの作成(8) 出来上がったPCB基板にミスあり。

  FusionPCB から基板がとどきました。20240121. 1月11日に発注したので10日で出来上がって届きました。 早速組み立てましたがが、イヤホンジャックのフットプリントが裏返っており、痛恨のミス。。。 しかしながら、他にも問題が無いか一通り組み立ててチェックしました...