60歳からの電子工作ノート

生涯学習として取り組んでいます。

新ペルチェ制御用ボードの試作(ROMのチェックサム)

 マイコンのプログラムが壊れていないか判断するために、電源投入時にチェックサム(CRC)を確認する事があります。プログラムをビルドする際に作成したチェックサムと、マイコン起動時にマイコンで計算したチェックサムを比較します。

図1. チェックサム(CRC)の確認

次の資料を参考にしています。資料1*1、資料2*2、資料3*3

 

ビルド時のCRC

CRCの作成

CRCは、CRC-16-CCITT, MSB-First, 初期値 0xffff, 反転出力、生成多項式x^{16} + x^{12} + x^{5} + 1です。作成されたCRCをROMの先頭番地(0xffc 0000)に置くことにします。CRCの計算範囲を0xfffc 0100~0xffff ff7f としました。

図2. CRCの作成


CRCの記入とセグメント配置

ビルド時のCRCを記載するソースコード(rom_crc_data.c)を作成します。

図3. CRC記入ファイル

またこのコードが、0xfffc 0000から配置されるように、リンク・オプションのセクション開始アドレスを設定します。(本テスト用のセクション設定ファイル  *.hsi のインポートでも可能です。)

図4. セクション開始アドレスの設定

・ビルド

ビルド後CRC値が表示されます。( 図2の -VERBOSE=CRC

図5. ビルド時のCRC

この値を、rom_crc_data.cへ転記します。

図6. ビルド後のCRCの記入


mapファイルで指定したアドレスに割り付いている事を確認します。

図7. mapファイルによる配置アドレスの確認

マイコンによるCRC計算

CRC演算器を使用します。CRC-16-CCITT, MSB-First, 初期値 0xffff, 生成多項式x^{16} + x^{12} + x^{5} + 1  演算器によるCRC計算後、値を反転させています。

確認テスト

エミュレータ(E2-Lite)デバックします。CS+よりE2-Liteでダウロードすると、0xffff ff88~0xffff ff8bにあるオプション機能選択レジスタ1(OFS1) のb24が強制的に0となります。(資料3より) デバックツールと接続中は、b24=0が継続しているようです。 このため、CRCの計算には、0xffff ff80~0xffff ffffは含めていません。

図8. 0xffff ff80~0xffff ffffの領域(CRC計算に含めない)


rom_crc_dataが正常値ならばアラームは点滅しません。正常値以外を書き込んで実行すると、ALM1が点滅しました。

・CS+バージョン:

        CS+ for CC V8.09.00 [12 Dec 2022]

ファイル一覧

図9   ファイル一覧

GitHub登録場所: https://github.com/vABCWork/test_rom_crc


補足 (可変ベクタ空き領域のアドレス設定)

割り込み処理(int_prg.c)で未定義の処理 があります。例えばvect=1~15は定義されていません。

図 10. 未定義の割込み処理(int_prg.c)

「リンク・オプション」で、可変ベクタ空き領域のアドレスを設定すると、未定義箇所にアドレス(処理プログラムの先頭アドレス)を登録できます。

図11. 可変ベクタの空アドレスの定義(_Excep_BRK)

mapファイルにより、ベクタテーブルのベクタ番号に実行アドレスが登録されているのがわかります。またテーブルの配置アドレスも確認できます。

図12. 割り込みベクタテーブルの登録アドレスとテーブル配置アドレス(mapファイルより)

E2-Liteで実行させると、割り込みテーブルレジスタ(INTB)に割り込みベクタ先頭アドレスが入っています。そのテーブルの内容を見ると、割り込み処理プログラムの先頭アドレスが登録されています。

図13. 割り込みテーブルレジスタ(INTB)とテーブルの内容

  これに対して可変ベクタ空き領域のアドレス設定 を空欄とした場合、ベクタテーブルのベクタ番号に実行アドレスは登録されません。登録されていない箇所には0x0000 0000が入ります。

図14. 可変ベクタ空き領域のアドレス「空欄」設定の場合

図15. 割り込みベクタテーブルの登録アドレス(空欄あり)とROMの内容

この場合、もしCPUが誤動作してvect番号=1 が実行されると、PC(プログラムカウンタ)は0000 0000となり、0000 0000にある命令語、初期化されてないRAMの値が命令語として実行される可能性があります。

 本テストでは、未登録アドレスは全て_Excep_BRKとして、ベクタ番号0の処理と同じにしています。

図16. ベクタ番号 0の処理

修正(2023年5月23日)

 Githubに登録していある int_prg.c で、vect=199とvect=200の処理内容が dma.cで定義と記入してありますが、本内容ではdma.cはありません。下記のように修正します。

修正後のチェックサムは異なります。

図17. 修正(int_prg.c)

 

*1:資料1「RX23E-Aグループ ユーザーズマニュアル ハードウェア編 ( R01UH0801JJ0120 Rev.1.20)」

*2:資料2「CC-RX コンパイラ ユーザーズマニュアル(R20UT3248JJ0112 Rev.1.12)」

*3:資料3「リンケージエディタとCRC演算器のCRC-CCITT結果の違い」 https://ja-support.renesas.com/knowledgeBase/17796715